如何将 docker 容器作为守护进程启动

除了使用交互式 shell 运行 docker 容器之外,还可以让 docker 容器作为守护进程运行,这意味着 docker 容器将在后台运行,与我们当前的 shell 完全分离。
以下 CentOS docker 容器将使用 -d选项作为守护容器启动,同时使用无限的 bash while 循环执行 ping 8.8.8.8

# docker run --name centos-linux -d centos /bin/sh -c "while true; do ping 8.8.8.8; done"

使用 docker 的 ps命令,我们可以看到我们的 centos-linux容器正在运行:

# docker ps
CONTAINER ID IMAGE        COMMAND         CREATED       STATUS       PORTS        NAMES
6acfc613c604 centos:7     "/bin/sh -c 'while t 23 seconds ago   Up 23 seconds                    centos-linux

通过检查容器日志可以访问上述无限循环的实际输出:

# docker logs 6acfc613c604
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=56 time=18.5 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=56 time=18.8 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=56 time=18.1 ms

使用 docker exec重新添加到容器交互式 shell:

# docker exec -it centos-linux /bin/bash
[root@6acfc613c604 /]#

此外,使用 docker exec我们还可以在 docker 容器中运行任何所需的命令。
以下命令将使用 docker exec获取分配给 centos-linux容器的 IP 地址,而无需交互式 shell:

# docker exec -it centos-linux ip add show 
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
67: eth0:  mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:21 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.33/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:21/64 scope link 
       valid_lft forever preferred_lft forever

停止守护容器与停止任何其他 docker 容器相同:

# docker stop 6acfc613c604
6acfc613c604
日期:2020-07-07 20:57:10 来源:oir作者:oir