• Post author:
  • Post category:docker
  • Post comments:0评论
1

1、创建容器

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

  这个命令选项倒是很多,但是只创建并不启动,一般用于新建一个容器时对它提前进行配置。它的选项和 run 差不多,这里就不列举了,因为有些选项搭配是看不到效果的,下面用 run 列举,它们选项用法基本一致。详情的话可以看帮助文档(–help)和官方文档。

2、新建并启动容器(重点)

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

选项 含义
-d, –detach 在后台运行容器,会返回容器id。
-i, –interactive 保持打开标准输入
-t, –tty 为容器分配一个伪输入终端
–name 指定容器的名称
-p, –publish 把本地主机指定端口映射到容器端口上
-P, –publish-all 把本地主机随机端口映射到容器内部开放端口上
-v, –volume 绑定挂载卷,可以挂载卷也可以将本地主机的目录映射到容器内部。
–link 链接容器
–rm 容器退出后自动删除,不能和-d一起用
–network 为容器指定连接到一个网络
–restart 容器的重启策略,有always、no、on-failure、on-failure:、nless-stopped 。

以上这里列举的为基本常用的,详细自行–help。

例:
  创建并启动一个容器。一般 -it 选项要一起用,表示保持打开容器的标准输出,并分配一个伪终端到容器的标准输入上。单独使用 -i 是没问题,但是标准输入格式不理想,而单独使用 -t 会无法识别输入的命令。

root@cp:~# docker run -it centos
[root@bda97134144e /]# ls
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
[root@bda97134144e /]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.5  0.0  12024  3376 pts/0    Ss   07:00   0:00 /bin/bash
root         18  0.0  0.0  44632  3376 pts/0    R+   07:00   0:00 ps aux
[root@bda97134144e /]# exit
root@cp:~# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                     PORTS     NAMES
bda97134144e   centos    "/bin/bash"   25 seconds ago   Exited (0) 6 seconds ago             condescending_shockley

  但是退出后发现容器并没有运行,这是因为执行 exit 会退出当前的 bash进程,而对于容器来说必须有一个前台执行的进程容器才会运行。我们可以看到上面容器就运行了一个 bash 进程,退出了容器也会跟着自动退出。其实当容器中的应用退出后,那么容器的使命也完成了,也就没有继续运行的必要了。
  我们可以加 -d 选项让容器后台运行,这样只会返回一串唯一的id,而不会直接进入容器,这样 bash 进程会一直保持运行。当然单独使用 -d,因为没有前台进程,容器启动后状态会是退出状态,而且也启动不了,一般和 -it 一起用。
  当然,这里有一个小技巧,如果像上例样去创建启动一个容器,我们可以使用 ctrl+p+q 组合键来进行退出,这样容器是不会终止,不要用 exit 和 ctrl+d 容器就不会终止。

root@cp:~# docker run -itd --name test centos
0a48d5a57cc072be2138d1edd8e7b90dfe3c76c934048455f9e4f509a381930b

root@cp:~# docker ps -a     // 列出容器
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS     NAMES
0a48d5a57cc0   centos    "/bin/bash"   3 seconds ago    Up 2 seconds                          test
bda97134144e   centos    "/bin/bash"   20 minutes ago   Exited (0) 19 minutes ago             condescending_shockley


  使用 -p 选项把本地主机指定端口映射到容器端口上,我们把本地的 10000 端口映射到容器 80 端口上。这样我们就可以通过访问本机的 1000 端口来访问容器的 80 端口了,不然容器外部(本地主机除外)是无法通过网络来访问容器内的应用和服务的。

root@cp:~# docker run -itd -p 10000:80 --name test1 centos:latest
dd89ba3d1bdd318c2286490b424d9e0f10de472cdfe40574a836e1b5de41830b

root@cp:~# docker ps -a
CONTAINER ID   IMAGE           COMMAND       CREATED         STATUS         PORTS                   NAMES
dd89ba3d1bdd   centos:latest   "/bin/bash"   7 seconds ago   Up 5 seconds   0.0.0.0:10000->80/tcp   test1

还可以将指定地址的端口映射到容器端口上。

root@cp:~# docker run -itdp 192.168.18.25:10000:80 ubuntu:latest
1a79ce17ce8947d7a4ea906d6ff4754764abab182fc71672767ef6dc04298d10

