目錄
- 一、系統管理命令
- 1、啟動Docker服務
- 2、停止Docker服務
- 3、重啟Docker服務
- 4、設定Docker開機啟動
- 5、檢視Docker服務狀態
- 6、檢視Docker版本資訊
- 二、映象管理命令
- 1、檢視本地映象
- 2、搜尋Docker Hub上的映象
- 2.1、常見選項
- 2.2、示例:搜尋星數大於100的MySQL映象並限制搜尋結果為5個
- 3、從Docker Hub上拉取映象
- 3.1、常見選項
- 3.3、示例:拉取redis-5.0.14
- 4、標籤管理
- 4.1、示例:給剛下載的redis新增標籤
- 5、獲取映象詳細資訊
- 5.1、常見選項
- 5.2、示例:檢查reids:5.0.14映象的ID和建立時間
- 6、展示映象的構建歷史
- 6.1、常見選項
- 6.2、示例:列出redis:5.0.14各層建立的資訊
- 7、映象的匯入匯出
- 7.1、匯出
- 方式一:
- 方式二:
- 7.2、匯入
- 方式一:
- 方式二:
- 7.1、匯出
- 8、刪除映象
- 8.1、常見選項
- 8.2、透過映象名稱+標籤刪除映象
- 8.3、透過映象id刪除映象
- 8.4、刪除所有無容器使用的映象
- 三、容器管理命令
- 1、Docker容器的生命週期
- 2、建立容器
- 2.1、示例:建立一個nginx容器
- 3、啟動容器
- 3.1、示例:啟動nginx容器
- 4、建立並啟動容器
- 4.1、常見選項
- 4.2、示例:建立並啟動一個hello-world容器
- 4.3、示例:後臺啟動個nginx容器,保持標準輸入開啟並分配一個終端(-itd)
- 4.4、示例:後臺啟動個redis:5.0.14容器,保持標準輸入開啟,分配一個終端並取別名為redis-v1(-itd --name)
- 4.5、示例:後臺啟動個centos容器,保持標準輸入開啟,分配一個終端並取別名為centos-v2,並設定隨docker服務啟動而啟動(-itd --name --restart=always)
- 5、檢視正在執行的容器
- 6、檢視所以容器(包含執行和已停止的)
- 7、掛起容器
- 7.1、示例:掛起nginx容器
- 8、取消掛起容器
- 8.1、示例:取消掛起的nginx容器
- 9、終止容器
- 9.1、示例:終止nginx容器
- 10、刪除容器
- 10.1、常見選項
- 10.2、示例:刪除hello-world容器
- 10.3、示例:批次刪除已停止執行的容器
- 11、attach進入容器
- 11.1、示例:使用attach進入centos容器
- 11.1、示例:優雅的退出容器(退出時容器保持執行)
- 12、exec進入容器(推薦使用)
- 12.1、示例:使用exec進入centos容器
- 13、nsenter進入容器
- 13.1、常見選項
- 13.2、示例:使用nsenter進入容器
- 13.3、示例:指令碼形式進入容器
- 14、埠對映
- 14.1、示例:前臺啟動nginx,隨機埠對映(-P)
- 14.2、本地埠80對映到容器80埠
- 14.3、本地ip:本地埠:容器埠
- 14.4、本地ip:本地隨機埠:容器埠
- 14.5、本地ip:本地埠:容器埠/協議預設為tcp協議
- 15、檢視容器已經對映的埠
- 15.1、示例:檢視目前nginx容器已經對映的埠
- 16、Docker容器檔案的複製
- 16.1、示例:從宿主機上複製檔案到centos容器
- 16.2、示例:從centos容器複製檔案到宿主機上
- 17、檢視容器的日誌資訊
- 17.1、示例:檢視nginx-v4容器日誌
- 18、更換容器名
- 18.1、將容器centos-v2更換名字為mycentos-v2
- 19、資料掛載
- 19.1、示例:執行一個nginx容器,進行埠對映以及資料卷掛載並設定開機自啟動
- 20、指定容器DNS
- 20.1、示例:以後臺模式建立並啟動一個命名為centos-v3的CentOS容器,使用Google的公共DNS伺服器進行域名解析。
- 21、匯出容器
- 21.1、示例:將mycentos-v2容器匯出到/opt/目錄下的mycentos-v2壓縮包
- 22、匯入容器
- 22.1、示例:將/opt/目錄下的mycentos-v2.tar匯入到本地映象庫
一、系統管理命令
1、啟動Docker服務
systemctl start docker
2、停止Docker服務
systemctl stop docker
3、重啟Docker服務
systemctl restart docker
4、設定Docker開機啟動
systemctl enable docker
5、檢視Docker服務狀態
systemctl status docker
6、檢視Docker版本資訊
docker version 或 docker info
二、映象管理命令
1、檢視本地映象
docker images
- REPOSITORY:映象倉庫名稱
- TAG:映象的標籤資訊
- 映象ID:唯一用來標識映象,如果兩個映象的ID相同,說明他們實際上指向了同一個映象,只是具有不同標籤名稱而已
- CREATED:建立時間,說明映象的最後更新時間
- SIZE:映象大小
2、搜尋Docker Hub上的映象
docker search [映象名]
2.1、常見選項
-f, --filter filter
:這個選項允許你根據特定條件過濾搜尋結果。常見的條件是stars
--format string
:此選項允許你使用Go模板語法來自定義輸出格式。--limit int
:這個選項用來限制返回的搜尋結果數量。--no-trunc
:使用--no-trunc
選項後,所有輸出都不會被截斷,會看到完整的描述和其他資訊。
2.2、示例:搜尋星數大於100的MySQL映象並限制搜尋結果為5個
docker search -f stars=100 --limit 5 mysql
docker search
進行搜尋返回的結果中不僅會列出直接名為mysql
的映象,還會包括描述中帶有mysql
的其他映象
3、從Docker Hub上拉取映象
不加tag(版本號)即預設拉取最新版本latest
docker pull [映象名:標籤]
3.1、常見選項
-a, --all-tags
:下載倉庫中的所有帶標籤的映象。--disable-content-trust
:跳過映象驗證,預設值為true,意味著預設情況下不進行驗證。--platform string
:如果伺服器支援多平臺,則設定平臺。例如,可以指定為linux/amd64
、linux/arm64
等。-q, --quiet
:抑制冗長的輸出,使命令執行過程中減少資訊列印,使得輸出更加簡潔。
3.3、示例:拉取redis-5.0.14
Docker Hub官網
docker pull redis:5.0.14
4、標籤管理
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
為本地映象新增或更改標籤。
4.1、示例:給剛下載的redis新增標籤
docker tag redis:5.0.14 myredis:5.0.14
當
docker images
顯示出兩個標籤看起來一樣的映象(除了倉庫名不同),它們實際上指向同一個底層映象資料。,只是透過不同的名稱和標籤來區分。
5、獲取映象詳細資訊
docker inspect [OPTIONS] NAME|ID
5.1、常見選項
- -f, --format string:此選項允許你使用自定義的模板格式化輸出。預設情況下,輸出是 JSON 格式。你可以指定
'json'
直接得到 JSON 輸出,或者使用一個自定義的 Go 模板字串(例如'{{.Name}} {{.Image}}'
)來提取特定資訊。 - -s, --size:當檢查型別為容器時,這個選項會讓輸出包含每個層的總檔案大小,有助於瞭解容器佔用的空間情況。
- --type string:指定要返回 JSON 資訊的物件型別。這在處理多種型別物件時非常有用,但通常預設為自動檢測物件型別。
5.2、示例:檢查reids:5.0.14映象的ID和建立時間
docker inspect --format '{{println .Id}}{{println .Created}}' redis:5.0.14
docker inspect --format '{{printf "%s\n%s" .Id .Created}}' redis:5.0.14
6、展示映象的構建歷史
用於展示一個Docker映象的構建歷史,列出構建該映象時的每一層及其相關資訊
docker history [OPTIONS] IMAGE
6.1、常見選項
- --format string:
- 'table': 預設值,以表格形式展示輸出,幷包含列標題。
- 'table TEMPLATE': 自定義模板的表格輸出,允許你使用特定的Go模板來格式化輸出。
- 'json': 以JSON格式輸出歷史資訊。
- 'TEMPLATE': 使用指定的Go模板格式化輸出,提供高度自定義的輸出格式。
- -H, --human: 是否以人類可讀的格式顯示大小和日期,預設為
true
。 - --no-trunc: 不截斷輸出,尤其是在顯示映象ID或層ID時,會完整顯示而不做縮短處理。
- -q, --quiet: 僅顯示映象ID列表,而不包括其他詳細資訊,適用於當你只需要映象ID而不需要附加資訊時。
6.2、示例:列出redis:5.0.14各層建立的資訊
docker history redis:5.0.14
7、映象的匯入匯出
7.1、匯出
-
方式一:
-
docker save redis:5.0.14 -o /opt/redis.tar.gz ll /opt/redis.tar.gz
-
-
方式二:
-
docker save myredis:5.0.14 > /opt/myredis.tar.gz ll /opt/myredis.tar.gz
-
7.2、匯入
-
方式一:
-
docker load -i /opt/redis.tar.gz
-
-
方式二:
-
docker load < /opt/myredis.tar.gz
-
8、刪除映象
8.1、常見選項
--force, -f
:強制刪除映象,即使有依賴也不提示。--no-prune
:不刪除未被標記的父映象。
8.2、透過映象名稱+標籤刪除映象
docker rmi redis:5.0.14
8.3、透過映象id刪除映象
docker images
docker rmi 99ee9af2b6b1
8.4、刪除所有無容器使用的映象
docker system prune -a
三、容器管理命令
1、Docker容器的生命週期
- 建立(Created):當你使用
docker create
命令建立一個容器時,容器就處於建立狀態。在這個階段,容器已經被建立,但還沒有被啟動。 - 啟動(Running):當你使用
docker start
命令啟動一個已經建立的容器時,容器就會進入執行狀態。在這個階段,容器內的程序正在執行。 - 暫停(Paused)︰你可以使用
docker pause
命令來暫停一個正在執行的容器,使得容器內的所有程序都會被掛起。 - 恢復(Unpaused):使用
docker unpause
命令可以恢復一個被暫停的容器,使得容器內的程序繼續執行。 - 停止(Stopped):當你使用
docker stop
命令停止一個執行中的容器時,容器會進入停止狀態。在這個階段,容器內的程序會被髮送SIGTERM訊號,然後等待一段時間後被強制終止。 - 刪除(Deleted):使用
docker rm
命令可以刪除一個已經停止的容器,釋放其佔用的系統資源。
docker create
觸發create事件,容器進入stopped狀態;docker rm
觸發destory事件使容器完成從stopped->deleted狀態遷移;docker start
觸發start事件使容器完成從stopped->running狀態;docker run
觸發create事件經過stopped,觸發start事件後進入running狀態docker kill
使容器完成從running->stopped狀態遷移。docker kill先後觸發的die和kill事件,然後會kill掉當前容器中的程序,docker stop
使容器完成從running->stopped狀態遷移。docker stop先後觸發的die和stop事件,並不會殺掉當前容器的程序。docker restart
使容器完成從running->running狀態遷移。先後觸發了die、start、restart事件;docker paused
使容器完成從running->paused狀態遷移。觸發了pause事件;docker unpause
使容器完成從paused->running狀態遷移。觸發了unpause事件;
2、建立容器
當使用
docker create
命令建立一個容器時,容器就處於建立狀態。在這個階段,容器已經被建立,但還沒有被啟動。
dcoker create IMAGE[:TAG]
2.1、示例:建立一個nginx容器
docker create nginx
3、啟動容器
docker start CONTAINER ID
3.1、示例:啟動nginx容器
[root@localhost ~]# docker start b0
b0
這裡容器ID輸入了b0也啟動了容器
只要這些字元足以唯一標識一個容器。Docker會自動匹配並嘗試啟動
與之相匹配的第一個容器。
4、建立並啟動容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
4.1、常見選項
選項 | 描述 |
---|---|
--add-host |
新增自定義的主機到IP對映(格式:主機:IP) |
-a, --attach |
連線到容器的 STDIN、STDOUT 或 STDERR |
--annotation |
給容器新增註解(透過OCI執行時傳遞) |
-c, --cpu-shares |
CPU份額(相對權重) |
-d, --detach |
後臺執行容器並列印容器ID |
--env |
設定環境變數 |
-e, --env-file |
從檔案讀取環境變數 |
-h, --hostname |
設定容器的主機名 |
-i, --interactive |
即使不連線也保持 STDIN 開啟 |
-l, --label |
設定容器的後設資料標籤 |
--name |
為容器指定名稱 |
-p, --publish |
將容器的埠釋出到主機 |
-P, --publish-all |
將所有暴露的埠隨機對映到主機 |
-t, --tty |
分配一個偽TTY |
-u, --user |
指定使用者名稱或UID(格式:使用者名稱 |
--volume, -v |
掛載一個卷 |
--workdir, -w |
設定容器內部的工作目錄 |
--cap-add |
新增Linux能力 |
--cap-drop |
移除Linux能力 |
--device |
新增主機裝置到容器 |
--device-read-bps |
限制從裝置讀取速率(每秒位元組數) |
--memory |
記憶體限制 |
--network |
連線容器到網路 |
--privileged |
給予容器額外許可權 |
--read-only |
以只讀方式掛載容器的根檔案系統 |
--restart |
容器退出後的重啟策略 |
--rm |
容器退出後自動刪除 |
--security-opt |
設定安全選項 |
--ulimit |
設定ulimit限制 |
--volume-driver |
為容器指定卷驅動 |
--volumes-from |
從其他容器掛載卷 |
--health-cmd |
設定健康檢查命令 |
--memory-swappiness |
調整容器記憶體交換行為 |
--sysctl |
設定sysctl選項 |
--tmpfs |
掛載臨時檔案系統目錄 |
--stop-signal |
設定停止容器的訊號 |
--cpu-period, --cpu-quota |
限制CPU使用週期和配額(CFS) |
4.2、示例:建立並啟動一個hello-world容器
docker run hello-world
4.3、示例:後臺啟動個nginx容器,保持標準輸入開啟並分配一個終端(-itd)
docker run -itd nginx
4.4、示例:後臺啟動個redis:5.0.14容器,保持標準輸入開啟,分配一個終端並取別名為redis-v1(-itd --name)
docker run -itd --name redis-v1 redis:5.0.14
4.5、示例:後臺啟動個centos容器,保持標準輸入開啟,分配一個終端並取別名為centos-v2,並設定隨docker服務啟動而啟動(-itd --name --restart=always)
docker run -itd --name centos-v2 --restart=always centos
5、檢視正在執行的容器
docker ps
6、檢視所以容器(包含執行和已停止的)
docker ps -a
7、掛起容器
docker pause CONTAINER ID/CONTAINER NAMES
7.1、示例:掛起nginx容器
docker ps
docker pause angry_proskuriakova
8、取消掛起容器
docker pause CONTAINER ID/CONTAINER NAMES
8.1、示例:取消掛起的nginx容器
docker unpause angry_proskuriakova
9、終止容器
docker stop [OPTIONS] CONTAINER [CONTAINER...]
9.1、示例:終止nginx容器
docker stop b0
10、刪除容器
docker rm [OPTIONS] CONTAINER [CONTAINER...]
10.1、常見選項
-f, --force
:此選項強制刪除容器,即使容器正在執行也會立即刪除。如果不使用這個選項,Docker 會拒絕刪除正在執行的容器,要求你先停止容器。-l, --link
:在 Docker 的早期版本中,它用於移除兩個容器之間的連結關係。由於 Docker 網路的改進,特別是自 Docker 1.9 引入了使用者定義網路之後,容器連結功能已不再推薦使用-v, --volumes
:當刪除容器時,如果容器中掛載了匿名卷(即由 Docker 自動建立且未命名的卷),預設情況下這些卷不會被自動刪除。使用--volumes
選項會指示 Docker 在刪除容器的同時,也刪除與之關聯的所有匿名卷。
10.2、示例:刪除hello-world容器
docker rm b6
10.3、示例:批次刪除已停止執行的容器
docker rm -f `docker ps -qa`
11、attach進入容器
使用此方式進入容器的操作都是同步顯示的且exit容器將被關閉
docker attach [OPTIONS] CONTAINER
11.1、示例:使用attach進入centos容器
docker attach 461
11.1、示例:優雅的退出容器(退出時容器保持執行)
ctrl + p + q
12、exec進入容器(推薦使用)
執行單次命令後進入容器,退出容器後容器還在執行
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
12.1、示例:使用exec進入centos容器
docker exec -it 461 /bin/bash
13、nsenter進入容器
nsenter命令需要透過pid進入到容器內部
nsenter [options] <program> [<argument>...]
13.1、常見選項
選項 | 描述 |
---|---|
-t, --target | 指定要獲取其名稱空間的目標程序的PID。 |
-m, --mount[=] | 進入指定檔案(預設為 /proc//ns/mnt)代表的掛載名稱空間。 |
-u, --uts[=] | 進入指定檔案(預設為 /proc//ns/uts)代表的UTS名稱空間(主機名等)。 |
-i, --ipc[=] | 進入指定檔案(預設為 /proc//ns/ipc)代表的System V IPC名稱空間。 |
-n, --net[=] | 進入指定檔案(預設為 /proc//ns/net)代表的網路名稱空間。 |
-p, --pid[=] | 進入指定檔案(預設為 /proc//ns/pid)代表的PID名稱空間。 |
-U, --user[=] | 進入指定檔案(預設為 /proc//ns/user)代表的使用者名稱空間。 |
-S, --setuid | 在進入的名稱空間中設定UID。 |
-G, --setgid | 在進入的名稱空間中設定GID。 |
--preserve-credentials | 不修改進入名稱空間後的UID或GID。 |
-r, --root[=] | 設定進入名稱空間後的根目錄。 |
-w, --wd[=] | 設定進入名稱空間後的工作目錄。 |
-F, --no-fork | 不進行fork操作直接執行指定程式。 |
-Z, --follow-context | 根據目標PID設定SELinux上下文。 |
-h, --help | 顯示幫助資訊並退出。 |
-V, --version | 顯示版本資訊並退出。 |
13.2、示例:使用nsenter進入容器
docker inspect -f "{{.State.Pid}}" 461
#首先使用docker inspect獲取到容器的pid
nsenter -t 5386 -m -u -i -n -p
#-t 5386:指定PID為5386進入這個程序的各個名稱空間。-m -u -i -n -p分別是進入目標程序的掛載名稱空間、使用者名稱空間、IPC名稱空間、網路名稱空間、PID名稱空間
13.3、示例:指令碼形式進入容器
[root@localhost ~]# cat docker_in.sh
#!/bin/bash
docker_in(){
DOCKER_ID=$1
PID=`docker inspect -f "{{.State.Pid}}" ${DOCKER_ID}`
nsenter -t ${PID} -m -u -i -n -p
}
docker_in $1
14、埠對映
Docker容器的埠對映是一種讓宿主機(執行Docker的機器)與Docker容器之間的網路通訊成為可能的技術。
它允許外部系統透過宿主機的IP地址和埠訪問到容器內部的服務。
-p 宿主機埠:容器埠
14.1、示例:前臺啟動nginx,隨機埠對映(-P)
docker run -P nginx
ss -tunlp
#可以看到,隨機的埠對映其實是從32768開始對映
前臺啟動隨機埠對映 |
---|
ss -tunlp進行埠驗證 |
瀏覽器輸入ip+埠號訪問 |
14.2、本地埠80對映到容器80埠
docker run -itd -p 8080:80 --name nginx-v1 nginx:latest
後臺啟動,保持標準輸入並分配一個偽TTY終端,取別名為nginx-v1 |
---|
瀏覽器輸入ip+埠號訪問 |
14.3、本地ip:本地埠:容器埠
docker run -itd -p 192.168.112.60:8081:80 --name nginx-v2 nginx:latest
使用本地ip:本地埠:容器埠進行埠對映 |
---|
瀏覽器輸入ip+埠號訪問 |
14.4、本地ip:本地隨機埠:容器埠
docker run -itd -p 192.168.112.60::80 --name nginx-v3 nginx:latest
使用本地ip:本地隨機埠:容器埠進行埠對映 |
---|
瀏覽器輸入ip+埠號訪問 |
14.5、本地ip:本地埠:容器埠/協議預設為tcp協議
docker run -itd -p 192.168.112.60:8082:80/tcp --name nginx-v4 nginx:latest
使用本地ip:本地埠:容器埠/協議預設為tcp協議進行埠對映 |
---|
瀏覽器輸入ip+埠號訪問 |
15、檢視容器已經對映的埠
docker port CONTAINER [PRIVATE_PORT[/PROTO]]
15.1、示例:檢視目前nginx容器已經對映的埠
docker ps
[root@localhost ~]# docker port 50
80/tcp -> 192.168.112.60:8082
[root@localhost ~]# docker port ba
80/tcp -> 192.168.112.60:32768
[root@localhost ~]# docker port 5b
80/tcp -> 192.168.112.60:8081
[root@localhost ~]# docker port 52
80/tcp -> 0.0.0.0:8080
80/tcp -> [::]:8080
16、Docker容器檔案的複製
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
#docker cp 容器ID/名稱:檔案路徑 要複製到外部的路徑
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
#docker cp 要複製到外部的路徑 容器ID/名稱:檔案路徑
無論容器是否開啟都可以進行複製
16.1、示例:從宿主機上複製檔案到centos容器
docker cp /opt/centos-v1.txt centos-v1:/opt/
#將宿主機的/opt/centos-v1.txt檔案複製到centos-v1容器內部的/op/下
16.2、示例:從centos容器複製檔案到宿主機上
docker cp centos-v1:/tmp/hello.txt /tmp/
#將centos-v1容器內/tmp/hello.txt檔案複製到宿主機的/tmp/下
17、檢視容器的日誌資訊
docker logs [OPTIONS] CONTAINER
17.1、示例:檢視nginx-v4容器日誌
docker logs nginx-v4
18、更換容器名
docker rename 容器ID/容器名 新容器名
18.1、將容器centos-v2更換名字為mycentos-v2
docker rename centos-v2 mycentos-v2
19、資料掛載
-v 宿主機檔案儲存位置:容器內檔案位置 -v 宿主機檔案儲存位置:容器內檔案位置 -v 宿主機檔案儲存位置:容器內檔案位置 -v...
19.1、示例:執行一個nginx容器,進行埠對映以及資料卷掛載並設定開機自啟動
[root@localhost ~]# mkdir -p /data/web
[root@localhost ~]# echo "nginx test" > /data/web/index.html
[root@localhost ~]# docker run -itd -p 8085:80 --name nginx-v5 --restart=always -v /data/web/:/usr/share/nginx/html/ nginx
3a34a5e7f7cf9d457587227b9279601d57c4095a1bb515aba5ac2c8b049aacfd
[root@localhost ~]# curl 192.168.112.60:8085
nginx test
至於容器裡的繫結掛載和資料卷的概念後面單獨解釋
20、指定容器DNS
一是透過將dns地址配置在宿主機上
二是將引數配置在docker啟動指令碼里面
我們這裡討論第一種
20.1、示例:以後臺模式建立並啟動一個命名為centos-v3的CentOS容器,使用Google的公共DNS伺服器進行域名解析。
docker run -itd --rm --dns 8.8.8.8 --name centos-v3 centos bash
21、匯出容器
匯出容器是指,匯出一個已經建立的容器到一個檔案,不管此時這個容器是否處於執行狀態,匯出一個容器快照
docker export /指定路徑/自定義名.tar 容器名/ID
21.1、示例:將mycentos-v2容器匯出到/opt/目錄下的mycentos-v2壓縮包
docker export -o /opt/mycentos-v2.tar mycentos-v2
22、匯入容器
匯入一個容器快照到本地映象庫
docker import /指定路徑/tar壓縮檔案 映象名:標籤
22.1、示例:將/opt/目錄下的mycentos-v2.tar匯入到本地映象庫
docker import /opt/mycentos-v2.tar mycentos:v2