Docker 常用命令

帮助命令

docker version       # 显示 docker 的版本信息
docker info          # 显示 docker 的系统信息,包括镜像和容器的数量
docker 命令 --help    # 帮助命令,如 docker images --help


镜像命令

docker images    查看镜像( 列出本地镜像 )

webpiece@1205 ~ % docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    eeb9db34b331   6 months ago   134MB

# 解释
  REPOSITORY  镜像的名称( 镜像的仓库源 )
  TAG         镜像的版本标签,用来区分不同发行版本,如果不指定标记,则默认使用latest标记信息
  IMAGE ID    镜像ID,如果镜像ID相同,则说明是同一镜像
  CREATED     镜像的创建时间
  SIZE        镜像的大小

# 命令格式:docker images [镜像名称]      // 省略镜像名称,则列出所有本地镜像
# 可选项
  -a, --all             列出所有的本地镜像( 包括已经删除的镜像记录 )
  -q, --quiet           只显示镜像ID

docker search  搜索镜像

# 作用:搜索 Docker Hub( 镜像仓库 )上的镜像
webpiece@1205 ~ % docker search mysql
NAME               DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql              MySQL is a widely used, open-source relation…   12906     [OK]       
mariadb            MariaDB Server is a high performing open sou…   4950      [OK] 

# 命令格式:docker search [镜像名称]
# 可选项
  --filter=STARS=5000  // 通过搜索来过滤,收藏数大于5000

  webpiece@1205 ~ % docker search mysql --filter=STARS=5000
  NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
  mysql     MySQL is a widely used, open-source relation…   12906     [OK]

# 说明
# NAME 名称;DESCRIPTION 基本功能描述;STARS 下载次数;OFFICIAL 官方;AUTOMATED 自动的运行

docker pull  获取镜像

# 作用:从远程仓库( 如,Docker Hub )中获取镜像
# 命令格式 docker pull 镜像名[:tag]

// 代码示例
webpiece@1205 ~ % docker pull mysql
Using default tag: latest    // 如果不写tag,默认就是latest
latest: Pulling from library/mysql
latest: Pulling from library/mysql
e5d41499b404: Pull complete     // 分层下载,docker images 的核心:联合文件系统
c14e53563050: Pull complete 
024772013ffd: Pull complete 
1e0914c16b38: Pull complete 
71713f7372e7: Pull complete 
a0c96e0313eb: Pull complete 
abbb3361f75b: Pull complete 
857f6a6ae507: Pull complete 
7ac3d9a78b39: Pull complete 
a07911c3362f: Pull complete 
fce3f4951dff: Pull complete 
Digest: sha256:152cf187a3efc56afb0b3877b4d21e231d1d6eb828ca9221056590b0ac834c75  // 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest  // 真实地址( docker pull mysql 等价于 docker pull docker.io/library/mysql:latest )

// 指定版本下载
  webpiece@1205 ~ % docker pull mysql:8.0
  8.0: Pulling from library/mysql
  8.0: Pulling from library/mysql
  Digest: sha256:152cf187a3efc56afb0b3877b4d21e231d1d6eb828ca9221056590b0ac834c75
  Status: Downloaded newer image for mysql:8.0
  docker.io/library/mysql:8.0

# 另,获取的镜像,在哪里 ?
// /var/lib/docker 目录下
// 操作下面的文件,可以查看相关的镜像信息
// vim /var/lib/docker/image/overlay2/repositories.json

docker tag  重命名 / 复制镜像

# 作用:对本地镜像的 NAME 和 TAG,进行重命名,并产生一个新的命名后镜像
# 命令格式:docker tag [老镜像名称]:[老镜像版本][新镜像名称]:[新镜像版本]

// 代码示例
[root@centos7 overlay2]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
nginx        latest    0c404972e130   9 days ago   135MB
[root@centos7 overlay2]# docker tag nginx:latest nginx:1205
[root@centos7 overlay2]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
nginx        1205      0c404972e130   9 days ago   135MB
nginx        latest    0c404972e130   9 days ago   135MB

