写点什么

【docker 总结】第三篇 - Container 容器

作者:Brave
  • 2021 年 12 月 15 日
  • 本文字数:9831 字

    阅读完需:约 32 分钟

Container 容器


  • docker run 命令会从 image 文件,生成一个正在运行的容器实例。

  • docker container run 命令具有自动抓取 image 文件的功能。如果发现本地没有指定的 image 文件,就会从仓库自动抓取

  • 输出提示以后,hello world 就会停止运行,容器自动终止。

  • 有些容器不会自动终止

  • image 文件生成的容器实例,本身也是一个文件,称为容器文件

  • 容器生成,就会同时存在两个文件: image 文件和容器文件

  • 关闭容器并不会删除容器文件,只是容器停止运行



启动容器


docker container run + 镜像名
复制代码


根据镜像,创建并启动容器(若本地镜像不存在,会到去远程仓库拉取)

bogon:~ brave$ docker container run hello-worldUnable to find image 'hello-world:latest' locallylatest: Pulling from library/hello-world2db29710123e: Pull complete Digest: sha256:cc15c5b292d8525effc0f89cb299f1804f3a725c8d05e158653a563f15e4f685Status: Downloaded newer image for hello-world:latest
Hello from Docker!
复制代码


启动容器后,执行了 /hello 命令并输出对应信息;


容器执行完成会自动终止


容器,主要用来执行企业服务或进行计算操作;

所以,容器启动,命令执行完成后,容器会自动停掉;


可以通过 docker container ps 查看当前正在运行的容器;


如何区分:本来就是空的,还是已经停掉了?

可以使用 docker container ps -a 查看全部容器:

bogon:~ brave$ docker container ps -aCONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                     PORTS     NAMES4026a54a5208   hello-world   "/hello"   4 minutes ago   Exited (0) 4 minutes ago             festive_volhard
复制代码


可以得到一下信息:

  • 容器 ID:4026a54a5208;

  • 镜像:使用镜像 hello-world 生成;

  • 创建:4 分钟前创建;

  • 状态:4 分钟前被停止;


不会自动终止的容器

启动后台服务的容器,我们希望在后台一直运行,不能自动终止;

// 查看当前正在运行的容器docker container ls 
// 查看当前的容器(全部)docker container ls -a
// 查看容器信息docker container inspect + 容器 ID
复制代码


容器信息中的 cmd:



cmd 可执行命令(command-line),是当容器启动完成后,需要被执行的命令;

/hello:在容器内部的根目录下,存在 hello 脚本文件,执行将打印输出“hello docker”;


进入容器


如何进去看 hello 命令:

docker container run -it 容器名 /bin/bash
复制代码

-it 是什么意思?


// todo


进入容器:

docker container run -it hello-world /bin/bash
bogon:~ brave$ docker container run -it hello-world /bin/bashdocker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "/bin/bash": stat /bin/bash: no such file or directory: unknown.
复制代码


hello-world 进不去,换 centos:

// 进入容器:centosbogon:~ brave$ docker container run -it centos /bin/bash[root@41e18c84dcb7 /]# lsbin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
// 交互[root@41e18c84dcb7 /]# echo hellohello
// 退出容器[root@41e18c84dcb7 /]# exitexit
复制代码


备注:此时在 root@41e18c84dcb7,而非 root@localhost,说明已经进入到容器内部了;

输入 hello,控制台返回 hello;


虽然无法进入 hello-world 容器,但如果输入 /hello,还是可以打印出来的:

bogon:~ brave$ docker container run -it hello-world /hello
Hello from Docker!
复制代码



查看容器

查看运行中的容器docker container ps 
查看全部的容器(启动+未启动)docker container ps -a
查看最近的容器(返回 1 个)docker container ps -l
复制代码
  • -a 显示所有的容器,包括已停止的

  • -l 显示最新的那个容器


端口映射


// todo


由于容器内部的网络、服务、资源都是隔离的;

所以,外部宿主机是不能直接访问到容器内部的 80 端口的;


如何访问容器内的 nginx 服务?

将容器内部的 80 端口,映射到宿主机的端口,如:8080

所以,当访问 http://localhost:8080 时,就会去访问容器中 nginx 的 80 端口;


这就是端口映射;

启动容器(指定端口)

进入容器bogon:~ brave$ docker container run -it -p 80:80 centos /bin/bash
退出容器[root@b2c9c591b39a /]# exitexit
查看最近的容器bogon:~ brave$ docker container ps -lCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESb2c9c591b39a centos "/bin/bash" 12 seconds ago Exited (0) 9 seconds ago competent_turing
复制代码

PORTS 没有,因为内部并没有暴露 80 端口


发布端口:

bogon:~ brave$ docker run -p 8080:80 nginxUnable to find image 'nginx:latest' locallylatest: Pulling from library/nginx
复制代码

nginx 容器,会启动 nginx 服务监听 80 端口,所以会向外暴露 80 端口,就可以做映射


新开窗口,查看最新容器

BravedeMacBook-Pro:~ brave$ docker container ps -lCONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES999654b97faf   nginx     "/docker-entrypoint.…"   46 seconds ago   Up 44 seconds   0.0.0.0:8080->80/tcp   beautiful_bartik
复制代码

0.0.0.0:8080->80/tcp 宿主机的 8080 端口,被映射给了 nginx 容器的 80 端口;


访问 nginx 容器:

BravedeMacBook-Pro:~ brave$ curl http://localhost:8080<!DOCTYPE html><html><head><title>Welcome to nginx!</title><style>html { color-scheme: light dark; }body { width: 35em; margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif; }</style></head><body><h1>Welcome to nginx!</h1><p>If you see this page, the nginx web server is successfully installed andworking. Further configuration is required.</p>
<p>For online documentation and support please refer to<a href="http://nginx.org/">nginx.org</a>.<br/>Commercial support is available at<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p></body></html>
复制代码


查看容器日志:

docker logs 容器号
复制代码


BravedeMacBook-Pro:~ brave$ docker logs 999654b97faf172.17.0.1 - - [03/Dec/2021:13:31:04 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.64.1" "-"
复制代码




后台运行容器


目前 nginx 容器是在前台运行的,只能这样挂着,

如何运行在后台?

BravedeMacBook-Pro:~ brave$ docker run -d -p 8080:80 nginx73614508b52154601575c275990cbff0f08bdee65521f4c81add541255ff7302
复制代码



BravedeMacBook-Pro:~ brave$ docker run -d -p 8080:80 nginx73614508b52154601575c275990cbff0f08bdee65521f4c81add541255ff7302
BravedeMacBook-Pro:~ brave$ docker ps -lCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES73614508b521 nginx "/docker-entrypoint.…" About an hour ago Up About an hour 0.0.0.0:8080->80/tcp stupefied_dhawan
// top 查看进程BravedeMacBook-Pro:~ brave$ docker container top 73614508b521UID PID PPID C STIME TTY TIME CMDroot 2780 2753 0 14:17 ? 00:00:00 nginx: master process nginx -g daemon off;uuidd 2836 2780 0 14:17 ? 00:00:00 nginx: worker processuuidd 2837 2780 0 14:17 ? 00:00:00 nginx: worker processuuidd 2838 2780 0 14:17 ? 00:00:00 nginx: worker processuuidd 2839 2780 0 14:17 ? 00:00:00 nginx: worker process
复制代码


查看容器的资源使用情况

BravedeMacBook-Pro:~ brave$ docker stats 73614508b521
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS73614508b521 stupefied_dhawan 0.00% 3.949MiB / 1.939GiB 0.20% 1.37kB / 0B 0B / 12.3kB 5
复制代码


查看容器的端口暴露情况(查看端口映射)

BravedeMacBook-Pro:~ brave$ docker container port 73614508b52180/tcp -> 0.0.0.0:8080
复制代码

停止容器服务

BravedeMacBook-Pro:~ brave$ docker container stop 73614508b52173614508b521
复制代码

重启容器服务

BravedeMacBook-Pro:~ brave$ docker container start 73614508b52173614508b521
复制代码

删除容器

// 删除前查看状态-运行中BravedeMacBook-Pro:~ brave$ docker container ps -lCONTAINER ID   IMAGE     COMMAND                  CREATED       STATUS          PORTS                  NAMES73614508b521   nginx     "/docker-entrypoint.…"   2 hours ago   Up 36 seconds   0.0.0.0:8080->80/tcp   stupefied_dhawan// 删除容器-提示正在运行BravedeMacBook-Pro:~ brave$ docker container rm 73614508b521Error response from daemon: You cannot remove a running container 73614508b52154601575c275990cbff0f08bdee65521f4c81add541255ff7302. Stop the container before attempting removal or force remove// 关闭容器服务BravedeMacBook-Pro:~ brave$ docker container stop 73614508b52173614508b521// 删除容器BravedeMacBook-Pro:~ brave$ docker container rm 73614508b52173614508b521// 查看删除后的容器状态-已退出BravedeMacBook-Pro:~ brave$ docker container ps -lCONTAINER ID   IMAGE     COMMAND                  CREATED       STATUS                   PORTS     NAMES999654b97faf   nginx     "/docker-entrypoint.…"   2 hours ago   Exited (0) 2 hours ago             beautiful_bartik
复制代码



命令


// todo


  • docker 容器的主线程(dockfile 中 CMD 执行的命令)结束,容器会退出

  • 以使用交互式启动 docker run -i [CONTAINER_NAME or CONTAINER_ID]

  • tty 选项 docker run -dit [CONTAINER_NAME or CONTAINER_ID]

  • 守护态(Daemonized)形式运行 docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

13.2 启动容器

docker run ubuntu /bin/echo "Hello world"

  • docker: Docker 的二进制执行文件。

  • run:与前面的 docker 组合来运行一个容器。

  • ubuntu 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。

  • /bin/echo "Hello world": 在启动的容器里执行的命令

Docker 以 ubuntu 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果

  • Docker attach 必须是登陆到一个已经运行的容器里。需要注意的是如果从这个容器中 exit 退出的话,就会导致容器停止

13.3 查看容器

docker container ps docker container ps -a docker container ps -l 
复制代码
  • -a 显示所有的容器,包括已停止的

  • -l 显示最新的那个容器


13.4 运行交互式的容器

docker run -i -t ubuntu /bin/bash
复制代码
  • -t=--interactive 在新容器内指定一个伪终端或终端。

  • -i=--tty 允许你对容器内的标准输入 (STDIN) 进行交互。

我们可以通过运行 exit 命令或者使用 CTRL+D 来退出容器。


13.5 后台运行容器

docker run --detach centos ping www.baidu.comdocker ps docker logs --follow ad04d9acde94docker stop ad04d9acde94
复制代码

13.6 kill

docker kill 5a5c3a760f61 
复制代码

kill 是不管容器同不同意,直接执行 kill -9,强行终止;

stop 的话,首先给容器发送一个 TERM 信号,让容器做一些退出前必须的保护性、安全性操作,然后让容器自动停止运行,如果在一段时间内,容器还是没有停止,再进行 kill -9,强行终止

13.7 删除容器

  • docker rm 删除容器

  • docker rmi 删除镜像

  • docker rm $(docker ps -a -q)

docker rm 5a5c3a760f61
复制代码

13.8 启动容器

docker start [containerId] 
复制代码

13.9 停止容器

docker stop [containerId] 
复制代码

13.10 进入一个容器

docker attach [containerID] 
复制代码

13.11 进入一个正在运行中的容器

docker container -exec -it [containerID] /bin/bash 
复制代码

13.12 拷贝文件

docker container cp [containerID] /readme.md .
复制代码

13.13 自动删除

docker run --rm ubuntu /bin/bash
复制代码



基于新镜像,创建容器


基于容器进行修改,得到一个新的容器,并产生一个新的镜像,多一个层


1,删除所有的容器

查看全部镜像BravedeMacBook-Pro:~ brave$ docker container ps -aCONTAINER ID   IMAGE         COMMAND                  CREATED       STATUS                   PORTS     NAMES999654b97faf   nginx         "/docker-entrypoint.…"   2 hours ago   Exited (0) 2 hours ago             beautiful_bartikb2c9c591b39a   centos        "/bin/bash"              2 hours ago   Exited (0) 2 hours ago             competent_turingfa910955e688   hello-world   "/hello"                 2 hours ago   Exited (0) 2 hours ago             goofy_bartik41e18c84dcb7   centos        "/bin/bash"              2 hours ago   Exited (0) 2 hours ago             admiring_frankline43605d8eba0   hello-world   "/bin/bash"              2 hours ago   Created                            nice_bouman4026a54a5208   hello-world   "/hello"                 5 hours ago   Exited (0) 5 hours ago             festive_volhard
删除全部镜像 docker ps相当于docker container ps -q:只看容器 idBravedeMacBook-Pro:~ brave$ docker container rm $(docker ps -a -q)999654b97fafb2c9c591b39afa910955e68841e18c84dcb7e43605d8eba04026a54a5208
删除后,再查看所有容器BravedeMacBook-Pro:~ brave$ docker container ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
复制代码

2,根据镜像启动一个容器(即原始容器)

根据ubuntu镜像,启动容器(本地没有镜像,会先到远程仓库拉取)BravedeMacBook-Pro:~ brave$ docker run -it ubuntu bashUnable to find image 'ubuntu:latest' locallylatest: Pulling from library/ubuntu7b1a6ab2e44d: Pull complete Digest: sha256:626ffe58f6e7566e00254b638eb7e0f3b11d4da9675088f4781a50ae288f3322Status: Downloaded newer image for ubuntu:latest
复制代码

3,修改容器,得到新容器

进入容器,创建文件-->此时,成为一个新容器root@b242b7d7f2be:/# cd rootroot@b242b7d7f2be:~# touch myroot.txt root@b242b7d7f2be:~# lsmyroot.txtroot@b242b7d7f2be:~# exitexit
复制代码

4,查看老的 ubuntu 镜像(Layers 共 1 层):

查看老的 ubuntuBravedeMacBook-Pro:~ brave$ docker image inspect ubuntu[    {        "Id": "sha256:ba6acccedd2923aee4c2acc6a23780b14ed4b8a5fa4e14e252a23b846df9b6c1",        "RepoTags": [            "ubuntu:latest"        ],        "RepoDigests": [            "ubuntu@sha256:626ffe58f6e7566e00254b638eb7e0f3b11d4da9675088f4781a50ae288f3322"        ],        "Parent": "",        "Comment": "",        "Created": "2021-10-16T00:37:47.578710012Z",        "Container": "249e88be79ad9986a479c71c15a056946ae26b0c54c1f634f115be6d5f9ba1c8",        "ContainerConfig": {            "Hostname": "249e88be79ad",            "Domainname": "",            "User": "",            "AttachStdin": false,            "AttachStdout": false,            "AttachStderr": false,            "Tty": false,            "OpenStdin": false,            "StdinOnce": false,            "Env": [                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"            ],            "Cmd": [                "/bin/sh",                "-c",                "#(nop) ",                "CMD [\"bash\"]"            ],            "Image": "sha256:6c18a628d47eacf574eb93da2324293a0e6c845084cca2ea13efaa3cee4d0799",            "Volumes": null,            "WorkingDir": "",            "Entrypoint": null,            "OnBuild": null,            "Labels": {}        },        "DockerVersion": "20.10.7",        "Author": "",        "Config": {            "Hostname": "",            "Domainname": "",            "User": "",            "AttachStdin": false,            "AttachStdout": false,            "AttachStderr": false,            "Tty": false,            "OpenStdin": false,            "StdinOnce": false,            "Env": [                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"            ],            "Cmd": [                "bash"            ],            "Image": "sha256:6c18a628d47eacf574eb93da2324293a0e6c845084cca2ea13efaa3cee4d0799",            "Volumes": null,            "WorkingDir": "",            "Entrypoint": null,            "OnBuild": null,            "Labels": null        },        "Architecture": "amd64",        "Os": "linux",        "Size": 72776513,        "VirtualSize": 72776513,        "GraphDriver": {            "Data": {                "MergedDir": "/var/lib/docker/overlay2/138825136f5422d75a0b24291e7fb2013b254655938712a74edfb6f949fcc5ea/merged",                "UpperDir": "/var/lib/docker/overlay2/138825136f5422d75a0b24291e7fb2013b254655938712a74edfb6f949fcc5ea/diff",                "WorkDir": "/var/lib/docker/overlay2/138825136f5422d75a0b24291e7fb2013b254655938712a74edfb6f949fcc5ea/work"            },            "Name": "overlay2"        },        "RootFS": {            "Type": "layers",            "Layers": [                "sha256:9f54eef412758095c8079ac465d494a2872e02e90bf1fb5f12a1641c0d1bb78b"            ]        },        "Metadata": {            "LastTagTime": "0001-01-01T00:00:00Z"        }    }]
复制代码

5,根据新的容器创建镜像

查看全部镜像,获得镜像 id

BravedeMacBook-Pro:~ brave$ docker container ps -aCONTAINER ID   IMAGE     COMMAND   CREATED         STATUS                     PORTS     NAMESb242b7d7f2be   ubuntu    "bash"    5 minutes ago   Exited (0) 3 minutes ago             dazzling_vaughan
复制代码

将容器提交为一个新的镜像

docker commit -a"" -m"" + 容器 id + 镜像命名

BravedeMacBook-Pro:~ brave$ docker commit -a"brave" -m"add myroot.txt" b242b7d7f2be myroot:latestsha256:45a3985181e66a580fc5839255fe4e819090581004cf685d957f36daaf4200e0
BravedeMacBook-Pro:~ brave$ docker image lsREPOSITORY TAG IMAGE ID CREATED SIZEmyroot latest 45a3985181e6 10 seconds ago 72.8MB<none> <none> b1208d9b031a 2 minutes ago 72.8MBnginx latest f652ca386ed1 29 hours ago 141MBubuntu latest ba6acccedd29 6 weeks ago 72.8MBhello-world latest feb5d9fea6a5 2 months ago 13.3kBcentos 6 5bf9684f4720 2 months ago 194MBcentos latest 5d0da3dc9764 2 months ago 231MB
复制代码

6,查看新的镜像详情(此时,Layers 共 2 层)

BravedeMacBook-Pro:~ brave$ docker image inspect myroot[    {        "Id": "sha256:45a3985181e66a580fc5839255fe4e819090581004cf685d957f36daaf4200e0",        "RepoTags": [            "myroot:latest"        ],        "RepoDigests": [],        "Parent": "sha256:ba6acccedd2923aee4c2acc6a23780b14ed4b8a5fa4e14e252a23b846df9b6c1",        "Comment": "add myroot.txt",        "Created": "2021-12-03T15:44:49.2098773Z",        "Container": "b242b7d7f2be5df87439127da6cfd5436a4005303f9c5567b80a15b0c85b7cbf",        "ContainerConfig": {            "Hostname": "b242b7d7f2be",            "Domainname": "",            "User": "",            "AttachStdin": true,            "AttachStdout": true,            "AttachStderr": true,            "Tty": true,            "OpenStdin": true,            "StdinOnce": true,            "Env": [                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"            ],            "Cmd": [                "bash"            ],            "Image": "ubuntu",            "Volumes": null,            "WorkingDir": "",            "Entrypoint": null,            "OnBuild": null,            "Labels": {}        },        "DockerVersion": "20.10.11",        "Author": "brave",        "Config": {            "Hostname": "b242b7d7f2be",            "Domainname": "",            "User": "",            "AttachStdin": true,            "AttachStdout": true,            "AttachStderr": true,            "Tty": true,            "OpenStdin": true,            "StdinOnce": true,            "Env": [                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"            ],            "Cmd": [                "bash"            ],            "Image": "ubuntu",            "Volumes": null,            "WorkingDir": "",            "Entrypoint": null,            "OnBuild": null,            "Labels": {}        },        "Architecture": "amd64",        "Os": "linux",        "Size": 72776546,        "VirtualSize": 72776546,        "GraphDriver": {            "Data": {                "LowerDir": "/var/lib/docker/overlay2/138825136f5422d75a0b24291e7fb2013b254655938712a74edfb6f949fcc5ea/diff",                "MergedDir": "/var/lib/docker/overlay2/c80ccf53c41badedd004443ce4f37b78b10e81c83f455ab2c8fca94da6168c01/merged",                "UpperDir": "/var/lib/docker/overlay2/c80ccf53c41badedd004443ce4f37b78b10e81c83f455ab2c8fca94da6168c01/diff",                "WorkDir": "/var/lib/docker/overlay2/c80ccf53c41badedd004443ce4f37b78b10e81c83f455ab2c8fca94da6168c01/work"            },            "Name": "overlay2"        },        "RootFS": {            "Type": "layers",            "Layers": [                "sha256:9f54eef412758095c8079ac465d494a2872e02e90bf1fb5f12a1641c0d1bb78b",                "sha256:dc00e5e9b9941f075d5efd021ed6a91383ffc2c7215bf0f0fe070f068e8544f0"            ]        },        "Metadata": {            "LastTagTime": "2021-12-03T15:44:49.2180298Z"        }    }]
复制代码


用户头像

Brave

关注

还未添加个人签名 2018.12.13 加入

还未添加个人简介

评论

发布
暂无评论
【docker 总结】第三篇 - Container 容器