root@cp:~# docker ps -a
CONTAINER ID   IMAGE           COMMAND       CREATED          STATUS          PORTS                     NAMES
483bee377542   centos:latest   "/bin/bash"   20 seconds ago   Up 19 seconds   10.0.0.10:10001->80/tcp   test2
dd89ba3d1bdd   centos:latest   "/bin/bash"   6 minutes ago    Up 6 minutes    0.0.0.0:10000->80/tcp     test1

不指定端口会随机分配一个端口映射到容器中,可以在后面指定协议。

root@cp:~# docker run -itd -p ::80/tcp centos:latest 
e4e96f25063ac06c75b8f3a001bcad3225629962906ed7ac0e4be6b8ef1b2f81

root@cp:~# docker ps -a
CONTAINER ID   IMAGE           COMMAND       CREATED         STATUS         PORTS                     NAMES
e4e96f25063a   centos:latest   "/bin/bash"   2 seconds ago   Up 2 seconds   0.0.0.0:49153->80/tcp     elegant_boyd

  使用 -P 选项可以把本地主机随机端口映射到容器内部开放端口上。这里我们使用 nginx 镜像创建容器,创建的容器内部默认会开放暴露 80 端口。

root@cp:~# docker run -itd nginx
2a081513d2cfeb2493aec3c168a0714afad72f04951966cc4fd176c17c7a9dfb
root@cp:~# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS              PORTS     NAMES
2a081513d2cf   nginx     "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp    adoring_benz

root@cp:~# docker run -itd -P --name web nginx
a21e02bf5bdb1b89930c1ba4e55d6fad703b6aff9dd636b45a326af80795c9ef
root@cp:~# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                   NAMES
a21e02bf5bdb   nginx     "/docker-entrypoint.…"   3 seconds ago   Up 2 seconds   0.0.0.0:49155->80/tcp   web
2a081513d2cf   nginx     "/docker-entrypoint.…"   6 minutes ago   Up 6 minutes   80/tcp                  adoring_benz
root@cp:~# curl 10.0.0.10:49155
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
......

注:随机映射端口时,docker 会随机映射一个 49000 – 49900 范围内的端口到容器内部端口上。

使用 -v 选项将本地主机的目录映射到容器内部目录上。

root@cp:~# docker run -itd -P -v /web:/usr/share/nginx/html --name web nginx
fd40d6552eb79a29d2ff9d3cdb5c5ed2913b8bab43719efb48f3156fe7c34355

root@cp:~# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                   NAMES
fd40d6552eb7   nginx     "/docker-entrypoint.…"   6 seconds ago   Up 5 seconds   0.0.0.0:49159->80/tcp   web
root@cp:~# curl 10.0.0.10:49159
test


  –link 选项可以将一个容器链接到一个容器上,其实主要就是添加要链接容器的主机映射信息(注意是容器名称和其ip的对应)到容器的 /etc/hosts 文件中。像下面将 test3 容器链接到 test2 容器上后,test3 的 /etc/hosts 文件下会有 test2 的主机映射信息,这样我们就可以通过容器名称去访问。例如我们可以将多个 web 容器链接到 db 容器上,这样程序就可以通过容器名称去连接数据库。格式:–link 容器名字:别名。
  下面我们可以通过实验来验证一下,先创建容器 test1 和 test2,可以看到 test1 可以 ping 通 test2 的ip,但是 ping 不通 test2 的容器名称。然后创建容器 test3 并将它链接到 test2,可以看到 test3 可以 ping 通 test2 的容器名称。

root@cp:~# docker run -itd --name test1 centos
eda556b8420f191edb3a9ccffe41afbe1a5854332f36380956c5de541ee00b1e
root@cp:~# docker run -itd --name test2 centos
106b982fb46f1905d6907fdab593142971019fefc584a640d7943e5bfade9493
root@cp:~# docker inspect -f "{{ .NetworkSettings.Networks.bridge.IPAddress }}" test2
172.17.0.3
root@cp:~# docker exec test1 ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.064 ms
^C
root@cp:~# docker exec test1 ping test2
ping: test2: Name or service not known

root@cp:~# docker run -itd --name test3 --link test2:test2  centos
efd892eed5a69a927154cde5d99b5355b50bf3dfbaec48432f9001a18ecc5547
root@cp:~# docker exec test3 bash -c "tail -n2 /etc/hosts;echo "";ping test2"
172.17.0.3  test2 106b982fb46f
172.17.0.4  efd892eed5a6