docker rmi  删除镜像                                  // rmi,即 remove images

# 作用:删除本地的一个或多个镜像
webpiece@1205 ~ % docker images    // 查看镜像
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
mysql        latest    02662e079c08   10 days ago    482MB
nginx        latest    eeb9db34b331   6 months ago   134MB

# 命令格式:
docker rmi [命令参数][镜像ID]
docker rmi [命令参数][镜像名称]:[镜像版本]

webpiece@1205 ~ % docker rmi -f 02662e079c08    // 删除指定镜像
webpiece@1205 ~ % docker rmi -f 镜像ID 镜像ID 镜像ID    // 删除多个镜像
webpiece@1205 ~ % docker rmi -f $(docker images -aq)  // 删除全部镜像

# 说明:如果一个image_id存在多个名称,那么应该使用 名称:版本 的格式,删除镜像
[root@centos7 overlay2]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
nginx        1205      0c404972e130   9 days ago   135MB
nginx        latest    0c404972e130   9 days ago   135MB
[root@centos7 overlay2]# docker rmi nginx:1205
Untagged: nginx:1205
[root@centos7 overlay2]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
nginx        latest    0c404972e130   9 days ago   135M

docker history  查看镜像历史分层信息

# 作用:查看一个本地镜像的历史分层信息
# 命令格式:
docker history [镜像名称]:[镜像版本]
docker history [镜像ID]

// 如果想知道一个本地镜像,默认启动了哪些命令或者都封装了哪些系统层,
// 可以使用 docker history 这条命令来获取我们想要的信息
[root@centos7 ~]# docker history nginx
IMAGE          CREATED      CREATED BY                                      SIZE      COMMENT
0c404972e130   9 days ago   /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon…   0B        
<missing>      9 days ago   /bin/sh -c #(nop)  STOPSIGNAL SIGQUIT           0B
...

# 说明:IMAGE 编号;CREATED 创建时间;CREATED BY 基于哪些命令创建的;SIZE 大小;COMMENT 评论

docker inspect  查看镜像详细信息

# 作用:查看本地一个或多个镜像的详细信息
# 命令格式:
docker image inspect [命令参数] [镜像名称]:[镜像版本] 
docker inspect [命令参数] [镜像ID]

// 查看镜像详细信息
[root@centos7 ~]# docker inspect nginx

// 查看容器网络信息
[root@centos7 ~]# docker ps 
CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS                vigorous_rubin
42f6039f2034   centos         "/bin/bash"   32 minutes ago   Up 32 minutes             affectionate_tharp
[root@centos7 ~]# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 42f6
172.17.0.2
// 查看容器端口信息
[root@centos7 ~]# docker port 42f6

容器命令

// 前提:下载一个 centos 镜像,有了镜像,才可以创建容器
   webpiece@1205 ~ % docker pull centos
   Using default tag: latest
   latest: Pulling from library/centos
   52f9ef134af7: Pull complete 
   Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
   Status: Downloaded newer image for centos:latest
   docker.io/library/centos:latest

docker ps    查看所有( 正在 )运行的容器

# 作用:显示 Docker 容器列表
// 命令格式:docker ps
// 可选项
-a       // 查看所有正在运行的容器 + 历史运行过的容器
-n=?     // 查看最近常见的容器
-q       // 只显示容器的ID

// 说明:CONTAINER ID 容器ID;IMAGE 基于哪个镜像;COMMAND 运行镜像使用了哪些命令;CREATED 创建时间;PORTS 端口号;NAMES 容器名称,默认是随机的
// 管理 Docker 容器,可以通过名称,也可以通过 ID

