为什么有些容器在docker run的时候需要接 -it ,有些不需要?

Posted 那一千七百二十九只鹤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么有些容器在docker run的时候需要接 -it ,有些不需要?相关的知识,希望对你有一定的参考价值。

原因:因为像centos、ubuntu等这些系统镜像起的容器都会启动时执行bash这个命令,进入后台运行,被daokcer认为是不活跃的容器进程,就会关闭容器,这样我们docker ps的时候就会发现容器没有起来。

刨析:

我们以制作镜像的角度解释为什么起容器的时候会执行bash这个命令

制作镜像的时候都会需要一个Dockerfile文件

这是Dockerfile文件内容

#base镜像
FROM busybox

#设置环境变量
ENV sg WANG

#启动容器时执行的命令我们,首先执行/bin/sh这个解释器,再sleep 120秒
CMD ["/bin/sh", "-c", "echo wangwenlong;sleep 120;echo ok"]

生成一个基于base镜像busybox的镜像

[root@localhost busybox]# docker build -t busybox .

创建并运行一个容器

[root@localhost busybox]# docker run -d --name w-busybox busybox

查看该容器是否运行

[root@localhost busybox]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED             STATUS             PORTS                               NAMES
596f2753e6b5   busybox        "/bin/sh -c \'echo wa…"   2 seconds ago       Up 1 second                                            w-busybox

查看该容器中运行的进程

[root@localhost busybox]# docker top w-busybox
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                10382               10363               1                   18:09               ?                   00:00:00            /bin/sh -c echo wangwenlong;sleep 120;echo ok
root                10412               10382               0                   18:09               ?                   00:00:00            sleep 120

120秒后

再次查看该容器会发现该容器已经停止运行

[root@localhost busybox]# docker top w-busybox
Error response from daemon: Container 596f2753e6b500ce05638995af11c8aae6151615f9a70c2fbbbc79a43c47c3f6 is not running

以上内容都说明了如果build的那个镜像的Dockerfile文件有

CMD ["解释器"]

一般都是linux系统作为镜像的时候会有上面这个

我们就要使用以下进行创建运行容器的命令

[root@localhost busybox]# docker run -it

该容器便可以运行起来而不会被docker关闭,因为bash模式下会进入后台运行,docker认为这是个不活跃的容器进程,就会关闭该容器

以上是关于为什么有些容器在docker run的时候需要接 -it ,有些不需要?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 docker 容器内部运行 docker命令

Docker Supervisor

docker run 默认工作目录 -w 参数

docker run 默认工作目录 -w 参数

docker中的命令参数(小白常用)

4.3 runner里的docker-in-docker