转载注明出处[ //www.greatytc.com/p/b165537fa6cc ]
序
首先说明:镜像不是虚拟机,Docker只是运行在宿主机上的一个进程!这就是与虚拟机的最大区别。
举例解释
一个很简单的例子来阐述二者区别,这个例子也是初学者常犯的错误。
例如写好了一个Dokcerfile,CMD命令中想在启动容器的同时启动一个nginx服务器。大多数初学者就这样写:
CMD service nginx start
但是会发现,启动一个容器后立即就退出了。
出现这种情况的原因是没有搞清楚镜像内是不存在后台进程这一概念~!
在虚拟机中,服务既可以运行在前台,也可挂在后台运行,但是对于容器而言,其本身只是个进程,因此所有要运行的服务都得运行在前台!对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义,从而退出,其它辅助进程不是它需要关心的东西。
而使用 service nginx start
命令,则是希望 upstart
来以后台守护进程形式启动 nginx 服务。但是对于CMD命令而言,这样的 CMD service nginx start
命令 会被理解为 CMD [ "sh", "-c", "service nginx start"],因此主进程实际上是 sh
。那么当 service nginx start
命令结束后,sh
也就结束了,sh
作为主进程退出了,自然就会令容器退出。
正确的做法是直接执行 nginx 可执行文件,并且要求以前台形式运行。比如:
CMD ["nginx", "-g", "daemon off;"]