Docker
、Container
、DevOps
圖片來源:Gitbook - 《Docker —— 從入門到實踐》正體中文版 by Philipzheng
詳情請參考官方的 Docker (base command) | Docker Documentation 文件。
info
:查看 Docker 系統資訊顯示以下訊息:
pull
:取得 (拉取) imagelatset
版Already exists
?在 pull image 時,如果主機內已有的 image 中有某些地方相同,就不需要再 pull 一次,就很像 git pull
一樣,不會從頭到尾全部 pull,只會 pull 不同的地方images
:查看目前 image-a
,--all
:顯示所有 image (包含 intermediate layers 的 image)-q
,--quiet
:只顯示 image id在列出訊息的欄位介紹:
REPOSITORY
:來自於哪個 repository,EX:ubuntuTAG
:image 的標記,如果沒有指定 TAG,預設使用 latest
,EX:14.04IMAGE
ID:image id(唯一)CREATED
:建立時間SIZE
:image 大小ps
:顯示目前 container 狀態-a
,--all
:顯示所有 container-q
,--quiet
:只顯示 container id列出訊息的欄位介紹:
CONTAINER ID
:容器 id,唯一標識IMAGE
:使用哪個 image 作為基底COMMAND
:以什麼方式運行,??? ??? ???CREATED
:建立時間STATUS
:執行狀態,什麼時候停止執行、執行多久時間,Exited
為停止執行狀態,Up
為執行狀態PORTS
:host 對外開 x port -> container 內開 x portNAMES
:容器名稱port
:查詢 container port 的對應狀況run
:新建並啟動 containerlatset
版-d
:背景 (Daemonized) 執行並列印 container ID-P
:會從 host 中隨機取一個 port 出來使用-p [hostIP]:[hostPort]:[ContainerPort]
-p 8080:80
:指定一個 port,host 對外開 8080 port,container 對內開 80 port-p 5000:5000 -p 8080:80
:同時指定多個 port-p 127.0.0.1:5000:5000
:指定特定的 ip address & port-p 127.0.0.1::5000
:指定特定的 ip address,但不指定 port-p 127.0.0.1:5000:5000/udp
:指定不同協定,例如 udp--name [containerName]
:設定 container 名稱,不必經過 build 才設
boring_perlman
-e
-e MYSQL_ROOT_PASSWORD=password
:設定 root 密碼 = password
docker run --name mymariadb -e MYSQL_ROOT_PASSWORD=password -d -p 3306:3306 mariadb:10.3
--env
docker run --env VAR1=value1 --env VAR2=value2 ubuntu env
--env-file
docker run --env-file ./env.list ubuntu env
-it
:此 container 具備了標準輸入 (即你目前使用的鍵盤) 和標準輸出 (即你目前操作的終端)
-i
,--interactive
:互動模式,讓 container 的標準輸入 (STDIN) 保持打開 (建立與容器標準輸入的互動進行連結)-t
,--tty
:可使用終端機操作,讓 Docker 分配一個虛擬終端 (pseudo-TTY,PTY) 並綁定到 container 的標準輸入 (STDIN) 上-d
參數一起使用-v
,--volume
:掛載主機上的指定目錄到 container 的指定目錄上 (將主機上的目前目錄 bind 到 container 的指定目錄)
-v [hostPath]:[containerPath]
:掛載主機上的指定 [hostPath]
目錄到 container 的指定目錄 [containerPath]
上-v `pwd`:/home/app
:任何在 pwd
(目前) 目錄的文件都將會出現在容器內。這對於在主機和容器之間共享文件是非常有幫助的,例如掛載需要編譯的源代碼。為了保證可移植性 (並不是所有的系統的主機目錄都是可以用的),掛載主機目錄不需要從 Dockerfile 指定。當使用 -v
參數時,鏡像目錄下的任何文件都不會被覆制到 Volume 中。 (註:Volume 會複製到鏡像目錄,鏡像不會複製到卷):ro
即可,container 內的綁定目錄是唯讀
docker run --name mynginx -v `pwd`:/usr/share/nginx/html:ro -d -p 80:80 nginx:1.13
:rw
即可-v
時會產生 volume (較進階),之後研究:https://philipzheng.gitbooks.io/docker_practice/content/data_management/volume.html--rm
:container 執行結束後就刪除 container,可以避免 container 在執行結束後有殘存東西,EX:volume。--link [containerName]:[containerAlias]
:連結某個 container,讓 container 之間安全的進行互動。其中 containerName
是要連接的容器名稱,而 containerAlias
是這個連接的別名。--expose
:從 container 開放 port--privileged
:容器會被允許直接設定主機的網路堆棧 (Network stack)
docker run
時加上 --privileged
參數才行。exec
在一個正在執行的容器執行指令
rename
:Container 重新命名cp
:從 Container 複製檔案出來attach
:進入 Container-d
模式後,attach container 會回到此 conatiner console,"ctrl-p, ctrl-q detach"
attach 進去此 Container,若沒有用 detach
而是 exit
離開,此 Container 也會跟著離開而結束
logs
:列出 Logsinspect
:查看 Container 詳細資訊stop
、kill
:停止執行 containerKill 跟 Stop 的差別:
- kill:不管容器同不同意,發送 SIGKILL 信號,強行終止
- stop:先給容器發送一個 TERM 信號,讓 container 做一些退出前必須的保護性、安全性操作,然後讓 container 自動停止執行,如果在一段時間 (10s) 內,container 還是沒有停止,再發送SIGKILL信號,強行終止
tag
:修改 tagcommit
:提交 container 為 image簡寫,名稱 | 預設 | 說明 |
---|---|---|
-a ,--author |
false | 作者 |
-m ,--message |
false | 提交訊息 |
-p ,--pause |
true | 提交期間暫停執行容器 |
push
:上傳 image 至 registryrm
:刪除 container簡寫,名稱 | 預設 | 說明 |
---|---|---|
-f ,--force |
false | 強制刪除正在執行的容器,Docker 會發送 SIGKILL 信號給容器 |
-l ,--link |
false | 清理指定的 link |
-v ,--volumes |
false | 清理與容器關聯的 volume |
注意:在刪除 container 之前要先用 docker stop
指令停止執行此 container,要不然就要使用 -f
參數強制刪除正在執行的 container。
-f
,--force
:強制刪除正在執行的容器,Docker 會發送 SIGKILL 信號給容器
$()
:變數docker ps
:顯示目前 container 狀態
-a
,--all
:,顯示所有 container-q
,--quiet
:只顯示 container ID-f
,--filter
:篩選參考連結:清理 Docker 的 container、image 與 volume by 匿蟒 (yanqd0)
-l
,--link
:清理指定的 link-v
,--volumes
:清理與容器關聯的 volume在 Docker 應用生態中,容器的生成和銷毀是很頻繁的,不過手動去開啟容器,還是利用第三方資源調度工具來開啟 (比如 k8s、mesos)。對於過期、廢棄的容器我們將採用如下方式進行清理。
參考連結:Docker 廢棄資源、碎片清理 by yangtao309
rmi
:刪除 local image簡寫,名稱 | 預設 | 說明 |
---|---|---|
-f ,--force |
false | 強制刪除 image |
--no-prune |
false | 不要刪除未標記的 parent image |
注意:在刪除 image 之前要先用 docker rm
指令刪掉依賴於該 image 的所有 container。
-f
,--force
:強制刪除 image
<none>
,沒有 tag 的 image)在 image 列表中,有一些特殊的 image,既沒有 repo 名,也沒有 tag,均為 <none>
:
這些 image 原本是有 image 名和 tag 的,有些隨著官方 image 維護,發佈了新版本後,重新 pull 同 tag 的 image 時,該 image 名被轉移到了新下載的 image 身上,而舊的 image 上的這個名稱則被取消,從而成為了 <none>
。除了 docker pull
可能導致這種情況,docker build
也同樣可以導致這種現象。由於新舊 image 同名,舊 image 名稱被取消,從而出現 repo 名、tag 均為 <none>
的 image。這類無 tag 的 image 也被稱為 dangling image (虛懸鏡像,或稱 懸掛鏡像),可以用下面的指令專門顯示這類 image:
image 在 Docker 應用生態中扮演重要角色,對一個可運行單元的程式組合,呈現一個獨立的執行基 礎。一般我們在運行 Docker 容器時候,需要從倉庫拉取 image,同樣會出現廢棄 image 需要清理。
stats
:顯示容器即時串流資源的使用統計資料預設顯示所有正在執行的容器資源使用量,包括 CPU、記憶體、網路和磁碟 I/O
-a
,--all
:顯示所有容器