PING test2 (172.17.0.3) 56(84) bytes of data.
64 bytes from test2 (172.17.0.3): icmp_seq=1 ttl=64 time=0.048 ms
^C


–restart 选项可以定义容器退出后的重启策略,有以下五种策略:

 • no:默认策略,在容器退出时不重启容器。
 • on-failure:在容器非正常退出(退出状态非0)时,才会重启容器。
 • on-failure:x:在容器非正常退出时重启容器,最多重启x次。
 • always:在容器退出时总是重启容器。
 • unless-stopped:在容器退出时总是重启容器,除非手动 stop 停止的容器。

这样我们可以让容器跟着 docker 守护进程开机自启,实现容器的开机自启。

root@cp:~# docker run -it --restart always --name test1 centos   # 使用always策略
[root@59288dd74012 /]# exit
root@cp:~# docker run -it --restart unless-stopped --name test2 centos  # 使用unless-stopped策略
[root@a2a0b7ec2fdc /]# exit
root@cp:~# docker run -it --name test3 centos   # 不定义重启策略
[root@e113e699e12b /]# exit
root@cp:~# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED              STATUS                     PORTS     NAMES
e113e699e12b   centos    "/bin/bash"   4 seconds ago        Exited (0) 2 seconds ago             test3
a2a0b7ec2fdc   centos    "/bin/bash"   48 seconds ago       Up 44 seconds                        test2
59288dd74012   centos    "/bin/bash"   About a minute ago   Up 59 seconds                        test1
root@cp:~# docker start test3       # 启动test3,等下进行对比
test3
root@cp:~# systemctl restart docker     # 可以看到test1和test2跟着docker重启了
root@cp:~# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED              STATUS                      PORTS     NAMES
e113e699e12b   centos    "/bin/bash"   34 seconds ago       Exited (0) 32 seconds ago             test3
a2a0b7ec2fdc   centos    "/bin/bash"   About a minute ago   Up 1 second                           test2
59288dd74012   centos    "/bin/bash"   About a minute ago   Up 1 second                           test1

# always(test1使用)和unless-stopped(test2使用)两重启策略对比
# 可以看到手动停止的test2容器并没有重启
root@cp:~# docker stop test1 test2
test1
test2
root@cp:~# systemctl restart docker
root@cp:~# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS     NAMES
a2a0b7ec2fdc   centos    "/bin/bash"   13 minutes ago   Exited (0) 11 seconds ago             test2
59288dd74012   centos    "/bin/bash"   13 minutes ago   Up 1 second                           test1

3、列出容器

docker ps [OPTIONS]

选项 含义
-a, –all 显示所有容器(默认显示为正在运行)
-f, –filter filter 根据提供的条件过滤输出内容
–format string 使用Go模板打印出指定格式的输出信息
-n, –last int 显示n个最后创建的容器(包括所有状态)
-l, –latest 显示最新创建的容器
–no-trunc 不截断输出信息
-q, –quiet 仅输出容器id
-s, –size 显示总文件大小

例:
使用 -a 选项显示所有容器。

root@cp:~# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS     NAMES
684764c97204   nginx     "/docker-entrypoint.…"   2 seconds ago    Up 1 second                 80/tcp    web
e113e699e12b   centos    "/bin/bash"              34 minutes ago   Exited (0) 31 minutes ago             test3
a2a0b7ec2fdc   centos    "/bin/bash"              35 minutes ago   Exited (0) 21 minutes ago             test2
59288dd74012   centos    "/bin/bash"              35 minutes ago   Up 21 minutes                         test1

-f 选项可以根据提供的条件过滤输出内容,支持过滤的选项挺多,下面就列举几个。

root@cp:~# docker ps -f  
ancestor=  exited=    health=    is-task=   name=      publish=   status=    
before=    expose=    id=        label=     network=   since=     volume= 

使用 name 匹配容器名称,过滤容器名称以 w 开头的和包含 3 的容器。

root@cp:~# docker ps -a -f name=^w
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
684764c97204   nginx     "/docker-entrypoint.…"   35 seconds ago   Up 34 seconds   80/tcp    web
root@cp:~# docker ps -a -f name=3
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS     NAMES
e113e699e12b   centos    "/bin/bash"   35 minutes ago   Exited (0) 31 minutes ago             test3

使用 status 匹配容器状态。

