docker容器操作
阿新 • • 發佈:2020-08-22
目錄
- 容器簡介
- 容器與虛擬機器
- 容器生命週期
- 容器生命週期管理
- 列出容器 – docker ps
- 列出容器 – docker container ls
- 容器建立 – docker create
- 容器啟動 – docker start
- 容器建立並啟動 – docker run
- docker run 與 docker create + docker start
- 容器暫停 – docker pause
- 容器取消暫停 – docker unpause
- 容器關閉 – docker stop
- 容器終止 – docker kill
- docker stop和docker kill的區別
- 容器重啟 – docker restart
- 容器刪除 – docker container rm
- 複製檔案
- 把容器儲存成docker映象
- 容器資訊檢視
- 容器執行時操作
- 總結
容器簡介
容器(Container):容器是一種輕量級、可移植、並將應用程式進行的打包的技術,使應用程式可以在幾乎任何地方以相同的方式執行 Docker將映象檔案執行起來後,產生的物件就是容器。容器相當於是映象執行起來的一個例項。 容器具備一定的生命週期。 另外,可以藉助docker ps命令檢視執行的容器,如同在linux上利用ps命令檢視執行著的程序那樣。
容器與虛擬機器
容器和虛擬機器一樣,都會對物理硬體資源進行共享使用。
容器和虛擬機器的生命週期比較相似(建立、執行、暫停、關閉等等)。
容器中或虛擬機器中都可以安裝各種應用,如redis、mysql、nginx等。也就是說,在容器中的操作,如同在一個虛擬機器(作業系統)中操作一樣。
同虛擬機器一樣,容器建立後,會儲存在宿主機上:linux上位於/var/lib/docker/containers下
注意:容器並不是虛擬機器,但它們有很多相似的地方 虛擬機器的建立、啟動和關閉都是基於一個完整的作業系統。一個虛擬機器就是一個完整的作業系統。而容器直接執行在宿主機的核心上,其本質上以一系列程序的結合。 容器是輕量級的,虛擬機器是重量級的。首先容器不需要額外的資源來管理(不需要Hypervisor、Guest OS),虛擬機器額外更多的效能消耗;其次建立、啟動或關閉容器,如同建立、啟動或者關閉程序那麼輕鬆,而建立、啟動、關閉一個作業系統就沒那麼方便了。 也因此,意味著在給定的硬體上能執行更多數量的容器,甚至可以直接把Docker執行在虛擬機器上。
容器生命週期
虛擬機器的生命週期
![](https://raw.githubusercontent.com/cwyfengyiyuan/images/master/1598081813_20200822153519925_11921.png =1200x)
容器的生命週期
![](https://raw.githubusercontent.com/cwyfengyiyuan/images/master/1598081824_20200822153625566_32421.png =1200x)
容器生命週期管理
列出容器 – docker ps
# 作用:
列出容器資訊
# 命令格式:
docker ps [OPTIONS]
# 命令引數(OPTIONS):
-a 顯示所有的容器,包括未執行的。
-f 根據條件過濾顯示的內容。
--format 指定返回值的模板檔案。
-l 顯示最近建立的容器。
-n 列出最近建立的n個容器。
--no-trunc 不截斷輸出。
-q 靜默模式,只顯示容器編號。
-s 顯示總的檔案大小。
# 命令演示:
docker ps #列出所有在執行的容器資訊
docker ps -a #檢視所有的容器,包括未執行的
docker ps -a -q #列出所有建立的容器ID
docker ps -n 5 #列出最近建立的5個容器資訊
CONTAINER ID | IMAGE | COMMAND | CREATED | STATUS | PORTS | NAMES |
---|---|---|---|---|---|---|
容器ID | 映象名稱 | 容器啟動以後的第一個命令 | 容器建立時間 | 容器執行狀態 | 埠對映 | 容器名稱 |
狀態有7種:
- created(已建立)
- restarting(重啟中)
- running(執行中)
- removing(遷移中)
- paused(暫停)
- exited(停止)
- dead(死亡)
列出容器 – docker container ls
sudo docker container ls # 所有正在啟動執行的容器列表
sudo docker container ls --all # 所有容器[不管是否在啟動執行中]
容器建立 – docker create
# 作用:
利用映象創建出一個Created 狀態的待啟動容器
# 命令格式:
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
# 命令引數(OPTIONS):
-t, --tty 分配一個偽TTY,也就是分配虛擬終端
-i, --interactive 即使沒有連線,也要保持STDIN開啟
--name 為容器起名,如果沒有指定將會隨機產生一個名稱
# 命令引數(COMMAND\ARG):
COMMAND 表示容器啟動後,需要在容器中執行的命令,如ps、ls 等命令
ARG 表示執行 COMMAND 時需要提供的一些引數,如ps 命令的 aux、ls命令的-a等等
# 命令演示:
docker create --name test-container centos ps -A
docker create -ti --name test-container2 centos /bin/bash
docker ps -a # 檢視所有的容器,包括未執行的
容器啟動 – docker start
# 作用:
將一個或多個處於建立狀態或關閉狀態的容器啟動起來
# 命令格式:
docker start [OPTIONS] CONTAINER [CONTAINER...]
# 命令引數(OPTIONS):
-a, --attach 將當前shell的 STDOUT/STDERR 連線到容器上
-i, --interactive 將當前shell的 STDIN連線到容器上
# 命令演示:
docker container start <容器名稱/容器ID>
docker ps -a
docker start -a 65ebc
docker start test-container2
# 啟動多個容器
docker container start <容器名稱/容器ID> <容器名稱/容器ID>
容器建立並啟動 – docker run
# 作用:
利用映象建立並啟動一個容器
# 命令格式:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# 命令引數(OPTIONS):
-t, --tty 表示容器啟動後會進入其命令列終端
-i, --interactive 表示以“互動模式”執行容器,就是允許開發者通過輸入裝置輸入命令到容器裡面。
--name 為容器起名,名稱必須唯一,如果沒有指定將會隨機產生一個名稱
-d, --detach 建立一個守護式容器在後臺執行(這樣建立容器後不會自動登入容器,如果只加-i -t 兩個引數,建立後就會自動進去容器)
-p 指定埠對映,格式為:主機(宿主)埠:容器埠
--network=host 指定容器的網路連線型別,如果指定了--network=host就不要指定-p
--restart=always docker在關閉以後,內部所有的容器都會關閉,在docker重啟的時候,是否要自動重啟容器
-v 把docker外接的目錄和指定容器內部的目錄進行對映,共享檔案,格式為:主機(宿主)路經:容器路徑
--rm 當容器退出執行後,自動刪除容器
-e 變數名="變數值" 設定環境變數
# 命令引數(COMMAND\ARG):
COMMAND 表示容器啟動後,需要在容器中執行的命令,如ps、ls 等命令
ARG 表示執行 COMMAND 時需要提供的一些引數,如ps 命令的 aux、ls命令的-a等等
# 命令演示:
docker run <引數選項> <映象名稱:版本號> <啟動以後執行的第一條命令>
docker run hello-world
docker run centos ps -A
docker run -d centos ps -A
docker run --rm -d centos ps -A
docker run -d centos ps -A
docker run -itd --name=ubuntu2 ubuntu<:版本> ubuntu #建立一個名為ubuntu2,並且在後臺執行的容器
docker run -itd --name=mysql -p3308:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
docker run 與 docker create + docker start
docker run 相當於 docker create + docker start –a 前臺模式
docker run -d 相當於 docker create + docker start 後臺模式
容器暫停 – docker pause
# 作用:
暫停一個或多個處於執行狀態的容器
# 命令格式:
docker pause CONTAINER [CONTAINER...]
# 命令引數(OPTIONS):
無
# 命令演示
docker ps -a
docker pause test-container2
docker ps -a # 容器是Pause狀態
容器取消暫停 – docker unpause
# 作用:
取消一個或多個處於暫停狀態的容器,恢復執行
# 命令格式:
docker unpause CONTAINER [CONTAINER...]
# 命令引數(OPTIONS):
無
# 命令演示:
docker unpause test-container2
docker ps -a # 處於執行狀態
容器關閉 – docker stop
# 作用:
關閉一個或多個處於暫停狀態或者執行狀態的容器
# 命令格式:
docker stop [OPTIONS] CONTAINER [CONTAINER...]
# 命令引數(OPTIONS):
-t, --time int 關閉前,等待的時間,單位秒(預設 10s)
# 命令演示:
docker stop -t 1 <容器名稱/容器ID>
容器終止 – docker kill
# 作用:
強制並立即關閉一個或多個處於暫停狀態或者執行狀態的容器
# 命令格式:
docker kill [OPTIONS] CONTAINER [CONTAINER...]
# 命令引數(OPTIONS):
-s, --signal string 指定傳送給容器的關閉訊號 (預設“KILL”訊號)
# 命令演示:
docker kill <容器名稱/容器ID>
docker stop和docker kill的區別
# 一 前提知識點:
1 Linux其中兩種終止程序的訊號是:SIGTERM和SIGKILL
2 SIGKILL訊號:無條件終止程序訊號。
程序接收到該訊號會立即終止,不進行清理和暫存工作。
該訊號不能被忽略、處理和阻塞,它向系統管理員提供了可以殺死任何程序的方法。
3 SIGTERM訊號:程式終結訊號,可以由kill命令產生。
與SIGKILL不同的是,SIGTERM訊號可以被阻塞和終止,以便程式在退出前可以儲存工作或清理臨時檔案等。
# 二 docker stop 會先發出SIGTERM訊號給程序,告訴程序即將會被關閉。在-t指定的等待時間過了之後,將會立即發出SIGKILL訊號,直接關閉容器。
# 三 docker kill 直接發出SIGKILL訊號關閉容器。但也可以通過-s引數修改發出的訊號。
# 四 因此會發現在docker stop的等過過程中,如果終止docker stop的執行,容器最終沒有被關閉。而docker kill幾乎是立刻發生,無法撤銷。
# 五 此外還有些異常原因也會導致容器被關閉,比如docker daemon重啟、容器內部程序執行發生錯誤等等“異常原因”。
容器重啟 – docker restart
# 作用:
重啟一個或多個處於執行狀態、暫停狀態、關閉狀態或者新建狀態的容器
該命令相當於stop和start命令的結合
# 命令格式:
docker restart [OPTIONS] CONTAINER [CONTAINER...]
# 命令引數(OPTIONS):
-t, --time int 重啟前,等待的時間,單位秒(預設 10s)
實則是關閉前等待的時間
容器刪除 – docker container rm
# 作用:
刪除一個或多個容器
# 命令格式:
docker container rm [OPTIONS] CONTAINER [CONTAINER...]
或者 docker rm [OPTIONS] CONTAINER [CONTAINER...]
# 命令引數(OPTIONS):
-f, --force 強行刪除容器(會使用 SIGKILL訊號)
-v, --volumes 同時刪除繫結在容器上的資料卷
# 命令演示
docker container rm <容器名稱/容器ID>
複製檔案
因為容器都是最小化安裝的軟體/系統,所以在容器內部連編輯檔案的vim都沒有,所以這裡我們需要在容器外編輯好檔案以後再複製到容器內部。
docker container cp <原地址>:<新地址>
1. 從外界複製檔案到指定容器中
docker container cp <路徑/檔名> <容器名稱/容器ID>:<路徑/檔名>
2. 從容器內部複製檔案到外界來
docker container cp <容器名稱/容器ID>:<路徑/檔名> <路徑/檔名>
把容器儲存成docker映象
docker commit <容器名稱/容器ID> <新映象名>:<自定義版本號>
容器資訊檢視
容器詳細資訊 – docker container inspect
# 作用:
檢視本地一個或多個容器的詳細資訊
# 命令格式:
docker container inspect [OPTIONS] CONTAINER [CONTAINER...]
或者 docker inspect [OPTIONS] CONTAINER [CONTAINER...]
# 命令引數(OPTIONS):
-f, --format string 利用特定Go語言的format格式輸出結果
-s, --size 顯示總大小
# 命令演示
docker container inspect -f "{{json .State.Status}}" 容器id
docker container inspect 容器id
容器日誌資訊 – docker logs
# 作用:
檢視容器的日誌資訊
# 命令格式:
docker logs [OPTIONS] CONTAINER
# 命令引數(OPTIONS):
--details 顯示日誌的額外資訊
-f, --follow 動態跟蹤顯示日誌資訊
--since string 只顯示某事時間節點之後的
--tail string 顯示倒數的行數(預設全部)
-t, --timestamps 顯示timestamps時間
--until string 只顯示某事時間節點之前的
# 注意:
容器日誌中記錄的是容器主程序的輸出STDOUT\STDERR
容器重新命名 – docker rename
# 作用:
修改容器的名稱
# 命令格式:
docker rename CONTAINER NEW_NAME
# 命令引數(OPTIONS):
無
容器執行時操作
容器連線 – docker attach
# 作用:
將當前終端的STDIN、STDOUT、STDERR繫結到正在執行的容器的主程序上實現連線
# 命令格式:
docker attach [OPTIONS] CONTAINER
# 命令引數(OPTIONS):
--no-stdin 不繫結STDIN
# 命令演示
docker attach 1e560fca3906
進入容器 – docker exec
# 作用:
在容器中執行一個命令
# 命令格式:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
# 命令引數(OPTIONS):
-d, --detach 分離模式: 在後臺執行
-i, --interactive 即使沒連線容器,也將當前的STDIN繫結上
-t, --tty 分配一個虛擬終端
-w, --workdir string 指定在容器中的工作目錄
-e, --env list 設定容器中執行時的環境變數
# 命令演示
#進入容器
docker container exec -it <容器名稱/容器ID> <第一個命令>
總結
![](https://raw.githubusercontent.com/cwyfengyiyuan/images/master/1598085511_20200822160847299_9473.png =1200x)