docker 小筆記 [1] -- images, containers, repos
最近在讀 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
ros latest 8a7e989864db 11 months ago 1.25GB
ubuntu latest a2s15aabcdf3 11 months ago 64.2MB
ubuntu 16.04 27c1f2y85025 13 months ago 119MB
有 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 IMAGE COMMAND CREATED STATUS PORTS NAMES
205b1b2b85dc ubuntu "/bin/bash" 2 minutes ago Up 2 minutes lucid_sammet
fdf6645b469f ubuntu "/bin/bash" 5 minutes ago Exited (0) 5 minutes ago loving_benz
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 為例
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
base/archlinux Deprecated repository, use archlinux/base in… 328 [OK]
archlinux/base Docker Base Image for Arch Linux 169
archlinux Arch Linux is a simple, lightweight Linux di… 117 [OK]
pritunl/archlinux NO LONGER MAINTAINED 100
下載 image
docker pull archlinux:latest
建立容器並啟動
docker run -it
在容器內做一些更改 (下載套件等)
退出容器並存成 image
docker commit