root@cp:~# docker ps -a -f status=running 
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
684764c97204   nginx     "/docker-entrypoint.…"   59 seconds ago   Up 58 seconds   80/tcp    web
59288dd74012   centos    "/bin/bash"              36 minutes ago   Up 22 minutes             test1
root@cp:~# docker ps -a -f status=exited 
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS     NAMES
e113e699e12b   centos    "/bin/bash"   35 minutes ago   Exited (0) 32 minutes ago             test3
a2a0b7ec2fdc   centos    "/bin/bash"   36 minutes ago   Exited (0) 22 minutes ago             test2

使用 ancestor 匹配容器基于的镜像。

root@cp:~# docker ps -a -f ancestor=centos
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS     NAMES
e113e699e12b   centos    "/bin/bash"   36 minutes ago   Exited (0) 32 minutes ago             test3
a2a0b7ec2fdc   centos    "/bin/bash"   37 minutes ago   Exited (0) 23 minutes ago             test2
59288dd74012   centos    "/bin/bash"   37 minutes ago   Up 23 minutes                         test1
root@cp:~# docker ps -a -f ancestor=nginx
CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS              PORTS     NAMES
684764c97204   nginx     "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp    web


使用 –format 选项打印出指定格式的输出信息。

root@cp:~# docker ps --format "{{.ID}}\t{{.Image}}\t{{.Status}}"
684764c97204    nginx   Up 3 minutes
59288dd74012    centos  Up 25 minutes

root@cp:~# docker ps -l --format "table {{.Names}}\t{{.Ports}}"      # 显示最新创建的容器
NAMES     PORTS
web       80/tcp
root@cp:~# docker ps -n 2 --format "table {{.Names}}\t{{.Ports}}"   # 显示最后两个创建的容器
NAMES     PORTS
web       80/tcp
test3  

4、启动容器

docker start [OPTIONS] CONTAINER [CONTAINER...]

选项 含义
-i, –interactive 保持打开标准输入

例:

root@cp:~# docker create -it centos
a7bd7c5d6f6fb5378e55b01c7b228e97b7fb5eaf2667e03477ec96cbda098a4f
root@cp:~# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED              STATUS        PORTS     NAMES
a7bd7c5d6f6f   centos    "/bin/bash"   8 seconds ago        Created                 affectionate_gauss
root@cp:~# docker start a7
a7
root@cp:~# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED              STATUS        PORTS     NAMES
a7bd7c5d6f6f   centos    "/bin/bash"   About a minute ago   Up 1 second             affectionate_gauss

5、暂停和恢复容器

docker pause CONTAINER [CONTAINER...]
docker unpause CONTAINER [CONTAINER...]

例:

root@cp:~# docker pause test1
test1
root@cp:~# docker ps -a -f name=test1
CONTAINER ID   IMAGE     COMMAND       CREATED             STATUS                   PORTS     NAMES
59288dd74012   centos    "/bin/bash"   About an hour ago   Up 21 seconds (Paused)             test1
root@cp:~# docker unpause test1
test1
root@cp:~# docker ps -a -f name=test1
CONTAINER ID   IMAGE     COMMAND       CREATED             STATUS          PORTS     NAMES
59288dd74012   centos    "/bin/bash"   About an hour ago   Up 37 seconds             test1

6、停止容器

docker stop [OPTIONS] CONTAINER [CONTAINER...]

选项 含义
-t, –time int 等待停止之前等待的秒数(默认值为10)

  这个命令首先会向容器发送 SIGTERM 信号,会默认等待10秒超时时间(这个时间可以用 -t 选项控制),然后再会发出 SIGKILL 信号来终止容器。至于SIGTERM 和 SIGKILL 可以理解为正常退出和强制退出。

例:

root@cp:~# docker run -itd test:0.1
b75c2940c0ae325bb3910da100dacae885ba20cc8b0550d5349ba39f948723c0
root@cp:~# docker ps -a
CONTAINER ID   IMAGE      COMMAND             CREATED             STATUS                PORTS        NAMES
2d7ae1b72657   test:0.1   "/bin/bash"         About a minute ago   Up 1 second                       gifted_borg
root@cp:~# docker stop 2
2
root@cp:~# docker ps -a
CONTAINER ID   IMAGE      COMMAND             CREATED             STATUS                   PORTS     NAMES
2d7ae1b72657   test:0.1   "/bin/bash"         14 seconds ago      Exited (0) 7 seconds ago           gifted_borg

7、进入容器

(1)exec

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

选项 含义
-i, –interactive 保持打开标准输入
-t, –tty 为容器分配一个伪终端
-d, –detach 在后台运行命令
-e, –env list 指定环境变量列表
-w, –workdir string 指定命令运行在容器内的某个目录下,即指定命令运行的工作目录。
-u, –user string 执行命令的用户或id
–privileged 是否给执行命令以最高权限

  exec 准确来说是用于在正在运行的容器中运行命令,而不是专门用来进入容器的命令,不过通常我们都是通过 exec 命令进入容器。
  进入的容器要处于运行状态的,不然会报错。不同于run的是,通过这个命令进入容器,退出容器是不会终止的,因为是运行了一个新的 bash 窗口。

例:
进入容器

root@cp:~# docker exec -it test1 bash
[root@59288dd74012 /]# echo $$
35
[root@59288dd74012 /]# ps -ax
   PID TTY      STAT   TIME COMMAND
     1 pts/0    Ss+    0:00 /bin/bash
    35 pts/1    Ss     0:00 bash
    54 pts/1    R+     0:00 ps -ax
[root@59288dd74012 /]# exit
exit
root@cp:~# docker ps -a -f name=test1
CONTAINER ID   IMAGE     COMMAND       CREATED             STATUS          PORTS     NAMES
59288dd74012   centos    "/bin/bash"   About an hour ago   Up 15 minutes             test1

在容器中运行指定的命令

root@cp:~# docker exec test1 date
Tue Jan 12 11:02:29 UTC 2021

# 运行多条命令
root@cp:~# docker exec test1 bash -c "date;uptime"
Tue Jan 12 11:04:18 UTC 2021
 11:04:18 up  1:13,  0 users,  load average: 0.00, 0.00, 0.00

# 指定命令运行的工作目录
root@cp:~# docker exec -w /opt test1 bash -c "touch test;ls -l /opt"
total 0
-rw-r--r-- 1 root root 0 Jan 12 11:09 test

(2)attach

docker attach [OPTIONS] CONTAINER

  通过 attach 命令进入容器,使用 exit 和 ctrl+d 退出会导致容器停止运行,这是因为是直接连接到主 bash 进程,不像 exec 命令重新开了一个新 bash 窗口。值得注意的是,多个窗口都 attach 到同一个容器,所有窗口会同步显示,但是如果一个窗口因令阻塞,其他窗口也是无法执行操作的。

root@cp:~# docker attach test3
[root@e113e699e12b /]# echo $$
1
[root@e113e699e12b /]# ps ax
   PID TTY      STAT   TIME COMMAND
     1 pts/0    Ss     0:00 /bin/bash
    14 pts/0    R+     0:00 ps ax
[root@e113e699e12b /]# exit
root@cp:~# docker ps -a -f name=test3
CONTAINER ID   IMAGE     COMMAND       CREATED       STATUS                     PORTS     NAMES
e113e699e12b   centos    "/bin/bash"   2 hours ago   Exited (0) 3 seconds ago             test3

8、删除容器

docker rm [OPTIONS] CONTAINER [CONTAINER...]

选项 含义
-f, –force 强行删除运行的容器
-l, –link 删除容器的链接
-v, –volumes 删除容器挂载的卷

例:

root@cp:~# docker rm -f web
web
root@cp:~# docker rm -f `docker ps -aq`     # 强制删除所有容器

9、导出容器

docker export [OPTIONS] CONTAINER

选项 含义
-o, –output string 指定输出到的文件

例:

root@cp:~# docker export -o test2.tar test2
root@cp:~# ls
test2.tar

10、导入容器

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

选项 含义
-c, –change list 应用Dockerfile指令到将要创建的镜像中
-m, –message string 提交时的说明文字

  将导出的容器再导入是镜像,且导入的镜像只有镜像ID ,没有REPOSITORY和TAG,不过可以在导入时指定。需要注意的是:export 命令导出的容器再导入生成的镜像,用其创建容器需要带上COMMAND,不然会报错。

例:

root@cp:~# docker import test3.tar 
sha256:6d78a4c698754755a49f25c389a0ba41e80ecb596347452ffacb66469cfbde98
root@cp:~# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
<none>       <none>    6d78a4c69875   20 seconds ago   209MB
nginx        latest    ae2feff98a0c   3 weeks ago      133MB
centos       latest    300e315adb2f   5 weeks ago      209MB
root@cp:~# docker tag 6d test2:v1
root@cp:~# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
test2        v1        6d78a4c69875   37 seconds ago   209MB
nginx        latest    ae2feff98a0c   3 weeks ago      133MB
centos       latest    300e315adb2f   5 weeks ago      209MB

