1. 程式人生 > >Docker一些概念和誤區總結

Docker一些概念和誤區總結

進入 point exit 虛擬機 停止 虛擬 狀態 entos shell

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當作參數的。

Docker一些概念和誤區總結