Docker筆記(六):容器管理

【空山新雨】發表於2019-07-22

原文地址:http://blog.jboost.cn/2019/07/21/docker-6.html

 

容器是Docker中的另一核心概念,在Docker中,應用的執行都是在容器內進行的,容器則基於映象建立。前面已對Docker映象做了基本介紹,本文對Docker容器管理的相關內容做一個梳理。

1. 啟動容器

啟動容器的命令格式如下

docker run [OPTIONS] IMAGE-NAME [COMMAND] [ARG...]

 

其中OPTIONS部分可指定容器執行的一些可選項,常用選項包括: 

  • -d 將容器以後臺程式(daemon)的形式執行
  • -p 指定容器內應用暴露埠與主機埠的對映,如 -p 8080:80 表示將容器內80埠對映到主機的8080埠(主機埠在前,容器埠在後)
  • -v 指定容器與主機的掛載目錄對映,如 -v /var/log:/log 表示將容器的/log目錄掛載到主機的/var/log目錄(同樣主機目錄在前,容器目錄在後),後續對容器的/log寫操作實際作用於主機的/var/log目錄
  • -e 為容器設定環境變數
  • -t 為容器啟動一個偽終端(pseudo-tty)
  • -i 讓容器的標準輸入保持開啟,一般與 -t 配合使用,讓容器啟動後就開啟一個可互動的命令列介面
  • -w 指定容器的工作目錄

COMMAND [ARG..] 部分就是容器需要執行的應用程式啟動命令與引數,如果映象中有通過 CMD, 或 ENTRYPOINT 指定了容器啟動程式,則可省略。另外可通過 –name 指定容器的名稱,以及 –restart 來指定重啟策略,–restart有三種取值,代表容器支援的三種不同的重啟策略

取值描述
always 除非被docker stop命令明確停止,否則一直嘗試重啟處於停止態的容器;如果Docker重啟,也會自動啟動容器
unless-stopped 與always的區別是,停止態的容器不在Docker重啟的時候被重啟
on-failed 在容器退出時返回值不為0的時候,重啟容器;如果Docker重啟,容器也會被啟動,不管之前是否處於停止狀態

 

以啟動一個mysql資料庫服務為例

docker run -d -p 3306:3306 --name mysql \
 -v /home/devuser/apps/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf \
 -v /home/devuser/apps/mysql/logs:/var/log/mysql \
 -v /home/devuser/apps/mysql/data:/var/lib/mysql \
 -e MYSQL_ROOT_PASSWORD=Passw0rd --restart=always mysql:5.7

 

上述命令啟動了一個mysql容器服務,-d 表示以後臺程式執行,執行命令後只返回一個容器ID,不會輸出任何其它資訊;-p 將容器暴露的埠3306對映到宿主機的3306埠,外部主機就可以通過宿主機IP與3306埠來訪問mysql服務; –name 指定了容器名稱為mysql; -v 將mysql的配置檔案路徑、日誌路徑、資料儲存路徑對映到了宿主機對應的路徑目錄;-e 設定了一個環節變數指定mysql root賬號的密碼;–restart 指定容器在異常退出時,包括Docker重啟時,自動啟動容器。 

我們前面有提過,當我們執行CLI命令時,實際上是客戶端(Docker Client)通過傳送請求到Docker後臺程式(Docker Daemon),由Docker後臺程式來執行的,那麼當我們執行上述docker run命令的時候,Docker後臺程式具體都幹了些啥呢?一般來說,包括如下幾個操作步驟

  1. 檢測本地是否存在指定的映象,如果不存在,就從公共倉庫下載
  2. 利用映象建立一個容器,並啟動它
  3. 分配一個檔案系統,並在只讀的映象層上面掛載一層可讀寫層(容器儲存層)
  4. 從宿主機配置的網橋介面中橋接一個虛擬介面到容器中去
  5. 從地址池配置一個 ip 地址給容器
  6. 執行使用者指定的應用程式
  7. 執行應用程式完畢後容器被終止

2. 管理已有容器

一般對已有容器的管理包括如下幾個操作:

  1. 檢視執行中的容器 docker ps 或 docker container ls
  2. 檢視所有容器 docker ps -a 或 docker container ls -a
  3. 停止執行 docker stop xxx
  4. 開始停止狀態的容器 docker start xxx
  5. 重啟執行狀態的容器 docker restart xxx
  6. 刪除停止狀態的容器 docker rm xxx
  7. 強制刪除容器(包括執行狀態中) docker rm -f xxx
  8. 刪除所有停止狀態的容器 docker container prune

其中xxx既可以是容器ID(短ID即可,只要與其它區分開來),也可以是容器名稱。
docker rm之前必須要先docker stop將容器置為停止狀態,而docker rm -f可以強制刪除執行狀態的容器,其背後是通過Linux/POSIX訊號來實現的,docker rm -f命令直接發出SIGKILL訊號,不會給容器內執行程式任何緩衝的時間,立即終止,而docker stop命令卻是先傳送SIGTERM訊號,通知容器程式結束,會為程式預留一個清理並優雅停止的機會,如果一段時間後程式還沒有終止,那麼就會傳送SIGKILL訊號,來終止程式的執行。

我們也可以像映象操作中一樣,組合使用命令來更方便地操作,如強制刪除所有容器(慎用)

docker rm -f $(docker ps -aq)

 

3. 進入容器 

容器在執行時指定 -d 選項時, 是以後臺程式的形式執行的,如果我們需要進入容器檢視或操作,可以通過docker exec命令,docker exec命令的格式如下

docker exec [OPTIONS] container-id COMMAND

 

OPTIONS常用的一般是 -t, -i,意義跟在docker run選項中一樣 —— 為容器啟動一個偽終端(pseudo-tty),並保持標準輸入開啟,從而可以像Linux命令列一樣進行互動, COMMAND一般為 bash。 

另外還有一個命令是docker attach xxx,其中xxx是容器ID,但推薦使用docker exec,因為docker attach中當執行exit退出容器時,容器也會隨之終止,但docker exec則不會。

如果不進入容器,也可以通過docker logs xxx,xxx是容器ID,來檢視容器的輸出資訊。

4. 匯入匯出容器

可以使用docker export命令將一個容器的快照進行匯出,如

docker export xxx > mycontainer.tar

 

其中xxx是容器ID,可以通過docker ps -a檢視,上述命令將容器的當前快照匯出到了本地檔案。 

docker import命令則可以將一個容器快照檔案匯入為映象,如

cat mycontainer.tar | docker import - test/myimage:v1.0

 

也可以通過URL來匯入,如 

docker import http://test.com/testimage.tgz test/myimage2:v1.0

 

由此可見,我們獲取映象又多了一個來源——從已有容器快照檔案匯入。 

5. 總結

本文對容器的一些基本操作進行了介紹,需要注意的是如之前所說,容器應以無狀態的形式執行,所有產生的資料應該通過掛載資料卷的方式寫入宿主機檔案目錄,避免容器銷燬時造成資料丟失;儘量使用docker stop + docker rm的方式來替代docker rm -f,使容器內執行程式“優雅”地退出。有時候可能遇到這樣的場景,容器建立執行後,我們需要對執行的一些引數進行更新或新增,這時候該怎麼操作。後文會對該場景進行介紹,歡迎關注。



我的個人部落格地址:http://blog.jboost.cn
我的微信公眾號:jboost-ksxy (一個不只有技術乾貨的公眾號,歡迎關注,及時獲取更新內容)
———————————————————————————————————————————————————————————————
微信公眾號

相關文章