docker 小筆記 [1] -- images, containers, repos

Page content

最近在讀 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 等條件做篩選

停止容器

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

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 —— 從入門到實踐­》正體中文版