容器(container)是映像檔的一個執行實例(instance),映像檔是靜態的唯讀檔案,而容器帶有運行時需要的可寫入層,獨立執行一個(組)應用系統及他們必須的執行環境。
當docker run將image實體化為容器時,會以這個image(唯獨)為基礎再疊加一層容器儲存層(可讀寫)
建立容器 --> docker create -it ubuntu:latest
啟動容器 --> docker start <container>
以 docker start 再次執行已終止的 container 時,之前對 container 的變更都還會完整存在。因預設情況下,變更會存在掛載的容器存儲層,容器終止時,容器存儲層仍存在。直到 container 被移除(docker rm <container>),容器存儲層才會跟著 container 一起被移除。
建立並啟動容器 --> docker run <image>
手動終止容器的運作 --> docker stop <container>
重新啟動執行中的容器(docker stop + docker start) --> docker restart <container>
進入正在運行的容器進行操作 --> docker exec -it <running_state_container> 或 docker attach <running_state_container>
列出所有本地端的容器 --> docker ps(-a)
強制刪除容器 --> docker rm (-f) <container>
移除所有已終止的容器 --> docker container prune
匯入容器 --> docker import
匯出容器 --> docker export container_ID > ubuntu.tar
可以使用docker create指令新建一個停止狀態的容器,再透過docker start啟動它。
docker create -it ubuntu:latest
docker create 指令有支援許多選項:docker create|Docker Documentation
使用docker start指令啟動已經建立的容器,例如啟動剛剛建立的ubuntu容器:
docker start 1ef190
再透過docker ps可以查詢到此容器已在執行中。
除了建立容器後透過start指令啟動,也能直接建立並啟動容器,使用docker run命令
docker run = docker create + docker start
當下達docker run指令,docker背後會做以下操作:
檢查本地是否有指定的<image>,若無就從registry下載
用<image>建立一個容器並啟動
分配一個檔案系統,在image(唯讀)外頭mount一層容器儲存層(可讀寫)
從Host主機配置的橋接器介面中橋接一個虛擬介面到容器
從橋接器的位址區段配置一個IP位置給容器
執行指定的應用程序
執行完畢後,容器終止。
docker run可分為foreground(前台)和daemonized(背景)兩種模式
foreground(預測) : 直接在宿主主機上執行,並印出過程的log
detached(加上 -d 參數 docker run -d <image>):
回傳所運行的container_ID,不會印出log
使用 docker container logs <container> 可查看log
下面的命令啟動一個bash終端,允許使用者互動
docker run -it ubuntu:14.04 /bin/bash
-t , --tty=true|false : 讓Docker分配一個虛擬終端(pseudo-tty)並綁定到容器的標準輸入上,即可允許我們發送input給容器,預設為false
-i , --interactive=true|false : 設定為互動輸入模式,讓容器的標準輸入保持開啟,預設為false
即可透過建立的終端來輸入命令
對於所建立的bash容器,當使用exit後命令退出後,該容器就自動處於退出(Exited)狀態了。
使用docker stop來停止一個執行中的容器
docker stop [-t|--time[=10]] [CONTAINER]
執行此命令後會先向容器發送SIGTERM信號,等待一段時間(預設為10秒)後,再發送SIGKILL信號來中止容器
在使用-d參數時,容器啟動後會進入背景執行,使用者就無法看到容器中的資訊也無法操作,這時如果要進入容器進行操作,有以下兩種方式:
docker的參數可以合併,故-it = -i -t
在執行中的容器,開啟新的程序,例如 docker exec -it <container_ID> bash 就是在執行中的容器執行bash
docker exec [-d|--detach] [--detach-keys[=[]]] [-i|--interactive] [--privileged] [-t|--tty] [-u|--user[=USER]] CONTAINER COMMAND [ARG...]
支援參數有
-i , --interactive=true|false:開啟標準輸入接受使用者輸入命令,預設為false
--privileged=true|false:是否以特權模式來執行命令,預設為false
-t ,--tty=true|false:分配虛擬終端,預設為false
-u ,--user=" ":執行命令的使用者名稱或UID
例如進入剛建立好的容器中,並啟動一個bash
docker exec -it f229f3f /bin/bash
attach(附加)標準輸入、標準輸出、標準錯誤到執行中的container,而不是像exec在上面開啟新的程序。
一個執行中的container只能被attach一次。
docker attach [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]] CONTAINER ID|CONTAINER NAMES
支援主要三個選項
--detach-keys[=[]]:指定退出attach模式的快速鍵清單,預設是CTRL-p或CTRL-q
--no-stdin=true|false:是否關閉標準輸入,預設是true
--sig-proxy=true|false:是否代理接收到的系統訊號給應用程序,預設為true
當多個視窗同時用attach到同一個容器時,所有視窗都會同步顯示,當某個視窗因命令壅塞時,其他視窗也就無法執行操作了。
可以使用docker rm指令來刪除處於停止或退出狀態的容器
docker rm [-f|--force] [-l|--link] [-v|--volumes] CONTAINER [CONTAINER...]
主要支援的選項有:
-f , --force=false:是否強行停止並刪除一個正在執行中的容器
-l , --link=false:刪除容器的連接,但保留容器
-v , --volumes=false:刪除容器掛載的volume
預設情況下,docker rm紙命令只能刪除處於停止或退出狀態的容器,並不能刪除執行中的容器,除非加上-f參數,docker就會先發送SIGFKILL信號給容器,終止其中的應用程式,之後再強行刪除。
若需要將容器從一個系統搬遷至另一個系統,此時可以使用Docker的匯入匯出功能。
匯出容器會匯出一個已經建立好的容器到一個檔案,不管此時這個容器是否執行中
docker export [-o|--output[=" "]] CONTAINER
可以透過-o選向來指定匯出的tar檔案名稱。
匯入容器可以使用docker import指令導入,變成映像檔
docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|URL|-[REPOSITORY[:TAG]]
可以透過-c ,--change=[]選項在匯入的同時執行對容器實施修改的Dockerfile指令
容器創建時,在唯讀的image上會疊加一層可讀寫的容器儲存層,用來記錄運行中所讀寫的資料,但容器儲存層會隨著 docker rm <container>
一起被刪除,為了保存過程產生的資料,可以指定把資料夾存在Volume或指定的宿主本機目錄。
Volume類似mount宿主主機的目錄/文件,一個volume可以被多個容器共享。
創建一個volume --> docker volume create <volume_name>
查看所有volume --> docker volume ls
查看特定volume的詳細內容 --> docker volume inspect <volume_name>
執行容器時,把volume掛載到容器上 --> docker run --mount 或 -v
上述指令結果可以看到 Mountpoint, 該資訊就是 volume 實際儲存資料的路徑位置。