我們 docker run
啟動容器的時候,常需要將其在后台運行,通常我們設置參數 -d
即可。
但后台運行,其實是有前提的,如果沒有前台進程,那么實際運行完docker run
命令后,會處於退出狀態,即exited
。
例子:
docker run -d --name my-redis redis bash
# 指定命令是bash,但顯然bash在容器起來后,很快就會結束,導致沒有前台進程,故容器處於退出狀態
Docker容器后台運行,必須有一個前台進程。容器運行的命令如果不是那些一直掛起的命令(比如運行ping,sleep),就是會自動退出的。
而上面的代碼中bash就是需要執行的指定的命令。
命令如果執行完畢了,或者叫指定的應用終結時,容器會自動停止。
解決辦法
目前了解的可以使用以下3種方法,具體用哪種方法,依據實際情況,生產情況下,通常用docker-compose
結合具體cmd
作為容器初起的命令。
1.指定掛起阻塞命令啟動容器
docker run -d --name my-redis redis sleep 99999999999999
命令執行后,通過docker ps -a | grep my-redis
,可以看到容器處於運行狀態,即up
。
2.使用交互界面后退出容器
docker run -it --name my-redis redis bash
之后會進入容器,如果想保持容器后台運行,我們可以 Ctrl + p + q
,再次查看容器運行狀態,也可以看到容器處於up
狀態。
3.-td命令結合使用
docker run -itd --name my-redis2 redis bash # -i 不是必需,加了,容器起來后終端返回容器ID
剛也提到,就是-d
運行容器時,需要有前台進程,-t
提供一個偽終端,類似前台進程,查看容器運行狀態,也可以看到,容器處於up
狀態。
補充-進入容器的4種方法
docker提供了多種進入容器的方法,這里補充4種常見的方法:
- 使用docker attach
- 使用SSH
- 使用nsenter
- 使用exec
docker attach
docker attach 容器ID|容器name
使用該命令有一個問題。當多個窗口同時使用該命令進入該容器時,所有的窗口都會同步顯示。如果有一個窗口阻塞了,那么其他窗口也無法再進行操作,建議開發時使用。
ssh
在鏡像(或容器)中安裝SSH Server,這樣就能保證多人進入,不建議使用,具體見為什么不需要在 Docker 容器中運行 sshd
nsenter
nsenter使用方法
docker exec-推薦使用
通常我們可以通過容器name
或容器ID
進入到容器中:
-
如果我們在啟動容器的時候指定
-name
選項,我們可以:docker exec -it container_name bash
-
沒指定name,我們可以通過
docker ps
查看容器的ID,之后再通過docker exec -it containerID bash
進入容器