可以在导入时指定REPOSITORY和TAG:
root@cp:~# docker import test2.tar test2:v2
sha256:1a6621c2298fb2b202e2e2b4050f0e03263e252c3b001f02d099615d979ff51f
root@cp:~# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
test2         v2        1a6621c2298f   11 seconds ago   209MB

使用导入的镜像创建容器。

root@cp:~# docker run -itd test2:v1         # 报错,需要带上COMMAND
docker: Error response from daemon: No command specified.
See 'docker run --help'.

root@cp:~# docker ps -a -f name=test2       # 查看test3容器的CMMAND,如果显示不全加上--no-trunc
CONTAINER ID   IMAGE     COMMAND       CREATED       STATUS          PORTS     NAMES
a2a0b7ec2fdc   centos    "/bin/bash"   3 hours ago   Up 27 minutes             test2

root@cp:~# docker run -itd test2:v1 /bin/bash
9a2a1dd28d666b622a0efa9ec3da093da5c706ab41a745633f0747f6e0c65d44
root@cp:~# docker ps -a -f name=test2
CONTAINER ID   IMAGE      COMMAND       CREATED         STATUS             PORTS     NAMES
9a2a1dd28d66   test2:v1   "/bin/bash"   5 seconds ago   Up 3 seconds                 happy_noether

  除了使用 export 和 import 导出导入容器,我们也可以先使用 commit 将容器保存成镜像,在将镜像使用 save 导出,再使用 load 导入,导入的镜像自带了 REPOSITORY 和 TAG 等元数据,使用其创建容器也不需要带上 COMMAND。

root@cp:~# docker commit test2 test2:v3
sha256:b86f828ae048ecb1154ea851d66759ffc1a51b7a10833e92b1bc2c6732161889
root@cp:~# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
test2        v3        b86f828ae048   2 seconds ago    209MB
root@cp:~# docker save -o test2_v3.tar test2:v3
root@cp:~# ls
test2.tar  test2_v3.tar
root@cp:~# docker rmi test2:v3
Untagged: test2:v3
Deleted: sha256:b86f828ae048ecb1154ea851d66759ffc1a51b7a10833e92b1bc2c6732161889
root@cp:~# docker load -i test2_v3.tar 
Loaded image: test2:v3
root@cp:~# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
test2        v3        b86f828ae048   3 minutes ago    209MB
root@cp:~# docker run -itd test2:v3
a2ace6bb5ddc51bfe72417f1f507ebde422e36acbc7f6bfea2d9e4b6e93893ac
root@cp:~# docker ps -l
CONTAINER ID   IMAGE      COMMAND       CREATED         STATUS         PORTS     NAMES
a2ace6bb5ddc   test2:v3   "/bin/bash"   4 seconds ago   Up 3 seconds             confident_elion

  注:save 导出的镜像文件,可以由 load 导入也可以由 import 导入,但是 export 导出的只能由 import导入。

11、查看容器详细信息