webpiece@1205 ~ % docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
webpiece@1205 ~ % docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS                       PORTS     NAMES
a237ab7c5251   centos    "/bin/bash"              4 minutes ago   Exited (127) 2 minutes ago             infallible_goldberg
74d32f599ef1   nginx     "/docker-entrypoint.…"   10 days ago     Exited (255) 6 days ago      80/tcp    helloworld
975595911c3c   nginx     "/docker-entrypoint.…"   10 days ago     Exited (127) 10 days ago               vigilant_ganguly
9d0afa85b716   nginx     "/docker-entrypoint.…"   10 days ago     Exited (0) 10 days ago                 charming_shtern
36af166c23d2   nginx     "/docker-entrypoint.…"   10 days ago     Exited (255) 6 days ago      80/tcp    sweet_zhukovsky
webpiece@1205 ~ % docker ps -a -n=1
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                       PORTS     NAMES
a237ab7c5251   centos    "/bin/bash"   7 minutes ago   Exited (127) 5 minutes ago             infallible_goldberg

docker create  创建待启动容器

# 作用:利用镜像,创建一个 Created 状态的待启动容器
# 命令格式:docker create [参数命令] 依赖镜像 [容器内命令] [命令参数]
# 命令参数:
-t, --tty  分配一个伪TTY,也就是分配虚拟终端
-i, --interactive  即使没有连接,也要保持STDIN打开
--name  为容器起名,如果没有指定将会随机产生一个名称
COMMAND 表示容器启动后,需要在容器中执行的命令,如ps、ls 等命令
ARG  表示执行 COMMAND 时需要提供的一些参数,如ps 命令的 aux、ls命令的-a等等

// 代码示例
[root@centos7 ~]# docker create --name nginx1 nginx
[root@centos7 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@centos7 ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS    PORTS     NAMES
95e3c9e48c9a   nginx     "/docker-entrypoint.…"   6 seconds ago   Created             nginx1

docker rm    删除容器

docker rm 容器ID    // 删除特定容器
docker rm -f $(docker ps -aq)    // 删除所有的容器
// 参数说明:
// -f  强制删除

webpiece@1205 ~ % docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                        PORTS     NAMES
bb41acc2e491   centos    "/bin/bash"              2 minutes ago    Up 2 minutes                            dazzling_lederberg
50123540025e   centos    "/bin/bash"              2 minutes ago    Exited (0) 2 minutes ago                heuristic_ramanujan
54642b05eeae   centos    "/bin/bash"              3 minutes ago    Exited (0) 3 minutes ago                lucid_solomon
3df7ba61aa21   centos    "/bin/bash"              3 minutes ago    Exited (0) 3 minutes ago                youthful_wiles
a237ab7c5251   centos    "/bin/bash"              15 minutes ago   Exited (127) 14 minutes ago             infallible_goldberg
74d32f599ef1   nginx     "/docker-entrypoint.…"   10 days ago      Exited (255) 6 days ago       80/tcp    helloworld
975595911c3c   nginx     "/docker-entrypoint.…"   10 days ago      Exited (127) 10 days ago                vigilant_ganguly
9d0afa85b716   nginx     "/docker-entrypoint.…"   10 days ago      Exited (0) 10 days ago                  charming_shtern
36af166c23d2   nginx     "/docker-entrypoint.…"   10 days ago      Exited (255) 6 days ago       80/tcp    sweet_zhukovsky
webpiece@1205 ~ % docker rm 50123540025e
50123540025e
// 不能删除正在运行的容器,如果要强制删除,可以使用 -f
webpiece@1205 ~ % docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
bb41acc2e491   centos    "/bin/bash"   4 minutes ago   Up 4 minutes             dazzling_lederberg
webpiece@1205 ~ % docker rm bb41acc2e491
Error response from daemon: You cannot remove a running container bb41acc2e491331c9befbba1c724b60d6eeada573dcd57ab9304d4e226e37679. Stop the container before attempting removal or force remove
webpiece@1205 ~ % docker rm -f bb41acc2e491
bb41acc2e491

启动、进入和停止容器

docker start 容器ID      // 启动容器
docker restart 容器ID    // 重启容器
docker stop 容器ID       // 停止正在运行的容器
docker kill 容器ID       // 强制停止当前容器

docker pause 容器ID      // 暂停容器
docker unpause 容器ID      // 取消暂停( 恢复 )容器

「 启动容器 」启动容器,有三种方式:

  • 启动待启动或已关闭的容器
# 作用:将一个或多个处于创建状态或关闭状态的容器,启动起来
# 命令格式:docker start [容器名称]或[容器ID]
# 命令参数( options ):
   -a, --attach 将当前shell的 STDOUT/STDERR 连接到容器上
   -i, --interactive 将当前shell的 STDIN连接到容器上

// 代码示例
[root@centos7 ~]# docker start nginx1
  • docker run  基于镜像,创建容器,并启动
    • docker run -d  守护进程的方式,启动容器             // -d,以后台方式运行;-it,以交互模式运行
# 作用:基于镜像,创建,并启动一个容器
docker run [可选参数] image [执行的命令]  // docker run,其实是 docker create 和 docker start 两个命令的集合体
 
// 参数说明
--name="NAME"     容器名字,如 centos1  centos2  用来区分容器
-d                后台方式运行
-it               使用交互方式运行,进入容器查看内容
-p                指定容器的端口,如  -p 8080:8080
    -p ip:主机端口:容器端口
    -p 主机端口:容器端口          // 常用
    -p 容器端口
    容器端口
-P                随机指定端口

# 代码示例 1
webpiece@1205 ~ % docker run -it centos /bin/bash
[root@a237ab7c5251 /]# ls    // 查看容器内的centos
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@a237ab7c5251 /]# docker images    // 基础版本,很多命令是不全的
bash: docker: command not found
[root@a237ab7c5251 /]# exit          // 退出( 容器停止并推出 )
// 另,使用快捷键 Ctrl + P + Q ,容器不停止退出

