Docker容器运行案例

Docker容器后台运行

语法

Docker容器后台运行的语法为:

haicoder(www.haicoder.net)# docker run -d IMAGE [COMMAND] [ARG]

Docker后台运行,即 Docker 启动直接进入后台。

案例

运行后直接退出

使用 docker run -d 命令以后台方式运行 Docker 。

haicoder(www.haicoder.net)# docker run -d centos #输出 4514b0e0ab801993f8854d3abe178804be2613dc7d717af1f82cebc4fe86ac8c

我们使用 docker run -d 命令以后台方式运行 Docker,此时终端输出了一长串的容器 ID。

使用 docker ps 命令,查看正在运行的容器,终端显示如下图所示:

07 docker run d.png

此时我们发现并没有任何在运行的容器。因为,虽然我们指定了 Docker 容器的后台运行,但是容器中并没有运行任何的程序,所以容器直接就退出了,因此没有任何正在运行的 Docker 容器。

运行后后台运行

使用 docker run -d 命令以后台方式运行 Docker 。

haicoder(www.haicoder.net)# docker run -d centos tail -f /dev/null d2722f6aa1b4bbc5fca7f75362a059bc9adff1bea97488e7b5c8cc197cf96db6

我们使用 docker run -d 命令以后台方式运行 Docker,此时终端输出了一长串的容器 ID。

使用 docker ps 命令,查看正在运行的容器,终端显示如下图所示:

08 docker run d.png

此时我们发现终端输出了正在运行的 Docker 容器,以及容器的基本信息(容器Id,镜像名,运行的命令,创建时间等)。

这次运行 Docker 容器,因为我们使用了 tail -f 命令,此命令会一直在后台执行,因此此时的 Docker 容器是有正在运行的进程,因此容器并没有退出,而是一直在后台运行。

使用 docker kill 命令,杀掉正在后台运行的 Docker 容器。

haicoder(www.haicoder.net)# docker kill 84aff7ca3a6e 84aff7ca3a6e

交互式后台运行

使用 docker run -it -d 命令以交互式后台方式运行 Docker 。

haicoder(www.haicoder.net)# docker run -it -d centos /bin/bash 24ad22b5df1440d634c9a571f875bbbd2b0a9741887d2c9260d08d27219949ad

我们使用 docker run -it -d 命令以交互式后台方式运行 Docker,此时终端输出了一长串的容器 ID。

使用 docker ps 命令,查看正在运行的容器,终端显示如下图所示:

09 docker run it d.png

此时我们发现终端输出了正在运行的 Docker 容器,以及容器的基本信息(容器Id,镜像名,运行的命令,创建时间等)。

这次运行 Docker 容器,因为我们使用了 docker run -it -d 命令,其中 -it 参数是以交互式方式运行容器,因此容器并没有退出,而是一直在后台运行。

使用 docker kill 命令,杀掉正在后台运行的 Docker 容器。

haicoder(www.haicoder.net)# docker kill 24ad22b5df14 #输出 24ad22b5df14

指定Docker容器名

语法

指定 Docker 容器运行时的容器名的语法为:

haicoder(www.haicoder.net)# docker run --name NAME IMAGE [COMMAND] [ARG]

如果不使用 --name 属性指定 Docker 容器运行的名字,则每次运行的名字为随机名字,这给我们管理带来了很大的不便。

案例

指定Docker运行的容器名

使用 docker run -it -d 命令以后台方式运行 Docker 容器,并不指定容器名。

haicoder(www.haicoder.net)# docker run -it -d centos #输出 85680c7012e9aedb07fe8914305af30f8b0dcd27e8266d91b61c43a52a929753

使用 docker ps 命令查看正在运行的 Docker 容器的信息,终端显示如下图所示:

10 docker run it d.png

此时我们发现 NAMES 列,显示的名字为随机的一个字符串。

再次使用 docker run -it -d 命令以后台方式运行 Docker 容器,并不指定容器名。

haicoder(www.haicoder.net)# docker run -it -d centos #输出 2104c2495596e221be692abe9887706159fd6202662c625065b316f610a96c41

使用 docker ps 命令查看正在运行的 Docker 容器的信息,终端显示如下图所示:

11 docker run it d.png

此时我们发现 NAMES 列,显示的名字为仍然为随机的一个字符串。

使用 docker run -it -d --name 命令以后台方式运行 Docker 容器,并指定容器名。

haicoder(www.haicoder.net)# docker run -it -d --name haiCoder centos #输出 0792160f36227bed71a4e0653ed04359c5c5cfc2a8002bc73b21c62ca4748109

使用了 --name 选项,指定 docker 容器的名字为 haiCoder,再次使用 docker ps 命令查看正在运行的 Docker 容器的信息,终端显示如下图所示:

12 docker run it name.png

此时我们发现 NAMES 列,显示的名字不再是一个随机名字,而是我们指定的 haiCoder。

使用 docker kill 命令,杀掉正在后台运行的 Docker 容器。

haicoder(www.haicoder.net)# docker kill 0792160f3622 2104c2495596 85680c7012e9 0792160f3622 2104c2495596 85680c7012e9

指定Docker端口

语法

指定 Docker 容器运行时暴露的端口的语法为:

haicoder(www.haicoder.net)# docker run -p PORT1:PORT2 IMAGE [COMMAND] [ARG]

使用 -p 运行参数,将容器内部的端口 PORT2 暴露为宿主机的端口为 PORT1。

案例

