Docker一些概念和误区总结

1:每个业务最好只跑一个业务,且此业务是主进程:,这是容器技术的初衷和本意!!!


2:每个docker容器需要一个前台进程一直运行,因为docker容器并不是虚拟机,是利用linux的cgroup和namespace隔离的,在宿主机上本质是个隔离的进程,例如一个容器的主进程是启动nginx,service nginx start,这句shell充当了主进程,fork了一个子进程启动了nginx后这个shell就退出了,nginx是shell的子进程,主进程消亡子进程也就停止了,容器也就会一运行就exited了。


3:docker run是Run a command in a new container
而 docker exec是Run a command in a running container
因此以前理解的docker run -d --it centos /bin/bash 中的/bin/bash,其实是将bash作为了此容器的主进程,但是这样并没有什么卵用,因为容器是无状态的(数据不能持久化),当此容器挂掉的时候,文件就都丢失了,而这里的/bin/bash实际上就是dockerfile中的cmd,如果这里写了,那么就会覆盖dockerfile中的cmd,如果不写,那么就默认用dockerfile中的cmd
另外,以前认为docker exec -it 容器 /bin/bash,是进入容器的命令,实际上也是不准确的,这里的/bin/bash,实际上是让这个此容器运行/bin/bash,也就是进入了容器,但是实际上exec并不是单纯用来进入容器用的,它的真正作用是Run a command in a running container,因此也可以有这样的操作docker exec -it 容器 ls。


4:CMD和entrypoint
在dockerfile中
两者都可以设定命令作为主进程
两者都存在情况下,CMD是传递给entrypoint当作参数的。

猜你喜欢

转载自blog.51cto.com/11093860/2329757