# 代码示例 2
// 更多的时候,我们需要让 Docker 容器,在后台以守护形式运行
// 此时,可以通过添加 -d 参数来实现
# 命令格式:docker run -d [image_name] command ...
[root@centos7 ~]# docker run -d --name nginx2 nginx

// 另 - bug,以后台方式运行centos,使用docker ps查看,发现并没有运行(停止了)
// 常见的坑,docker 容器使用后台运行,就必须要有一个前台进程,如果docker发现没有应用,就会自动停止
// 可以以交互模式启动 docker run -it centos ,然后不停止容器退出,Ctrl + P + Q
webpiece@1205 ~ % docker run -d centos
74560b6b0f4d6c7ae553620df14edbe2b86bfd3e64a7272702e41b2e3b2bb356
webpiece@1205 ~ % docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

「 进入和退出容器 」

  • 创建时,进入容器
// docker run --name [container_name] -it [docker_image] /bin/bash
// 参数说明:
   --name  给容器定义一个名称
   -i  让容器的标准输入保持打开
   -t  让docker分配一个伪终端,并绑定到容器的标准输入上
   /bin/bash  执行一个命令

简单来说,-it,以交互模式运行容器;-d,以后台模式运行容器

// 代码示例
[root@centos7 ~]# docker run -it --name "nginx3" nginx /bin/bash
root@0ad48849905b:/# echo "helloworld"
helloworld
# 退出容器:方法一 exit  方法二 Ctrl+D
root@0ad48849905b:/# exit
exit

  • 手动方式,进入容器
// 通常,容器都是以后台的方式运行的,如果需要改一些配置,如何进入容器呢 ?

// 方式 1( 推荐 ):docker exec -it 容器ID bashshell  // 进入容器后,开启一个新的终端,可以在里面操作

webpiece@1205 ~ % docker exec -it f1c648c6cbb0 /bin/bash
[root@f1c648c6cbb0 /]# 

// 方式 2:docker attach 容器ID         // 进入容器正在运行的终端,不会启动新的进程
webpiece@1205 ~ % docker attach f1c648c6cbb0
[root@f1c648c6cbb0 /]#
  • 生产方式,进入容器
// 生产中,常用的进入容器方法是:使用脚本,脚本内容如下

#!/bin/bash
#定义进入仓库函数 docker_in(){ NAME_ID=$1
  PID=$(docker inspect --format {{.State.Pid}} $NAME_ID)
  nsenter --target $PID --mount --uts --ipc --net --pid
}
docker_in $1

// 直接执行的话,是没有执行权限的,所以,需要赋值权限
#赋权执行
$ chmod +x docker_in.sh # 进入指定容器,并测试
$ ./docker_in.sh 95e3c9e48c9a

「 容器文件拷贝 」                // 拷贝,是一个手动过程,后续可以使用容器卷技术,实现容器和宿主机的互通

// 无论容器是否开启,都可以拷贝
docker cp 容器ID:容器内路径 容器外路径            // 从容器内拷出
docker cp 容器外路径 容器ID:容器内路径            // 从外部拷贝到容器内

// 测试 1:从容器拷贝到宿主机
webpiece@1205 /home % docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED        STATUS         PORTS     NAMES
f1c648c6cbb0   centos    "/bin/bash"   19 hours ago   Up 4 minutes             hungry_mayer
// 进入容器
webpiece@1205 /home % docker exec -it f1c6 /bin/bash
[root@f1c648c6cbb0 /]# cd home
[root@f1c648c6cbb0 home]# touch test.js
// 新建一个test.js文件
[root@f1c648c6cbb0 home]# ls
test.js
// 退出容器
[root@f1c648c6cbb0 home]# exit
exit
// 没有文件操作权限
webpiece@1205 /home % docker cp f1c648c6cbb0:/home/test.js /home
open /System/Volumes/Data/home/test.js: operation not supported
// 重新拷贝到有权限的目录下
webpiece@1205 idea % docker cp f1c648c6cbb0:/home/test.js /Users/webpiece/idea

// 测试 2:从宿主机拷贝到容器
webpiece@1205 idea % touch hello.js
webpiece@1205 idea % ls
dcps		demo		hello.js	meilan		micro_service	project		sth		svn-project	web		webpiece
webpiece@1205 idea % docker cp /Users/webpiece/idea/hello.js f1c648c6cbb0:/home                                                             
webpiece@1205 idea % docker attach f1c648c6cbb0
[root@f1c648c6cbb0 /]# cd /home
[root@f1c648c6cbb0 home]# ls
hello.js  test.js
[root@f1c648c6cbb0 home]#

其他命令


docker logs 查看容器的运行日志

docker logs -tf 容器ID                 // 查看所有容器日志
docker logs -tf --tail 10 容器ID       // 显示指定行数的日志

docker top 查看容器中的进程信息

webpiece@1205 ~ % docker top f1c648c6cbb0                
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                3970                3945                0                   13:09               ?                   00:00:00            /bin/bash
root                4017                3945                0                   13:10               ?                   00:00:00            /bin/bash

docker inspect 查看容器的详细信息

webpiece@1205 ~ % docker inspect f1c648c6cbb0
[
    {
        "Id": "f1c648c6cbb0b6d658f933db6d14e4ad9fe054966c90a86a09b5e87932baeab5",
        "Created": "2022-07-23T13:05:52.327584834Z",
        ...

// 查看容器网络信息:
$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' f1c648c6cbb0

// 查看容器端口信息
$ docker port f1c648c6cbb0   // 没有效果,没有和宿主机关联

docker rename  给容器重命名

# 作用:修改容器的名称
# 命令格式:docker rename [容器id]或[容器名称] [容器新名称]
[root@centos7 ~]# docker rename 95e3c9e48c9a nginx6