这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战
上一篇:Docker 镜像和容器
运行一个容器
在上一篇,解释了运行一个 hello-world
示例容器时,Docker 做了哪些工作。这一篇从一个简单的 ubuntu 容器开始。
如果想要找到一个现有的镜像,可以在公开的 Docker Hub 上搜索,这里可以找到它的介绍和用法,就像在 GitHub 上找一个开源项目一样。
如果你是第一次使用 Docker Hub,可以先注册一个账号,在最顶上的搜索框里输入 ubuntu
,找到的第一个结果就是官方的 ubuntu 镜像,点开可以看到上图的页面。
这个页面上有镜像的一些基本信息和用法介绍,右边的 docker pull ubuntu
命令用来在本地拉取镜像。在上一篇已经说过,当我们实例化一个容器时,如果 Docker 在本地找不到指定的镜像,它会自动进行拉取,因此,我们可以直接在本地运行:
docker run -i -t ubuntu /bin/bash
复制代码
这个命令比上次的示例多了一些参数,下面解释一下:
-i
可以保证容器中开启STDIN
-t
会为容器分配一个伪 TTY 终端ubuntu
是镜像的名称,相当于上个示例中的hello-world
/bin/bash
是启动后要在容器中执行的命令
其中 -i
和 -t
两个参数可以使容器运行起来之后,我们可以与之交互。当容器创建完成,Docker 就会执行容器中的 /bin/bash
命令,因此,容器运行后我们的终端会附着到容器上:
此时,你可以在开启一个终端,输入 docker ps
命令,查看已经启动的容器,得到的结果如下:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
402c5d3468d7 ubuntu "/bin/bash" 4 hours ago Up 4 hours reverent_wu
复制代码
这里展示了容器的 ID、镜像、最后执行的命令、创建时间、状态、名称。这里的名称 reverent_wu
是 Docker 自动生成的,如果需要在创建容器时指定名称,可以使用 --name
来给容器命名。
深入容器内部
当前的状态下,我们可以在附着到容器的终端执行任何 ubuntu 系统下支持的命令。比如,输入 hostname
命令,发现容器的 hostname 就是它的容器 ID。
接着,可以看一下 /etc/hosts
文件:
root@402c5d3468d7:/# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 402c5d3468d7
复制代码
你也可以自己尝试在容器中查看进程,甚至使用 apt-get
安装软件包。
最后,可以输入 exit
命令,推出容器,返回宿主机的命令提示符。注意,此时再执行 docker ps
时发现,容器的列表中,已经没有刚刚创建的 ubuntu 容器了。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
复制代码
当我们退出的时候,容器就停止运行了。不过,容器并没有被删除,可以通过 docker ps -a
命令,查看所有创建的容器,无论容器启动与否:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
402c5d3468d7 ubuntu "/bin/bash" 4 hours ago Exited (0) 2 minutes ago reverent_wu
复制代码
这时,它的状态变成了 Exited (0) 2 minutes ago
,表示它在 2 分钟之前推出,退出的状态码是 0,表示正常退出。
我们可以通过一下的命令重新启动这个容器:
docker start 402c5d3468d7
复制代码
这个命令中,docker start
后面跟的是容器的 ID,也可以使用容器的名称。执行成功后,再通过 docker ps
命令即可看到容器处于启动状态,通过 docker start
命令让容器重新启动后,会沿用 docker run
命令指定的参数,也就是启动后会运行 /bin/bash
启动一个 shell,但是我们并没有进入到容器的命令行当中。可以通过 docker attach
命令再次进入:
docker attach 402c5d3468d7
复制代码
此时,就可以继续在容器中执行命令。
如果一个容器不再使用了,可以使用 docker rm
命令将它删除。
docker rm 402c5d3468d7
复制代码
提供持续的服务
更多的时候,我们使用容器来运行应用程序和服务,并希望它在后台持续提供服务,这时候就需要以分离模式(或者叫守护模式)来运行容器。只需要在 docker run
后面增加一个 -d
参数,就可以让容器放到后台运行。
接下来,我们通过下面的命令再次运行一个容器:
docker run --name detached_mode -d ubuntu /bin/sh -c "while true; do echo Docker YYDS; sleep 1; done"
复制代码
这一次,我们给这个容器明明叫 detached_mode
,通过 -d
让它以分离模式运行,并通过执行一段脚本,每隔 1 秒钟打印一行 Docker YYDS
。
因为它是以分离模式运行的,所以启动后我们并不能在命令行看到打印的内容。但是可以通过 docker ps
命令看到容器在运行。
如果想让他停止运行,可以使用 docker stop
命令。
docker stop detached_mode
复制代码
同样可以通过 docker start
命令再次启动它,或者,可以通过 docker restart
重启运行中的容器。
容器的运行状态
在 detached_mode
容器运行的时候,可以通过 docker logs
命令获取容器的日志。也可以增加 -f
来持续监控日志,类似于 tail -f
命令。
docker logs -f detached_mode
复制代码
此时就可以看到一直有 Docker YYDS
被打印。
除了监控容器的日志,也可以使用 docker top
命令,查看容器内的进程。
docker top detached_mode
复制代码
使用 docker stats
命令,可以查看容器的CPU、内存、网络I/O、存储I/O的性能和指标。
另外,docker exec
命令可以在容器内部运行进程。
docker exec detached_mode cat /etc/hosts
复制代码
以上命令可以让我们直接查看容器中的 hosts 文件的内容,如果需要运行一个后台进程,在指令后面增加 -d
参数就可以了。
容器的详细信息
使用 docker inspect
命令可以查看容器的详细信息,其结果是一个 JSON 结构,包含的信息非常丰富。可以通过 -f
或者 --format
来选定想要查看的部分。
docker inspect --format '{{ .NetworkSettings.IPAddress }}' detached_mode
复制代码
执行以上的命令,只会在命令行展示容器的 IP 地址。
结尾
以上至介绍了 Docker 容器操作中一小部分常用的操作,足以应付日常的使用,如果想要学习更多的容器操作,可以查阅官方的文档。
近期评论