本文共 4359 字,大约阅读时间需要 14 分钟。
现在,让我们尝试启动第一个 Docker 容器。我们可以使用docker run
命令创建容器,docker run
命令提供了 Docker 容器的创建到启动的功能。
root@ubuntu:~# docker run -ti ubuntu /bin/bashroot@0972061092ac:/# exitexit
容器启动时执行 /bin/bash,我们会进入容器的交互界面,我们可以通过 exit 退出容器。执行docker ps
可以查看正在运行的容器。我们使用命令查看到刚才运行的程序并没有运作着,我们可以通过docker ps -a
查看一下。
root@ubuntu:~# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES0972061092ac ubuntu "/bin/bash" 16 seconds ago Exited (0) 8 seconds ago sharp_volhard
-a 会显示所有状态的容器,可以看到,在我们退出容器的时候,容器也就随之退出了,状态为 Exited。
我们肯定不希望容易运行一条指令就退出,我们希望他可以长时间的提供服务。容器的生命周期依赖于启动时执行的命令,只要该命令不结束,容器也就不会退出。
理解了这个原理,我们就可以通过执行一个长期运行的命令来保持容器的运行状态。比如我们可以创建一个 Web 服务,例如下面的指令。root@ubuntu:~# docker run -d httpdUnable to find image 'httpd:latest' locallylatest: Pulling from library/httpd85b1f47fba49: Pull complete 45bea5eb3b59: Pull complete d360abbf616c: Pull complete 91c7cdd03f84: Pull complete 30623dd230a8: Pull complete cc21a2e04dd3: Pull complete f789cd8382be: Pull complete Digest: sha256:8ac08d0fdc49f2dc83bf5dab36c029ffe7776f846617335225d2796c74a247b4Status: Downloaded newer image for httpd:latest780ec986be0f3ee4af6c7c9f7ccc70fa4666411dd65b47a6acdf5aa3eab4cb40
默认我们是没有 httpd 这个容器的,当我们使用docker run
指令的时候,首先 Docker 会检查本地是否存在 httpd 镜像,如果本地还没有该镜像的话,那么 Docker 就会连接官方维护的 Docker Hub Registry,查看 Docker Hub 中是否有该镜像。Docker 一旦找到该镜像,就会下载该镜像并将其保存到本地宿主机中。
随后,Docker 在文件系统内部用这个镜像创建了一个新镜像。该容器拥有自己的网络、IP地址等。
root@ubuntu:~# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES780ec986be0f httpd "httpd-foreground" 5 minutes ago Up 5 minutes 80/tcp stupefied_stallman
我们可以看到刚刚创建的容器在运行中,我们看一下 CONTAINER ID 和 NAMES 这两个字段。
CONTAINER ID 是容器的“短 ID”,容器启动时返回的是“长 ID”。短 ID 是长 ID 的前12个字符。
NAMES 字段显示容器的名字,在启动容器时可以通过 --name 参数显示地为容器命名,如果不指定,docker 会自动为容器分配名字。
对于容器的后续操作,我们需要通过 “长 ID”、“短 ID” 或者 “名称” 来指定要操作的容器。
我们经常需要进到容器里去做一些工作,比如查看日志、调试、启动其他进程等。有两种方法进入容器:attach 和 exec。
Docker 容器启动的时候,我们可以通过docker run
命令指定 /bin/bash 来运行,因此我们的容器再重新启动后会沿用docker run
时指定的参数来运行。此外,也可以用docker attach
命令,重新附着到 ubuntu 容器的会话上。
root@ubuntu:~# docker start 0972061092ac0972061092acroot@ubuntu:~# docker attach 0972061092acroot@0972061092ac:/#
我们进入刚刚创建的 httpd 的容器,首先我们要查看此容器的 ID。
root@ubuntu:~# docker exec -ti 780ec986be0f /bin/bashroot@780ec986be0f:/usr/local/apache2#
-ti 以交互式模式打开 tty,执行/bin/bash,其结果就是打开了一个 bash 终端。
root@780ec986be0f:/usr/local/apache2# ps -efUID PID PPID C STIME TTY TIME CMDroot 1 0 0 09:02 ? 00:00:00 httpd -DFOREGROUNDdaemon 8 1 0 09:02 ? 00:00:00 httpd -DFOREGROUNDdaemon 9 1 0 09:02 ? 00:00:00 httpd -DFOREGROUNDdaemon 10 1 0 09:02 ? 00:00:00 httpd -DFOREGROUNDroot 92 0 0 09:17 pts/0 00:00:00 /bin/bashroot 98 92 0 09:20 pts/0 00:00:00 ps -ef
我们可以查看到容器内 httpd 的进程信息。
attach 与 exec 主要区别如下:
- attach 直接进入容器启动命令的终端,不会启动新的进程。
- exec 则是在容器中打开新的终端,并且可以启动新的进程。
- 如果想直接在终端中查看启动命令的输出,用 attach;其他情况使用 exec。
当然,如果只是为了查看启动命令的输出,可以使用docker logs
命令:
-f 的作用与 tail -f 类似,能够动态查看日志的产生。
我们可以通过容器启动的时候使用 --log-driver 来选择 Docker 日志驱动,默认的是 json-file,我们还可以选择 syslog,该选项将禁用docker logs
命令,并且将所有容器的日志输出都重定向到 syslog。
通过 docker stop 可以停止运行的容器。
容器在 docker host 中实际上是一个进程,docker stop
命令本质上是向该进程发送一个 SIGTERM 信号。如果想快速停止容器,可使用docker kill
命令,其作用是向容器进程发送 SIGKILL 信号。
对于处于停止状态的容器,可以通过 docker start 重新启动。
docker start
会保留容器的第一次启动时的所有参数。
docker restart
可以重启容器,其作用就是依次执行docker stop
和docker start
。
容器可能会因某种错误而停止运行。对于服务类容器,我们通常希望在这种情况下容器能够自动重启。启动容器时设置 --restart 就可以达到这个效果。
--restart=always 意味着无论容器因何种原因退出(包括正常退出),就立即重启。该参数的形式还可以是 --restart=on-failure:3,意思是如果启动进程退出代码非0,则重启容器,最多重启3次。
有时我们只是希望暂时让容器暂停工作一段时间,比如要对容器的文件系统打个快照,或者 dcoker host 需要使用 CPU,这时可以执行 docker pause。
处于暂停状态的容器不会占用 CPU 资源,直到通过 docker unpause 恢复运行。
除了通过docker ps
命令获取容器的信息,还可以使用docker inspect
来获取更多的容器信息。
docker inspect
命令会对容器进行详细的检查,然后返回其配置信息,包括名称、命令、网络配置以及很多有用的数据。
如果容器已经不再使用,我们可以使用docker rm
命令来删除它们。
docker rm
一次可以指定多个容器,如果希望批量删除所有已经退出的容器,可以执行如下命令:
docker rm -v `docker ps -aq -f status=exited`
docker rm
是删除容器,而docker rmi
是删除镜像。
转载于:https://blog.51cto.com/wzlinux/2046176