Docker 容器基本操作[Docker 系列-2]

Java極客技術發表於2019-07-31

Docker 入門及安裝[Docker 系列-1]


映象就像是一個安裝程式,而容器則是程式執行時的一個狀態。

檢視容器

檢視容器

啟動 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 容器,建立命令如下:

  1. docker create nginx

建立成功後,可以檢視容器是否建立成功:

此時建立的容器並未執行,處於停止狀態,容器的 name 是隨機生成的,開發者也可以在建立容器時指定 name ,如下:

  1. docker create --name=nginx nginx

執行結果如下:

此時的 name 屬性就不是隨機生成的,而是使用者指定的 name。

這種方式只是單純的建立了一個使用者,並未啟動。

容器建立+啟動

如果開發者需要既建立又啟動容器,則可以使用 docker run 命令。 docker run 命令又可以啟動兩種不同模式的容器:後臺型容器和互動型容器,顧名思義,後臺型容器就是一個在後臺執行的容器,默默的在後臺執行計算就行了,不需要和開發者進行互動,而互動型容器則需要接收開發者的輸入進行處理給出反饋。對於開發者而言,大部分情況下建立的都是後臺型容器,不過在很多時候,即使是後臺型容器也不可避免的需要進行互動,下面分別來看。

後臺型容器

後臺型容器以 nginx 為例,一般 nginx 在後臺執行即可:

  1. docker run --name nginx1 -d -p 8080:80 nginx

--name 含義和上文一樣,表示建立的容器的名字,-d 表示容器在後臺執行,-p 表示將容器的 80 埠對映到宿主機的 8080 埠,建立過程如下圖:

首先依然會去本地檢查,本地沒有相應的容器,則會去 Docker Hub 上查詢,查詢到了下載並執行,並且生成了一個容器 id。執行成功後,在瀏覽器中輸入 http://localhost:8080 就能看到 Nginx 的預設頁面了,如下:

這是一個後臺型容器的基本建立方式。

互動型容器

也可以建立互動型容器,例如建立一個 ubuntu 容器,開發者可能需要在 ubuntu 上面輸入命令執行相關操作,互動型容器建立方式如下:

  1. 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 種,如下:

四種的含義分別如下:

  1. no表示不自動重啟容器,預設即此。

  2. on:failure:[max-retries]表示在退出狀態為非0時才會重啟(非正常退出),有一個可選擇引數:最大重啟次數,可以設定最大重啟次數,重啟次數達到上限後就會放棄重啟。

  3. always表示始終重啟容器,當docker守護程式啟動時,也會無論容器當時的狀態為何,都會嘗試重啟容器。

  4. ubless-stopped表示始終重啟容器,但是當docker守護程式啟動時,如果容器已經停止執行,則不會去重啟它。

容器停止

通過 docker stop 命令可以終止一個容器,如下:

可以通過 name 或者 id 終止一個容器。

容器刪除

單個刪除

容器停止後還依然存在,如果需要,還可以通過 docker start 命令再次重啟一個容器,如果不需要一個容器,則可以通過 docker rm 命令刪除一個容器。刪除容器時,只能刪除已經停止執行的容器,不能刪除正在執行的容器。如下:

可以通過 name 或者 id 刪除一個容器。如果非要刪除一個正在執行的容器,可以通過 -f 引數實現,如下:

批量刪除

容器也可以批量刪除,命令如下:

  1. docker rm $(docker ps -a -q)

docker ps-a-q 會列出所有容器的 id ,供 rm 命令刪除。

如下命令也支援刪除已退出的孤立的容器:

  1. docker container prune

總結

本文主要向大家介紹了 Docker 容器的基本操作,更多高階操作我們將在下篇文章中介紹。

參考資料:

[1] 曾金龍,肖新華,劉清.Docker開發實踐[M].北京:人民郵電出版社,

Java 極客技術公眾號,是由一群熱愛 Java 開發的技術人組建成立,專注分享原創、高質量的 Java 文章。如果您覺得我們的文章還不錯,請幫忙讚賞、在看、轉發支援,鼓勵我們分享出更好的文章。

關注公眾號,大家可以在公眾號後臺回覆“部落格園”,免費獲得作者 Java 知識體系/面試必看資料。

 

相關文章