指定Docker运行的端口

使用 docker run -p 命令将容器内部的端口暴露出来。

haicoder(www.haicoder.net)# docker run -it -d --name coder -p 8081:80 centos 73758932dbfbb0d5eca6e7991b03513e81da779f004c432c0b229ca20913f0e3

使用 docker ps 命令查看正在运行的 Docker 容器的信息,终端显示如下图所示:

13 docker run port.png

此时我们发现 PORTS 列,显示了内部的 80 端口被导出为了宿主机的 8081 端口。

再次使用 docker port 命令查看 Docker 容器的端口映射。

haicoder(www.haicoder.net)# docker port coder #输出 80/tcp -> 0.0.0.0:8081

使用 docker port 命令查看 Docker 容器的端口映射,终端显示如下图所示:

14 docker port.png

此时同样显示了内部的 80 端口被导出为了宿主机的 8081 端口。

同时我们使用 netstat 命令查看宿主机的 8081 端口是否被监听,显示如下图所示:

15 netstat.png

即宿主机的 8081 端口被 docker 容器在监听。

使用 docker kill 命令,杀掉正在后台运行的 Docker 容器。

haicoder(www.haicoder.net)# docker kill 73758932dbfb 73758932dbfb

使用 docker rm 命令,删除所有的 docker 容器。

haicoder(www.haicoder.net)# docker rm $(docker ps -aq) 73758932dbfb 0792160f3622 2104c2495596 85680c7012e9 24ad22b5df14 4514b0e0ab80 d2722f6aa1b4 f3a466fbf569 6157df078393 bdd3f1b2b660

指定 Docker 映射的主机和端口

使用 docker run -p 命令可以将容器内部的端口映射成宿主机的指定的主机 IP 和端口。

haicoder(www.haicoder.net)# docker run -it -d --name coder -p 127.0.0.1:8081:80 centos #输出 f5b49f2e6a95aa010ae9403da71381c74627a89dfc1f3ecdd2d87f2dd70c3e02

使用 docker ps 命令查看正在运行的 Docker 容器的信息,终端显示如下图所示:

16 docker ps.png

此时我们发现 PORTS 列,显示了内部的 80 端口被导出为了宿主机的 8081 端口,且监听的 IP 不再是 0.0.0.0 而是我们指定的 127.0.0.1。

再次使用 docker port 命令查看 Docker 容器的端口映射。

haicoder(www.haicoder.net)# docker port coder #输出 80/tcp -> 127.0.0.1:8081

使用 docker port 命令查看 Docker 容器的端口映射,终端显示如下图所示:

17 docker port.png

此时同样显示了内部的 80 端口被导出为了宿主机的 8081 端口,且监听的 IP 为 127.0.0.1。

同时我们使用 netstat 命令查看宿主机的 8081 端口是否被监听,显示如下图所示:

18 netstat.png

即宿主机的 8081 端口被 docker 容器在监听。

使用 docker kill 命令,杀掉正在后台运行的 Docker 容器。

haicoder(www.haicoder.net)# docker kill f5b49f2e6a95 #输出 f5b49f2e6a95

使用 docker rm 命令,删除所有的 docker 容器。

haicoder(www.haicoder.net)# docker rm $(docker ps -aq) #输出 f5b49f2e6a95

Docker容器与宿主机共享目录

语法

Docker 容器与宿主机共享目录的语法为:

haicoder(www.haicoder.net)# docker run -v DIR1:DIR2 IMAGE [COMMAND] [ARG]

使用 -v 运行参数,指定容器内目录与宿主机目录共享,DIR1 为宿主机目录,DIR2 为容器目录。

案例

指定 Docker 容器内的目录与宿主机共享

使用 ls /tmp 目录,查看宿主机 /tmp 目录。

haicoder(www.haicoder.net)# ls /tmp/ haicoder(www.haicoder.net)#

在没有共享 Docker 容器目录时,宿主机的 /tmp 目录为空。

使用 docker run -v 命令将容器内的目录与宿主机共享。

haicoder(www.haicoder.net)# docker run -it -d --name haiCoder -v /tmp:/etc centos bdf097ceec3dc9df33457146a5936cb1eb8fb54c14d02cb79d784d34b51a37c4

我们使用 docker run -v 将 Docker 容器的 /etc 目录,共享到宿主机的 /tmp 目录。

使用 docker ps 命令查看正在运行的 Docker 容器的信息,终端显示如下图所示:

19 docker ps.png

此时再次使用 ls /tmp 目录,查看宿主机 /tmp 目录。

haicoder(www.haicoder.net)# ls /tmp/ hostname hosts resolv.conf haicoder(www.haicoder.net)#

此时宿主机的 /tmp 目录不为空,有了 Dokcer 容器中的 /etc 目录中的文件。

使用 docker kill 命令,杀掉正在后台运行的 Docker 容器。

haicoder(www.haicoder.net)# docker kill edc65deb6b0d 8680bfea650c

杀掉正在运行的 Docker 容器后,再次使用 ls /tmp 目录,查看宿主机 /tmp 目录。

haicoder(www.haicoder.net)# ls /tmp/ hostname hosts resolv.conf haicoder(www.haicoder.net)#

发现此时宿主机的 /tmp 目录,仍然有文件,即虽然容器停止了,但原来共享的目录在宿主机不会被删除。

使用 docker rm 命令,删除所有的 docker 容器。

haicoder(www.haicoder.net)# docker rm $(docker ps -aq) 8680bfea650c