docker的cmd命令詳解 前後臺理解

2022-06-11 05:03:09 字數 1709 閱讀 4582

cmd指令的格式和run相似,也是兩種格式:

之前介紹容器的時候曾經說過,docker 不是虛擬機器,容器就是程序。既然是程序,那麼在啟動容器的時候,需要指定所執行的程式及引數。cmd指令就是用於指定預設的容器主程序的啟動命令的。

在執行時可以指定新的命令來替代映象設定中的這個預設命令,比如,ubuntu映象預設的cmd/bin/bash,如果我們直接docker run -it ubuntu的話,會直接進入bash。我們也可以在執行時指定執行別的命令,如docker run -it ubuntu cat /etc/os-release。這就是用cat /etc/os-release命令替換了預設的/bin/bash命令了,輸出了系統版本資訊。

在指令格式上,一般推薦使用exec格式,這類格式在解析時會被解析為 json 陣列,因此一定要使用雙引號",而不要使用單引號。

如果使用shell格式的話,實際的命令會被包裝為sh -c的引數的形式進行執行。比如:

cmd echo $home
在實際執行中,會將其變更為:

cmd [ "sh", "-c", "echo $home" ]
這就是為什麼我們可以使用環境變數的原因,因為這些環境變數會被 shell 進行解析處理。

提到cmd就不得不提容器中應用在前台執行和後台執行的問題。這是初學者常出現的乙個混淆。

docker 不是虛擬機器,容器中的應用都應該以前臺執行,而不是像虛擬機器、物理機裡面那樣,用systemd去啟動後台服務,容器內沒有後台服務的概念。

一些初學者將cmd寫為:

cmd service nginx start
然後發現容器執行後就立即退出了。甚至在容器內去使用systemctl命令結果卻發現根本執行不了。這就是因為沒有搞明白前台、後台的概念,沒有區分容器和虛擬機器的差異,依舊在以傳統虛擬機器的角度去理解容器。

對於容器而言,其啟動程式就是容器應用程序,容器就是為了主程序而存在的,主程序退出,容器就失去了存在的意義,從而退出,其它輔助程序不是它需要關心的東西。

而使用service nginx start命令,則是希望 upstart 來以後臺守護程序形式啟動nginx服務。而剛才說了cmd service nginx start會被理解為cmd [ "sh", "-c", "service nginx start"],因此主程序實際上是sh。那麼當service nginx start命令結束後,sh也就結束了,sh作為主程序退出了,自然就會令容器退出。

正確的做法是直接執行nginx可執行檔案,並且要求以前臺形式執行。比如:

cmd ["nginx", "-g", "daemon off;"]

CMD命令詳解

一 net use ip ipc user 建立ipc空鏈結 net use ip ipc 密碼 user 使用者名稱 建立ipc非空鏈結 net use h ip c 密碼 user 使用者名稱 直接登陸後對映對方c 到本地為h net use h ip c 登陸後對映對方c 到本地為h net ...

CMD命令詳解 其他

一 cls 清螢幕命令 1功能 清除螢幕上的所有顯示,游標置於螢幕左上角。2型別 內部命令 3格式 cls 二 ver檢視系統版本號命令 1功能 顯示當前系統版本號 2型別 內部命令 3格式 ver 三 data日期設定命令 1功能 設定或顯示系統日期。2型別 內部命令 3格式 date mm dd...

CMD命令詳解 目錄類命令

一 md 建立子目錄 1 功能 建立新的子目錄 2 型別 內部命令 3 格式 md 碟符 路徑名 子目錄名 4 使用說明 1 碟符 指定要建立子目錄的磁碟驅動器字母,若省略,則為當前驅動器 2 路徑名 要建立的子目錄的上級目錄名,若預設則建在當前目錄下。例 1 在c盤的根目錄下建立名為fox的子目錄...