docker 小筆記 [1] -- images, containers, repos
Contents
最近在讀 docker 相關的東西,不記錄一下很快就忘了,也不知道看了什麼。 這篇主要會是 images, containers, repos 的常用指令。
虛擬化技術和 docker 的簡介這裡先略過了,直接從 docker 相關概念和指令開始。
[TOC]
三個基本概念
- images
- repositories
- containers
images (映像檔)
- 唯讀的模板
- 用來建立 Docker container
取得 images
docker pull
e.g. docker pull ubuntu:latest
冒號後的 tag 如果沒有特別指名預設就是 latest
查詢 images
docker search
列出 images
docker images
|
|
有 REPOSITORY、TAG、IMAGE ID、CREATED、SIZE 這五個欄位。特別提一下 IMAGE ID 他是 SHA-256 產生的,長度為 64 的十六進位字串,這裡只顯示了前幾個字元。
取得 image 詳細資訊
docker inspect ubuntu
docker inspect 8a
如果用 id 指定 image 時,只要給到足夠長讓他可以唯一對應就行了,但一個字元似乎不行,最少要兩位以上(?
建立 images
修改已有的 image
步驟大致是這樣:
- 從已有的 image 啟動一個容器
- 在這個容器裡做一些修改 (e.g. 裝一些套件)
- 用
docker commit
提交更新過後的版本,存成新的 image - 之後就可以用這個新的 image 啟動容器
用 Dockerfile 建立 image
用 docker build <Dockerfile>
來新建 image
Dockerfile 寫法
#
是註解- FROM : 從哪個 image 作為基底
- 維護者訊息
- RUN : 執行甚麼指令
Dockerfile 中每一條指令都會建立一層映像檔 (不能超過 127 層)
補充一下,CMD 是啟動 docker 容器後預設執行的指令,例如
匯出 & 匯入 images
匯出
docker save
e.g. docker save ubuntu:latest > ubuntu.tar
匯入
docker load
e.g. docker load -i ubuntu.tar
e.g. docker load < ubuntu.tar
移除 images
docker rmi
要先把使用這個 image 的容器殺掉才能 rmi
(-f
可以強制但不建議,不知道會出什麼錯)
Repositories (倉庫)
- 存放 images 的地方
- 概念和 github 類似
Docker Hub 是 Docker 官方維護的公共倉庫,可以在上面找需要的 images。
也可以自己建立私有倉庫,這裡先略過。
Containers (容器)
- 從 image 建立的執行實例
- 簡易 Linux 環境
- 每個容器都是互相隔離的
新建容器
docker create
啟動容器
這裡先稍微整理一下
docker create
: 新建容器docker start
: 啟動容器docker run
: 建立並啟動容器 ( =docker create
+docker start
的組合)
docker run -it ubuntu /bin/bash
其中, -t
/ --tty
讓 docker 分配一個虛擬終端,並綁定到容器標準輸入 ; -i
/ --interactive
讓容器的標準輸入維持打開,以進行互動。
docker 容器分成以下兩種運行狀態
- 前台互動式 (參數:
-i
) - 後台守護 (Daemonized) (參數:
-d
)
無法讓容器同時在前台和後台執行,所以不能同時下 -i -d
進入容器
操作進入背景執行的容器
exec
attach
nsenter
這裡指令參考自 《Docker —— 從入門到實踐》,之後用到了再補。
docker logs <container>
可以查看容器的輸出訊息
列出容器
- 查看運行中的容器
docker ps
- 查看所有容器
docker ps -a
|
|
CONTAINER ID 和 NAMES 是用來識別這個容器的 key。
STATUS 是容器執行的狀態,有 Up、Paused、Exited (等?)
建立的容器很多時,可以用下列參數幫忙快速找到指定的容器
-l
/--last
: 列出最後建立的容器-n <n>
/--last <n>
: 列出最後 n 個建立的容器-f "key=value"
/--filter "key=value"
: 根據 id、label、status、volume、network 等條件做篩選
停止容器
當容器指定的應用終結時,容器也自動終止。對於只啟動一個終端機的容器,透過 exit
或 Ctrl+D
退出終端機時,所建立的容器也隨之終止。也可以透過以下指令停止一個容器。
docker stop
: 停止運行中的容器
docker 會向容器繫結的主程序傳送 SIGTERM 訊號 ; 如果程式沒有在指定時間內停止,docker 會發送 SIGKILL 強制停止。
這個指定的時間預設是 10 秒,也可以透過 -t <sec>
/ --time <sec>
更改這個時間。
docker kill
: 強制停止運行中的容器
docker 直接送 SIGKILL 訊號,強制停止程式。
docker kill
後面接 -s <sig>
/ --signal <sig>
也可以傳送指定訊號給容器。(有點像在 terminal 中下 kill 指令)
暫停 / 恢復 容器
-
docker pause
: 暫停 (像休眠) -
docker unpause
:
重啟容器
docker restart
( = docker stop
+ docker start
的組合,先停止後再重新啟動)
刪除容器
docker rm
正在運行中的容器不會被刪除 ; 如果要刪除運行中的容器,要加上 -f
/ --force
的參數,此時 Docker 會先送出 SIGKILL 訊號,強制停止該容器後再刪除容器。
(刪除 images 的指令是 docker rmi
,rm 後多了一個 i)
小技巧 : 刪除所有容器 (不加 -f
只會刪非運行中的)
docker rm $(docker ps -a -q)
匯出 / 匯入 容器
docker export
: 匯出容器快照到檔案docker import
: 把容器快照檔案匯入為 images
使用情境
搜尋 image
docker search archlinux
這裡以 archlinux 為例
|
|
下載 image
docker pull archlinux:latest
建立容器並啟動
docker run -it
在容器內做一些更改 (下載套件等)
退出容器並存成 image
docker commit
參考資料
Author cchenglo
LastMod 2020-08-04