您好,登錄后才能下訂單哦!
本篇內容主要講解“docker容器為什么一直running”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“docker容器為什么一直running”吧!
很多人第一次接觸 docker,都會有個錯覺,認為運行一個 container 就和運行一個虛擬機一樣, docker run 之后,該 container 即一直處于 running 狀態。其實,這種認識是完全錯誤的。
container 剛起來的時候,用戶可以通過 dockerfile 中的 CMD,ENTRYPOINT,或者直接在 docker run 后面接 comand,來指定 container 啟動時執行的程序。
如果指定的程序只是一個短暫的任務,比如 echo sorry。那么,sorry,container 在輸出 “sorry” 之后,就退出了。可以通過 docker inspect 看到,container 狀態變成了 Exited。一旦進入 Exited 狀態,以下命令將不再 work:
docker exec <container> docker attach <container> 這兩個命令都需要 <container>處于 running!
官方文檔里有明確指出,docker start <container> 可以重新啟動 <container>,那它又可以轉成 running 狀態。
但是,剛剛 start 的 container 在啟動之后,會再一次執行 CMD 的命令。然后,它又很快完成任務,進入 Exited 狀態休息了。
如果啟動一個 container 之后,想把它當做一個虛擬機使用(也就說,使用 docker exec 在 container 內部環境中運行程序),那么一定要保證這個 container 一直處于 running 的狀態。
有兩種情況需要考慮:
1、container 在啟動的時候,CMD 沒有指定一些 service 任務
2、CMD 中指定了一些重要的 service,比如 web 服務
對于第二種情況,container 中一直運行著 web 服務器,作為一個 service,除非你主動 stop 它,這個 service 會一直跑著。于是,起來的 container 也會一直 running,于是執行 docker exec 沒有任何問題。
對于第一種情況,很明顯 container 不久之后就會 Exited。讓它一直處于 running 的方法至少有兩種:
既然 CMD 沒有指定啥 service,那么可以假設 CMD 指定的任務不重要,如果真的很重要,可以在制作 dockerfile 的時候通過 RUN 指定。所以,我們可以修改 CMD,比如
docker run <image> tail -f /dev/null
其中tail -f /dev/null 這個程序會一直 block 住,沒有外界 signal 的情況下,不會退出,于是 container 就一直 running
上面這種方法,畢竟有可能會覆蓋 dockerfile 中的 CMD,一個更好的方法是——docker commit.
docker run <image> docker commit `docker ps -ql` <new_image> docker stop `docker ps -ql` docker rm `docker ps -ql` docker run <new_image> tail -f /dev/null
其中,docker ps -ql 用于獲得最近創建的 container 的 id。這個方法的缺點在于,多創建了一個 image,占用空間。考慮 CI/CD 情形的話,這個缺點幾乎不能忍。
到此,相信大家對“docker容器為什么一直running”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。