最近在讀 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

1
2
3
4
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

1
2
3
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 等條件做篩選

停止容器

當容器指定的應用終結時,容器也自動終止。對於只啟動一個終端機的容器,透過 exitCtrl+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 為例

1
2
3
4
5
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

參考資料

《Docker —— 從入門到實踐­》正體中文版