docker container inspect [OPTIONS] CONTAINER [CONTAINER...
或者:
docker inspect [OPTIONS] NAME|ID [NAME|ID...]

选项 含义
-f, –format string 使用Go模板打印出指定格式的输出信息

例:

root@cp:~# docker container inspect test1 | head -n10
[
    {
        "Id": "59288dd740129c97eb5ff31f7ba4e23c6ef957012310084611dd83a8ebd01ec4",
        "Created": "2021-01-12T09:43:31.766920595Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
root@cp:~# docker inspect test1 | head -n10
[
    {
        "Id": "59288dd740129c97eb5ff31f7ba4e23c6ef957012310084611dd83a8ebd01ec4",
        "Created": "2021-01-12T09:43:31.766920595Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,

前面命令返回的是一个 JSON 格式的信息,如果只需要查看其中某一项信息时,可以使用 -f 选项来指定。

root@cp:~# docker inspect -f "{{.State.Status}}" test1
running

注:格式:"{{.xx.xx}}"
    一级属性 {{.属性}}
    二级属性 {{.属性.属性}}
    三级属性 {{.属性.属性.属性}}

可以自行定义输出格式,例如:    

root@cp:~# docker inspect -f "name:{{.Name}}  status:{{.State.Status}}" test1
name:/test1  status:running

但是当我们要查看一个大属性时,会发现输出的格式不直观,我们可以用以下方式解决:

root@cp:~# docker run -itd --name test centos
e9d346263b348e75230d7063d56be589c07d1c70123883a4bacde9834bb52787

root@cp:~# docker inspect -f "{{.State}}" test
{running true false false false false 8189 0  2021-01-17T08:58:17.364536257Z 0001-01-01T00:00:00Z <nil>}

root@cp:~# docker inspect -f "{{json .State}}" test | python -m json.tool
{
    "Dead": false,
    "Error": "",
    "ExitCode": 0,
    "FinishedAt": "0001-01-01T00:00:00Z",
    "OOMKilled": false,
    "Paused": false,
    "Pid": 8189,
    "Restarting": false,
    "Running": true,
    "StartedAt": "2021-01-17T08:58:17.364536257Z",
    "Status": "running"
}

12、容器与宿主机间的文件复制

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

选项 含义
-a, –archive 复制文件带有的原始uid/gid信息
-L, –follow-link 复制链接的目标内容,不然只复制链接(软链接)。

例:

# 将本地主机的文件拷贝到容器内
root@cp:~# touch /tmp/test.txt
root@cp:~# docker cp /tmp/test.txt test1:/opt
root@cp:~# docker exec test1 ls /opt
test.txt

# 将容器内的文件拷贝到本地主机上
root@cp:~# docker cp test1:/opt/test.txt ./
root@cp:~# ls
test.txt

13、查看容器日志

docker logs [OPTIONS] CONTAINER

选项 含义
–details 打印详细信息
-f, –follow 持续保持日志输出
–since string 输出从某个时间开始的日志
–until string 输出某个时间之前的日志
-n, –tail string 输出最近的若干日志
-t, –timestamps 显示时间戳信息

14、查看容器资源使用情况

docker stats [OPTIONS] [CONTAINER...]

选项 含义
-a, –all 显示所有容器(默认显示运行的)
–format string 使用Go模板打印出指定格式的输出信息
–no-stream 不持续输出,默认会自动更新持续实时结果
–no-trunc 不截断输出信息

stats 命令用于实时显示容器资源使用情况

例:

root@cp:~# docker stats --no-stream
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT    MEM %     NET I/O       BLOCK I/O   PIDS
a2a0b7ec2fdc   test2     0.00%     1.949MiB / 3.83GiB   0.05%     4.21kB / 0B   0B / 0B     1
59288dd74012   test1     0.00%     1.918MiB / 3.83GiB   0.05%     4.41kB / 0B   0B / 0B     1

root@cp:~# docker stats --no-stream test1
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT    MEM %     NET I/O       BLOCK I/O   PIDS
59288dd74012   test1     0.00%     1.918MiB / 3.83GiB   0.05%     4.41kB / 0B   0B / 0B     1

15、查看容器内的进程

docker top CONTAINER [ps OPTIONS]

例:

root@cp:~# docker top test1
UID       PID       PPID       C       STIME       TTY       TIME       CMD
root      6262      6229       0       19:17       pts/0     00:00:00   /bin/bash

16、查看容器文件系统上文件或目录的更改

docker diff CONTAINER

例:

root@cp:~# docker diff test1
C /opt
A /opt/test
A /opt/test.txt
C /root
A /root/.bash_history

输出信息说明:
 A:表示添加了一个文件或目录
 B:表示文件或目录被删除
 C:表示文件或目录已更改

17、更改容器名称

docker rename CONTAINER NEW_NAME

例:

root@cp:~# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED       STATUS       PORTS     NAMES
a2a0b7ec2fdc   centos    "/bin/bash"   4 hours ago   Up 2 hours             test2
59288dd74012   centos    "/bin/bash"   4 hours ago   Up 2 hours             test1
root@cp:~# docker rename test2 test22
root@cp:~# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED       STATUS       PORTS     NAMES
a2a0b7ec2fdc   centos    "/bin/bash"   4 hours ago   Up 2 hours             test22
59288dd74012   centos    "/bin/bash"   4 hours ago   Up 2 hours             test1



参考书籍:《Docker技术入门与实战》 作者: 杨保华 / 戴王剑 / 曹亚仑

1

发表评论

验证码: 8 + 2 =