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 查看容器,如下图所示,修改成功。

感谢大家的阅读,也欢迎留言交流,谢谢。

posted @ 2022-04-26 20:30  鹅城小将  阅读(324)  评论(0编辑  收藏  举报