原文链接:https://www.cpweb.top/250 推荐点击原文链接进行阅览,个人感觉格式比csdn更舒服些,阅读体验更好。 |
---|
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 选项可以将一个容器链接到一个容器上。像下面将 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
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技术入门与实战》 作者: 杨保华 / 戴王剑 / 曹亚仑