映象就像是一個安裝程式,而容器則是程式執行時的一個狀態。
檢視容器
檢視容器
啟動 docker 後,使用 docker ps
命令可以檢視當前正在執行的容器:
檢視所有容器
上面這條命令是檢視當前正在執行的容器,如果需要檢視所有容器,則可以通過 docker ps-a
命令檢視:
在檢視容器時,涉及到幾個檢視引數,含義分別如下:
-
CONTAINER ID:CONTAINER ID是指容器的id,是一個唯一識別符號,這是一個64位的十六進位制整數,在不會混淆的情況下可以只採用id的前幾位進行標識一個容器。
-
IMAGE:IMAGE表示建立容器時使用的映象。
-
COMMAND:COMMAND表示容器最後執行的命令。
-
CREATED:建立容器的時間。
-
STATUS:容器的狀態,這裡可能顯示一個容器啟動時間,也能顯示容器關閉時間。具體顯示哪個要看容器當前的狀態。
-
PORTS:容器對外開放的埠。
-
NAMES:容器的名字,如果不設定,會有一個預設的名字。
檢視最新建立的容器
使用 docker ps-l
可以檢視最近建立的容器,如下:
檢視最新建立的n個容器
可以使用 docker ps-n=XXX
來檢視最新建立的n個容器,如下:
建立容器
建立容器整體上來說有兩種不同的方式,可以先建立,再啟動,也可以連建立帶啟動一步到位,無論是那種方式,流程都是相似的,當執行一個建立命令之後,docker 首先會去本地路徑下查詢是否有相應的映象,如果沒有,就去 docker hub 上搜尋,如果搜尋到了,則下載下來,然後利用該映象建立一個容器並啟動。容器的檔案系統是在只讀的映象檔案上新增一層可讀寫的檔案層,這樣可以使在不改變映象的情況下,只記錄改變的資料。下面對這兩種方式分別予以介紹。
容器建立
開發者可以首先使用 docker create
命令建立一個容器,這個時候建立出來的容器是處於停止狀態,沒有執行,例如要建立一個 nginx 容器,建立命令如下:
-
docker create nginx
建立成功後,可以檢視容器是否建立成功:
此時建立的容器並未執行,處於停止狀態,容器的 name 是隨機生成的,開發者也可以在建立容器時指定 name ,如下:
-
docker create --name=nginx nginx
執行結果如下:
此時的 name 屬性就不是隨機生成的,而是使用者指定的 name。
這種方式只是單純的建立了一個使用者,並未啟動。
容器建立+啟動
如果開發者需要既建立又啟動容器,則可以使用 docker run
命令。 docker run
命令又可以啟動兩種不同模式的容器:後臺型容器和互動型容器,顧名思義,後臺型容器就是一個在後臺執行的容器,默默的在後臺執行計算就行了,不需要和開發者進行互動,而互動型容器則需要接收開發者的輸入進行處理給出反饋。對於開發者而言,大部分情況下建立的都是後臺型容器,不過在很多時候,即使是後臺型容器也不可避免的需要進行互動,下面分別來看。
後臺型容器
後臺型容器以 nginx 為例,一般 nginx 在後臺執行即可:
-
docker run --name nginx1 -d -p 8080:80 nginx
--name
含義和上文一樣,表示建立的容器的名字,-d 表示容器在後臺執行,-p 表示將容器的 80 埠對映到宿主機的 8080 埠,建立過程如下圖:
首先依然會去本地檢查,本地沒有相應的容器,則會去 Docker Hub 上查詢,查詢到了下載並執行,並且生成了一個容器 id。執行成功後,在瀏覽器中輸入 http://localhost:8080
就能看到 Nginx 的預設頁面了,如下:
這是一個後臺型容器的基本建立方式。
互動型容器
也可以建立互動型容器,例如建立一個 ubuntu 容器,開發者可能需要在 ubuntu 上面輸入命令執行相關操作,互動型容器建立方式如下:
-
docker run --name ubuntu -it ubuntu /bin/bash
引數含義都和上文一致,除了 -it,-it 引數,i 表示開發容器的標準輸入(STDIN),t 則表示告訴 docker,為容器建立一個命令列終端。執行結果如下:
該命令執行完後,會開啟一個輸入終端,讀者就可以在這個終端裡愉快的操作 ubuntu 了。
想要退出該終端,只需要輸入 exit 命令即可。
容器啟動
啟動
如果開發者使用了 docker run
命令建立了容器,則建立完成後容器就已經啟動了,如果使用了 docker create
命令建立了容器,則需要再執行 docker start
命令來啟動容器,使用 docker start
命令結合容器 id 或者容器 name 可以啟動一個容器,如下:
docker start
啟動的是一個已經存在的容器,要使用該命令啟動一個容器,必須要先知道容器的 id 或者 name ,開發者可以通過這兩個屬性啟動一個容器(案例中,nginx 是通過 name 啟動,而 ubuntu 則是通過 id 啟動)。一般來說,第一次可以使用 docker run
啟動一個容器,以後直接使用 docker start
即可。
重啟
容器在執行過程中,會不可避免的出問題,出了問題時,需要能夠自動重啟,在容器啟動時使用 --restart 引數可以實現這一需求。根據 docker 官網的解釋,docker 的重啟策略可以分為 4 種,如下:
四種的含義分別如下:
-
no表示不自動重啟容器,預設即此。
-
on:failure:[max-retries]表示在退出狀態為非0時才會重啟(非正常退出),有一個可選擇引數:最大重啟次數,可以設定最大重啟次數,重啟次數達到上限後就會放棄重啟。
-
always表示始終重啟容器,當docker守護程式啟動時,也會無論容器當時的狀態為何,都會嘗試重啟容器。
-
ubless-stopped表示始終重啟容器,但是當docker守護程式啟動時,如果容器已經停止執行,則不會去重啟它。
容器停止
通過 docker stop
命令可以終止一個容器,如下:
可以通過 name 或者 id 終止一個容器。
容器刪除
單個刪除
容器停止後還依然存在,如果需要,還可以通過 docker start
命令再次重啟一個容器,如果不需要一個容器,則可以通過 docker rm
命令刪除一個容器。刪除容器時,只能刪除已經停止執行的容器,不能刪除正在執行的容器。如下:
可以通過 name 或者 id 刪除一個容器。如果非要刪除一個正在執行的容器,可以通過 -f 引數實現,如下:
批量刪除
容器也可以批量刪除,命令如下:
-
docker rm $(docker ps -a -q)
docker ps-a-q
會列出所有容器的 id ,供 rm 命令刪除。
如下命令也支援刪除已退出的孤立的容器:
-
docker container prune
總結
本文主要向大家介紹了 Docker 容器的基本操作,更多高階操作我們將在下篇文章中介紹。
參考資料:
[1] 曾金龍,肖新華,劉清.Docker開發實踐[M].北京:人民郵電出版社,
Java 極客技術公眾號,是由一群熱愛 Java 開發的技術人組建成立,專注分享原創、高質量的 Java 文章。如果您覺得我們的文章還不錯,請幫忙讚賞、在看、轉發支援,鼓勵我們分享出更好的文章。
關注公眾號,大家可以在公眾號後臺回覆“部落格園”,免費獲得作者 Java 知識體系/面試必看資料。