1. 程式人生 > 實用技巧 >docker容器操作

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)