Docker学习笔记之容器的操作(2)
概述
在上一篇文章 Docker学习笔记之容器的操作(1) 中,我们学习了部分的容器的相关操作命令,这一篇我们继续学习更多操作命令,分别是:export、import、inspect、top、cp、diff、port、update等命令。
导入和导出容器
导出容器
在前面的文章中我们学习了创建容器,运行容器,如果我们想把我们本地的容器转移到其他服务器,那么这个时候,就可以使用 导出容器 export 命令。
它的格式为:docker [container] export [-o|--output[=""]] CONTAINER 。示例如下:
[root@localhost docker-test]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d46552e430bb ubuntu:21.10 "bash" 4 days ago Up 4 days angry_pascal
[root@localhost docker-test]# docker export -o test_export_ubuntu-21.10.tar d4655
[root@localhost docker-test]# ls
test_export_ubuntu-21.10.tar
这里需要了解的是,export 操作的容器,不管是停止运行了,还是其他状态,都可以使用 export 进行导出操作。
导入容器
导出的容器文件,可以使用 import 命令进行容器导入操作,命令格式为:docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|URL -[REPOSITORY[:TAG]] 。
示例如下:
[root@localhost docker-test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jlonghe/python latest b8da5b2aa3b4 9 days ago 95.3MB
[root@localhost docker-test]# ls
test_export_ubuntu-21.10.tar
[root@localhost docker-test]# docker import test_export_ubuntu-21.10.tar jlonghe/ubuntu:v1.0
sha256:82ba94cf77a3418e6476fe7ce9a77eb13238e75d41e2022b915ec5c8fa17360a
[root@localhost docker-test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jlonghe/ubuntu v1.0 82ba94cf77a3 4 seconds ago 77.4MB
jlonghe/python latest b8da5b2aa3b4 9 days ago 95.3MB
[root@localhost docker-test]#
从上图可以看到,IMAGE ID 为 82ba94cf77a3 的镜像是我们通过容器文件导入的镜像。
回顾一下,前面的文章,我们学过一个 save 命令 和 load 命令,然而 save 命令是 对镜像进行导出操作,并不能对容器进行导出操作,而 export 则是对容器导出成容器快照文件;
load 和 import 这两个命令,都可以将文件导入成镜像,功能和用法十分相似,但要特别注意的是:通过save 导出的文件,只能使用 load 导入到镜像库;通过export 导出的文件,只能通过 import 导入到镜像库,两种导出导入方式,不能混用!
load 和 import 两者的区别在于:容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积更大。此外,从容器文件导入时可以重新指定标签等元数据信息。
查看容器
docker 里面,常用于查看容器的命令有:inspect、top和stats 命令。
- 查看容器详情
查看容器详情,可以使用inspect子命令,它的格式为:docker [container] inspect [OPTIONS] CONTAINER [CONTAINER..] 。关于这个命令,其实在前面的文章中,也有使用到。使用这个命令,会以json格式返回包括容器ID、创建时间、路径、状态、配置等信息,具体的,可以参考下面的示例自己试一试。
[root@localhost docker-test]# clear
[root@localhost docker-test]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fad13ccb1593 ubuntu:18.04 "/bin/bash" 8 days ago Exited (0) 8 days ago sharp_hugle
[root@localhost docker-test]# docker inspect fad13ccb1593
[
{
"Id": "fad13ccb1593b26aa5010a53ba2e04e926b4af15d7f2551e9d5d495302b0f998",
"Created": "2022-04-16T09:45:08.949635068Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "exited",
"Running": false,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 0,
"ExitCode": 0,
"Error": "",
"StartedAt": "2022-04-16T09:45:09.362287644Z",
"FinishedAt": "2022-04-16T09:50:21.957902442Z"
},
.....
"NetworkSettings": {
....
}
}
]
- 查看容器内进程
查看容器内进程,可以使用 top 命令,格式为:docker [container] top [OPTIONS] CONTAINER [CONTAINER...] 。
可选参数有:
-a, -all:输出所有容器统计信息,默认仅在运行中;
-format string:格式化输出信息;
-no-stream:不持续输出,默认会自动更新持续实时结果;
-no-trunc:不截断输出信息;
这个命令类似Linux 系统中的 top 命令,会打印出运行状态的容器内的进程信息,包括 PID、用户、时间、命令等,示例如下:
[root@localhost docker-test]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9b7a9a6d8b7a dotnet-core "dotnet MyTest.Docke…" 12 days ago Up 4 days 5000/tcp, 0.0.0.0:5000->5061/tcp, :::5000->5061/tcp hello-baby
45499d54d1dd dotnet-core "dotnet MyTest.Docke…" 12 days ago Up 4 days 5000/tcp, 0.0.0.0:5010->5061/tcp, :::5010->5061/tcp hello-boy
[root@localhost docker-test]# docker top 9b7a9a6d8b7a
UID PID PPID C STIME TTY TIME CMD
root 2339 2302 0 4月20 ? 00:05:54 dotnet MyTest.DockerDemo.dll
[root@localhost docker-test]#
从上面的示例中,可以看到容器内在执行的命令为 dotnet MyTest.DockerDemo.dll ,这是一个 .net core 的 网站示例。
- 查看容器内统计信息
使用 stats 命令,可以查看到容器内的资源占用情况,如:CPU、内存、存储、网络等统计信息,格式为: docker [container] stats [OPTIONS] [CONTAINER..] 。
支持的参数有:
-a, -all:输出所有容器统计信息,默认仅在运行中;
-format string:格式化输出信息;
-no-stream:不待续输出,默认会自动更新持续实时结果;
-no-trunc:不截断输出信息;
示例如下:
[root@localhost docker-test]# docker stats -a feccc5d20b7b
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
feccc5d20b7b awesome_lederberg 0.00% 580KiB / 972.3MiB 0.06% 656B / 0B 1.62MB / 0B 1
复制文件
如果需要在主机与容器之间复制到文件,则可以使用 cp 命令进行操作,格式为:docker [container] cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH 。支持的可选参数有:
-a, -archive:打包模式,复制文件会带有原始的uid/gid信息;
-L, -follow-link: 跟随软连接。当原跟路径为软连接时,默认只复制链接信息,使用该参数会复制链接的目标内容。
示例1,从主机复制文件到容器:
[root@localhost docker-test]# docker run -itd ubuntu:14.04
5f7ee833197095a3c12b1392188cbdcbde07f3e814b037351a0ca8770b81b589
[root@localhost docker-test]# ls
test_export_ubuntu-21.10.tar
[root@localhost docker-test]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5f7ee8331970 ubuntu:14.04 "/bin/bash" 14 seconds ago Up 13 seconds flamboyant_ride
9b7a9a6d8b7a dotnet-core "dotnet MyTest.Docke…" 12 days ago Up 5 days 5000/tcp, 0.0.0.0:5000->5061/tcp, :::5000->5061/tcp hello-baby
45499d54d1dd dotnet-core "dotnet MyTest.Docke…" 12 days ago Up 5 days 5000/tcp, 0.0.0.0:5010->5061/tcp, :::5010->5061/tcp hello-boy
[root@localhost docker-test]# docker cp test_export_ubuntu-21.10.tar 5f7ee8331970:/root/
[root@localhost docker-test]# docker attach 5f7ee8331970
^C
root@5f7ee8331970:/# cd /root
root@5f7ee8331970:~# ls
test_export_ubuntu-21.10.tar
root@5f7ee8331970:~#
命令解析:从上图可以看到,我们先在后端运行一个 ubuntu:14.04 的容器,然后列出主机当前目录下的文件,再使用 docker ps 列出当前正在运行的容器,接着,通过 docker cp 将主机当前目录下的 test_export_ubuntu-21.10.tar 文件复制到 容器 5f7ee8331970 的 /root 目录下,最近是进入容器,并验证 test_export_ubuntu-21.10.tar 是否已经成功复制到了容器 的/root 目录下的。
示例2,从容器复制文件到主机:
[root@localhost docker-test]# docker run -itd ubuntu:14.04
feccc5d20b7bdb11d4e64881427de4f3642c6875e0ae1258cf96eee74eaef8df
[root@localhost docker-test]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
feccc5d20b7b ubuntu:14.04 "/bin/bash" About a minute ago Up About a minute awesome_lederberg
9b7a9a6d8b7a dotnet-core "dotnet MyTest.Docke…" 12 days ago Up 5 days 5000/tcp, 0.0.0.0:5000->5061/tcp, :::5000->5061/tcp hello-baby
45499d54d1dd dotnet-core "dotnet MyTest.Docke…" 12 days ago Up 5 days 5000/tcp, 0.0.0.0:5010->5061/tcp, :::5010->5061/tcp hello-boy
[root@localhost docker-test]# ls
test_export_ubuntu-21.10.tar
[root@localhost docker-test]# docker cp test_export_ubuntu-21.10.tar feccc5d20b7b:/root/123_ubuntu-21.10.tar
[root@localhost docker-test]# docker exec -it feccc5d20b7b /bin/bash
root@feccc5d20b7b:/# ls /root
123_ubuntu-21.10.tar
root@feccc5d20b7b:/# exit
exit
[root@localhost docker-test]# pwd
/home/www/docker-test
[root@localhost docker-test]# docker cp feccc5d20b7b:/root/123_ubuntu-21.10.tar /home/www/docker-test/
[root@localhost docker-test]# ls
123_ubuntu-21.10.tar test_export_ubuntu-21.10.tar
[root@localhost docker-test]#
命令解析:因为我前面的示范中,使用的是 attach 进入容器,所以在exit退出容器时,容器也聚随即停止运行,为了更好的演示:
(1)我们 使用了 docker run -itd ubuntu:14.04 重新run 一个新的容器;
(2)然后我们使用 ps 列出当前目录下的文件,此时只有一个名称为 test_export_ubuntu-21.10.tar 的文件;
(3)其后,通过 cp 命令,将目录 test_export_ubuntu-21.10.tar 复制到 容器 feccc5d20b7b 的/root目录下,并命名为 123_ubuntu-21.10.tar;
(4)使用 docker exec -it feccc5d20b7b /bin/bash 命令,进入容器,并列出 容器/root 目录下的文件,确实多了个名称为 123_ubuntu-21.10.tar 的文件;
(5)退出容器(此时,容器不会停止运行),使用 pwd 查看当前目录路径,再通过 docker cp feccc5d20b7b:/root/123_ubuntu-21.10.tar /home/www/docker-test/ 命令,将文件容器下的 123_ubuntu-21.10.tar 文件复制到主机的 /home/www/docker-test/ 目录下,最后使用 ls 查看当前目录下确实成功复制了一个名称为 123_ubuntu-21.10.tar 的文件。
查看变更
使用 diff 可以查看到 容器的文件系统的相关变更信息,格式为:docker [container] diff CONTAINER ,下面的示例是为我们前面的演示复制的一个容器,可以看到最后的变量是多了一个名称为 123_ubuntu-21.10.tar 的文件。
[root@localhost docker-test]# docker diff feccc5d20b7b
C /root
A /root/.bash_history
A /root/123_ubuntu-21.10.tar
[root@localhost docker-test]#
查看端口映射
查看容器的端口映射,可以使用 port 命令,格式为:docker container port CONTAINER [PRIVATE_PORT[/PROTO]]。示例如下:
[root@localhost docker-test]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
feccc5d20b7b ubuntu:14.04 "/bin/bash" 41 minutes ago Up 41 minutes awesome_lederberg
9b7a9a6d8b7a dotnet-core "dotnet MyTest.Docke…" 12 days ago Up 5 days 5000/tcp, 0.0.0.0:5000->5061/tcp, :::5000->5061/tcp hello-baby
45499d54d1dd dotnet-core "dotnet MyTest.Docke…" 12 days ago Up 5 days 5000/tcp, 0.0.0.0:5010->5061/tcp, :::5010->5061/tcp hello-boy
[root@localhost docker-test]# docker port 9b7a9a6d8b7a
5061/tcp -> 0.0.0.0:5000
5061/tcp -> :::5000
[root@localhost docker-test]#
如上图所示,如果我们查到的是容器 feccc5d20b7b 的端口,因为它本身没有配置端口,所以是没有任何信息输出的。
更新配置
docker 还为我们提供了修改容器配置信息的命令,主要是一些资源限制份额,格式为:docker [container] update [OPTIONS] CONTAINER [CONTAINER..] 。由于 [OPTIONS] 参数较多,这里就不写出来了,大家可以使用 --help 参数查看帮助,下面示例为修改容器的内存配置:
[root@localhost docker-test]# docker update --memory-swap 10M -m 10M feccc5d20b7b
feccc5d20b7b
[root@localhost docker-test]# docker inspect feccc5d20b7b
....
操作完成后,可以使用 inspect 查看容器,如下图所示,修改成功。
感谢大家的阅读,也欢迎留言交流,谢谢。