原文地址: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後臺程式具體都幹了些啥呢?一般來說,包括如下幾個操作步驟
- 檢測本地是否存在指定的映象,如果不存在,就從公共倉庫下載
- 利用映象建立一個容器,並啟動它
- 分配一個檔案系統,並在只讀的映象層上面掛載一層可讀寫層(容器儲存層)
- 從宿主機配置的網橋介面中橋接一個虛擬介面到容器中去
- 從地址池配置一個 ip 地址給容器
- 執行使用者指定的應用程式
- 執行應用程式完畢後容器被終止
2. 管理已有容器
一般對已有容器的管理包括如下幾個操作:
- 檢視執行中的容器
docker ps
或docker container ls
- 檢視所有容器
docker ps -a
或docker container ls -a
- 停止執行
docker stop xxx
- 開始停止狀態的容器
docker start xxx
- 重啟執行狀態的容器
docker restart xxx
- 刪除停止狀態的容器
docker rm xxx
- 強制刪除容器(包括執行狀態中)
docker rm -f xxx
- 刪除所有停止狀態的容器
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 (一個不只有技術乾貨的公眾號,歡迎關注,及時獲取更新內容)
———————————————————————————————————————————————————————————————