Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

dokcer 学习笔记0 #13

Open
maiff opened this issue Aug 4, 2018 · 0 comments
Open

dokcer 学习笔记0 #13

maiff opened this issue Aug 4, 2018 · 0 comments

Comments

@maiff
Copy link
Owner

maiff commented Aug 4, 2018

dokcer 学习笔记

缘起

看别人代码还是很有好处的,无意中看到朋友的circleci构建流程,原本我总是以为这样的ci也就是跑一个测试,后来发现可以构建一个docker然后服务器直接部署,为什么我会想到用docker部署,因为服务器学生优惠到期了……上面跑了好多项目,要是我一个个迁移得累死我……

移植一个项目

因为circleci只支持github和bu啥的后者真的太难用,但是这些部署构建涉及到密码,必须搞一个私人项目,没办法测试一下,整个流程直接看项目配置就好没什么难点,但是有一点需要更正我对容器的理解,并不能像虚拟机那么理解。

提到 CMD 就不得不提容器中应用在前台执行和后台执行的问题。这是初学者常出现的一个混淆。

Docker 不是虚拟机,容器中的应用都应该以前台执行,而不是像虚拟机、物理机里面那样,用 upstart/systemd 去启动后台服务,容器内没有后台服务的概念。

一些初学者将 CMD 写为:

CMD service nginx start

然后发现容器执行后就立即退出了。甚至在容器内去使用 systemctl 命令结果却发现根本执行不了。这就是因为没有搞明白前台、后台的概念,没有区分容器和虚拟机的差异,依旧在以传统虚拟机的角度去理解容器。

对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义,从而退出,其它辅助进程不是它需要关心的东西

而使用 service nginx start 命令,则是希望 upstart 来以后台守护进程形式启动 nginx 服务。而刚才说了 CMD service nginx start 会被理解为 CMD [ "sh", "-c", "service nginx start"],因此主进程实际上是 sh。那么当 service nginx start 命令结束后,sh 也就结束了,sh 作为主进程退出了,自然就会令容器退出。

正确的做法是直接执行 nginx 可执行文件,并且要求以前台形式运行。比如:

CMD ["nginx", "-g", "daemon off;"]

RUN /CMD/ENTRYPOINT的区别

entrypoint

cmd

最佳实践

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant