docker容器之后台運行


我們 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進入容器

參考:https://www.cnblogs.com/xhyan/p/6593075.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM