运行容器
docker run
是启动容器的方法。可用三种方式指定容器启动时执行的命令:
- CMD 指令。
- ENDPOINT 指令。
- 在
docker run
命令行中指定。
1 root@ubuntu:~# docker run ubuntu pwd2 / 3 root@ubuntu:~#
#容器启动时执行 pwd
,返回的 /
是容器中的当前目录
执行 docker ps
或 docker container ls
可以查看 Docker host 中当前运行的容器:
1 root@ubuntu:~# docker ps 2 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES3 f27eb6348026 registry:2 "/entrypoint.sh /etc…" 19 hours ago Up 19 hours 0.0.0.0:5000->5000/tcp vigilant_swartz4 root@ubuntu:~# 5 root@ubuntu:~# docker container ls6 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES7 f27eb6348026 registry:2 "/entrypoint.sh /etc…" 19 hours ago Up 19 hours 0.0.0.0:5000->5000/tcp vigilant_swartz8 root@ubuntu:~#
如果没有容器。用 docker ps -a
或 docker container ls -a
看看。
1 root@ubuntu:~# docker ps -a 2 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3 8b312e89208b ubuntu "pwd" 16 minutes ago Exited (0) 16 minutes ago frosty_williams 4 1b4e997bcfd3 ubuntu "pwd" 16 minutes ago Exited (0) 16 minutes ago sad_brahmagupta 5 f27eb6348026 registry:2 "/entrypoint.sh /etc…" 19 hours ago Up 19 hours 0.0.0.0:5000->5000/tcp vigilant_swartz 6 root@ubuntu:~# docker container ls -a 7 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8 8b312e89208b ubuntu "pwd" 16 minutes ago Exited (0) 16 minutes ago frosty_williams 9 1b4e997bcfd3 ubuntu "pwd" 16 minutes ago Exited (0) 16 minutes ago sad_brahmagupta10 f27eb6348026 registry:2 "/entrypoint.sh /etc…" 19 hours ago Up 19 hours 0.0.0.0:5000->5000/tcp vigilant_swartz11 root@ubuntu:~#
-a
会显示所有状态的容器,可以看到,之前的容器已经退出了,状态为Exited
。容器能够保持 runing 状态,才能被我们使用。
让容器长期运行
容器的生命周期依赖于启动时执行的命令,只要该命令不结束,容器也就不会退出。
理解了这个原理就可以通过执行一个长期运行的命令来保持容器的运行状态。例如:
1 root@ubuntu:~# docker run ubuntu /bin/bash -c "while true ; do sleep 1 ;done"2
while
语句让 bash 不会退出。可以打开另一个终端查看容器的状态:
1 root@ubuntu:~# docker ps 2 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES3 fa7407d1b483 ubuntu "/bin/bash -c 'while…" About a minute ago Up About a minute jolly_kirch4 root@ubuntu:~#
可见容器仍处于运行状态。不过这种方法有个缺点:它占用了一个终端。
我们可以加上参数 -d
以后台方式启动容器。通过 docker ps
查看容器:
1 root@ubuntu:~# docker run -d ubuntu /bin/bash -c "while true ; do sleep 1 ;done"2 d32b4710507d725fa0a4ed277f5433bfd1391571351fa75219fb03b3b78536813 root@ubuntu:~# 4 root@ubuntu:~# docker ps5 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES6 d32b4710507d ubuntu "/bin/bash -c 'while…" 8 seconds ago Up 6 seconds trusting_panini7 fa7407d1b483 ubuntu "/bin/bash -c 'while…" 3 minutes ago Up 3 minutes jolly_kirch
现在有了两个正在运行的容器。这里注意一下容器的 CONTAINER ID
和 NAMES
这两个字段。CONTAINER ID
是容器的 “短ID”,前面启动容器时返回的是 “长ID”。短ID是长ID的前12个字符。
NAMES
字段显示容器的名字,在启动容器时可以通过 --name
参数显示地为容器命名,如果不指定,docker 会自动为容器分配名字。
对于容器的后续操作,我们需要通过 “长ID”、“短ID” 或者 “名称” 来指定要操作的容器。比如下面停止一个容器:
1 root@ubuntu:~# docker stop d32b4710507d2 d32b4710507d3 root@ubuntu:~#
这里我们就是通过 “短ID” 指定了要停止的容器。
通过 while
启动的容器虽然能够保持运行,但实际上没有干什么有意义的事情。容器常见的用途是运行后台服务,例如前面我们已经看到的 http server:
1 root@ubuntu:~# docker run --name myhttp -d httpd 2 Unable to find image 'httpd:latest' locally 3 latest: Pulling from library/httpd 4 177e7ef0df69: Pull complete 5 65e7b631411e: Pull complete 6 3249ef8b9272: Pull complete 7 43ed8fedd0f6: Pull complete 8 02d3f33bda9d: Pull complete 9 Digest: sha256:246fed9aa9be7aaba1e04d9146be7a3776c9a40b5cfb3242d3427f79edee37db10 Status: Downloaded newer image for httpd:latest11 8b62217b8d1dc3dad8c301a4dc1817c60e5030d58d08ee8821eb36d68102c35f12 root@ubuntu:~# 13 root@ubuntu:~# docker ps14 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES15 8b62217b8d1d httpd "httpd-foreground" 19 seconds ago Up 18 seconds 80/tcp myhttp16 fa7407d1b483 ubuntu "/bin/bash -c 'while…" 2 hours ago Up 2 hours jolly_kirch17 f27eb6348026 registry:2 "/entrypoint.sh /etc…" 21 hours ago Up 21 hours 0.0.0.0:5000->5000/tcp vigilant_swartz18 root@ubuntu:~#
这一次我们用 --name
指定了容器的名字。 我们还看到容器运行的命令是httpd-foreground
,通过 docker history
可知这个命令是通过 CMD 指定的。
1 root@ubuntu:~# docker history httpd:latest 2 IMAGE CREATED CREATED BY SIZE COMMENT 3 ef1dc54703e2 2 weeks ago /bin/sh -c #(nop) CMD ["httpd-foreground"] 0B 42 weeks ago /bin/sh -c #(nop) EXPOSE 80 0B 5 2 weeks ago /bin/sh -c #(nop) COPY file:8b68ac010cb13f58… 133B 6 2 weeks ago /bin/sh -c set -eux; savedAptMark="$(apt-m… 43.1MB 7 2 weeks ago /bin/sh -c #(nop) ENV APACHE_DIST_URLS=http… 0B 8 2 weeks ago /bin/sh -c #(nop) ENV HTTPD_PATCHES= 0B 9 2 weeks ago /bin/sh -c #(nop) ENV HTTPD_SHA256=3498dc5c… 0B 10 2 weeks ago /bin/sh -c #(nop) ENV HTTPD_VERSION=2.4.37 0B 11 2 weeks ago /bin/sh -c set -eux; apt-get update; apt-g… 33.3MB 12 2 weeks ago /bin/sh -c #(nop) WORKDIR /usr/local/apache2 0B 13 2 weeks ago /bin/sh -c mkdir -p "$HTTPD_PREFIX" && chow… 0B 14 2 weeks ago /bin/sh -c #(nop) ENV PATH=/usr/local/apach… 0B 15 2 weeks ago /bin/sh -c #(nop) ENV HTTPD_PREFIX=/usr/loc… 0B 16 2 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B 17 2 weeks ago /bin/sh -c #(nop) ADD file:6d6f6f123e45697d3… 55.3MB
我们经常需要进到容器里去做一些工作,比如查看日志、调试、启动其他进程等。
------------------------引用来自-----------------------
https://mp.weixin.qq.com/s?__biz=MzIwMTM5MjUwMg==&mid=2653587637&idx=1&sn=0b6ff34a4121676167589f9cf6275099&chksm=8d3080acba4709ba7ddc446e79fb5666f4da6783490053a94999dccaf1867d5033b13865d0e5&scene=21#wechat_redirect