Docker Commands

Images

# 取得鏡像
# options : 選項
#   |- 如 --help
# Docker Registry URL : 預設為 Docker Hub
#   |- 如 IP/URL:Port
# Repository : [source/]<名稱>
#   |- 若不指定 source,則為官方 (library)
# Tag : 多為版本,若不指定,則為 latest
docker pull [options] [Docker Registry URL] <Repository>:<Tag>

# 列出鏡像
# -a : 顯示中間層鏡像
# -q : 僅顯示鏡像 SHA
# -f dangling=true : 列出所有虛懸鏡像 TAG 為 <none>
# Repository name : 僅顯示某一資料庫的鏡像
# -f : 篩選器
# label name : 鏡像標籤名
# --format : 依格式顯示
#   |- regular 定義格式,如 table {{.ID}}\t{{.Repository}}\t{{.Tag}}
# --digests : 摘要 (SHA)
docker images [-a] [-q] [-f dangling=true] [Repository name]
docker images [-f [since=<Repository>:<Tag>|label=<label name>]]
docker images [--format "<regular>"] [--digests]

# 查看鏡像 commit 版本歷史
docker history <Repository>:<Tag>

# 對 Dockerfile 進行建構
# -t : 指定新建構的鏡像名稱
# . : 表示將當前目錄打包送至 Docker Engine 進行建構
# -f : 指定要進行建構鏡像的路徑及檔名
# URL : 支援直接自 URL 進行建構,如 git repository
# gzip|bzip2|xz : 支援來自壓縮檔的建構
# - < : 表式來字標準輸入
docker build <[-t <Repository>:<Tag> .|-f <path/filename>|<URL>|<gzip|bzip2|xz>| - < <fileName>]>
# 支援 pipeline 方式進行建構
# 但此方式不支援如 COPY 等上下文的建構方式
cat Dockerfile | docker build -

# 直接匯入一個壓縮包形成鏡像
# Tar : 壓縮檔,如 gzip, bzip2 等
# URL : 連結
# - : 標準輸入
docker import [options] <Tar|URL|-> [<Repository>[ :<Tag>]]

# 建立不需進行打包入 Docker 進行建構的忽略規則,類似 .gitignore
touch .dockerignore
vim .dockerignore

# 保存鏡像,可以配合 pipeline
# pipeline:
#   |- 如 " | gzip > fileName.tar.gz "
docker save <Repository>[ :<Tag>] [pipeline]

# 載入鏡像
# -i : 輸入字串
# 範例 :
# docker save <镜像名稱> | bzip2 | pv | ssh <用户名>@<主机名> 'cat | docker load'
docker load -i <fileName>

# 刪除鏡像
# 刪除虛懸鏡像 : [-f dangling=true]
docker rmi <<Repository>:<Tag>|<SHA>>
docker rmi $(docker images -q [Repository Name|-f dangling=true])

Dockerfile

# 指定基礎鏡像
# scratch : 空白鏡像,後續第一項指令作為第一層
From <Repository>:<Tag>
From scratch

# 將 local 當時上下文 (Context) 目錄的文件複製進鏡像內的位置
# 目標路徑可以不需事先創建
# Source : 來源檔案,當時上下文目錄檔案
# Target : 目的位置,鏡像內絕對位置
# 範例 : Copy package.json /usr/src/app/path
Copy <Source>[ <Source 2> [<Source 3>]] <Target>

# 將當時上下文 (Context) 目錄的 local 文件加入進鏡像
# Add 相較 Copy 有更多的功能,如自解壓縮等,但語義在不同來源上有很多差異,並不建議使用
Add <Source> <Target>

# 執行指令,執行完後即 commit 成新一層
# 寫法應為一次 Run 一整個相關操作的步驟,且清除無關文件
# shell : 即 batch 指令
# exec : 類似函式調用方式,即 ["可執行腳本", "傳入參數1", "傳入參數2"]
# 範例 :
# RUN buildDeps='gcc libc6-dev make' \
#     && 'apt-get update' \
#     && apt-get install -y $buildDeps \
#     && apt-get purge -y --auto-remove $buildDeps
Run <shell|exec>

# 執行指令,不同於 Run 的是 Cmd 為容器運行時執行指令
# Docker 運行指令
# shell : 即 batch 指令
# exec : 類似函式調用方式,即 ["可執行腳本", "傳入參數1", "傳入參數2"]
# params : ["參數1", "參數2"]
#   |- 如果指令為 shell 格式,則命令會被包裝成 sh -c 執行,且格式被解析為 JSON 數組
#   |- 如 echo $HOME 指令被解析成 CMD ["sh", "-c", "echo $HOME"]
Cmd <shell|exec|params>

# 執行指令,設定容器組態來準備運行其他指令,與 Cmd 相同在容器運行時執行指令
# 不同於 Cmd,Entrypoint 讓鏡像變成像命令一樣使用,且可以運行 Cmd 前作一些準備工作
# shell : 即 batch 指令
# exec : 類似函式調用方式,即 ["可執行腳本", "傳入參數1", "傳入參數2"]
Entrypoint <shell|exec> 

# 設定環境變數,或如 batch 中宣告之變數
# key : 變數名
# value : 設定的値
Env <key> <value>
Env <key1>=<value1>[ <key2>=<value2>[ <key3>=<value3>]]

# 建構環境變數
# 與 Env 不同的是建構鏡像後 Arg 所建立的變數於容器運行不會存在
# 但 docker history 指令仍可以看到
# 可以用 docker build --build-arg <key1>=<value1> 於建構時進行覆蓋
Arg <key1>=<value1>

# 定義匿名資料卷
# 預先指定某些目錄掛載為匿名卷,即使運行終使用者忘記掛載,也不會向容器寫入大量數據
# Path : 容器中的路徑,如 /data,容器運行時,任何向 /data 寫入訊息皆不會記錄進儲存庫
Volume <Path>
Volume ["<Path1>", "<Path2>", ...]

# 聲明容器使用端口,並不等於和 Host Port 對映
# Port : 端口,如 80
Expose <port>[ <port2>]

# 改變之後各層工作目錄位置
# Path : 目錄位置,若無會自動建立
Workdir <Path>

# 改變之後各層當前用戶
# 轉換身份,建議用 gosu 指令
# Name : 用戶名,需事先建立 (e.g. useradd)
User <Name>

# 檢查容器健康狀況,僅能出現一次,多寫僅最後一次指令生效
# --interval=<Peroid> : 檢查狀況的期間
# --timeout=<Time> : 執行檢查期間,超過視成失敗
# --retries=<Count> : 連續幾次失敗後,檢查視為 unhealthy
# shell : 即 batch 指令
# exec : 類似函式調用方式,即 ["可執行腳本", "傳入參數1", "傳入參數2"]
# Cmd 指令回傳値代表檢查狀況,0 : 成功,1 : 失敗,2 : 保留 (建議不使用)
# 可以透過 docker ps -a 來看目前檢查狀況
# 亦可以透過 docker inspect <sha/name> | python -m json.tool
Healthcheck [--interval=<Peroid>|--timeout=<Time>|--retries=<Count>] Cmd <Shell|Exec>

# 僅於基礎鏡像才執行的指令
Onbuild <Cmd|Run|Copy| ...>

Containers

# 查看目前所有容器資訊
# -a : 所有容器,不論是否運行中
# -q : 僅顯示容器摘要碼
docker ps [-a|-q]

# 以鏡像為基礎運行一個容器
# options
#   |- -i : 介面交互操作
#   |- -t : terminal
#   |- --rm : 容器關閉後隨即刪除
#   |- --name : 指定容器一個名稱
#   |- -d : run on the daemon (background)
#   |- -p : Port forwarding,指定端口,可以指派多組
#     |- binding-IP : 要綁定的 IP 或 URL (例如 127.0.0.1),未填則默認所有位置
#   |- -P : Port forwarding,非指定端口,隨機分派宿主端口
#   |- -v : 掛載資料卷
#     |- volName : 資料卷 Host 位置
#     |- path : 容器掛載位置
#     |- auth : 容器讀取權限,如 ro (read-only)
#   |- --volumes-from : 掛載來自其他 container 的資料卷 (資料共用)
#   |- --link : 容器間相互連接,可以透過 
#               (1) 容器內 cat /etc/hosts 查看 (下 --link 指令的容器)
#               (2) 於 docker run 指令時顯示環境變數 env 即可
#     |- Sha/Name : 要連接的 container Sha 或 name
#     |- alias : 此連線的別名
# Exec : 執行指令
docker run [options] <Repository>:<Tag> [Exec]
docker run \
    [-i] [-t] [--rm] [--name <name>] [-v <volName>:<path>[:auth]] \
    [--volumes-from <sha/name>] [-d] [-P] \
    [[-p [<binding-IP>:]<host Port>:<container Port>[:<TCP|UDP>]]*]\
    [--link <sha/name>:<alias>]\
    <Repository>:<Tag> <Exec>

# 啟動已終止的容器
# Sha : 容器摘要碼
# Name : 容器名稱
docker start <Sha|Name>

# 進入在背景運行的容器
# -i : 交互操作
# -t : 終端機
# 範例 :
# docker exec -it webserver bash
docker exec [-i] [-t] <sha/name> <exec>

# 進入在背景運行的容器,和 exec 不同的是
# |- attach 為唯一執行個體,僅管多個 attach 仍會同步內容
# |- attach 僅在容器啟動時工作目錄為 /bin/bash 下才能使用,否則需用 exec 轉換
docker attach <Sha|Name>

# 終止容器運行
# Sha : 容器摘要碼
# Name : 容器名稱
docker stop <Sha|Name>

# 重啟容器運行
# Sha : 容器摘要碼
# Name : 容器名稱
docker restart <Sha|Name>

# 容器儲存層變動紀錄
docker diff <sha/name>

# 將儲存層合併入鏡像層成為新的鏡像
# options 如下
#   |- 作者 : --author <Name <Email>>
#   |- 訊息 : --message <info>
docker commit [options] <Container SHA/NAME> [<Repository>[:Tag]]

# 查看目前容器狀況
# --format : 輸出格式,例如 {{json .State.Health}}
docker inspect --format <format> <sha/name> 

# 獲取容器輸出的訊息,包含背景運行的輸出
# Sha : 容器摘要碼
# Name : 容器名稱
docker logs <Sha|Name>

# 查看容器映射宿主網路端口狀況
docker port <Sha|Name>

# 導出容器,不同於 Commit 為 export 並不會儲存成新的鏡像
docker export <Sha|Name>

# 導入容器快照成鏡像
# 注意 :
# |- 若用 docker export 的容器快照為來源,則 docker import 與 docker load 匯入結果不同
# |- docker load 會僅載入鏡像部分,因 docker export 並沒有 commit 的結果,
# |- docker load 會損失容器儲存層(尚未 commit 入鏡像部分會遺失)
# - 為標準輸入,常配合 pipeline 使用
# |- 如 cat ubuntu.tar | docker import - ubuntu:latest
docker import <URL|Path|-> <Repository>[:<Tag>]

# 移除終止的容器
# container Sha/Name : 容器 SHA 碼或是名稱
# -f : 刪除運行中的容器
# -v : 刪除資料卷
# $(docker ps -a -q) : 刪除所有容器,默認不刪除運行中容器
docker rm [-f|-v] <container Sha/Name>
docker rm $(docker ps -a -q)

Repository

# 登入 Repository Registry (如 Docker Hub)
# 帳戶訊息存放於本地目錄的 .dockercfg
docker login

# 搜尋倉庫中的鏡像
# stars=N : 搜尋幾顆星以上的儲存庫
docker search [--filter=<stars=N>] <Repository>

# 將鏡像推送到 Repository Registry
# Repository : 儲存庫名,可能為軟體名或使用者名
# Tag : 標籤,可能為版本或軟體名
docker push <Repository>/<Tag>

# Docker hub 支援 Automated Builds (自動創建)
# 目前支援 Github 與 Bitbucket,當有新 commit 時,會自動創建

# 構建私有的鏡像倉庫,背景運行及映射 port 至宿主 OS
# docker-registry 為 docker 官方提供的工具
# <host-port>:<container-port> : 映射容器端口至宿主端口
# 範例:
# sudo docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
#   |- 預設倉庫被創建於容器的 /tmp/registry 底下
#   |- 透過 -v 將上傳的鏡像放置於本地 /opt/data/registry 位置
# Private Docker Hub 服務確認範例
#   |- 取得 Docker-API-Version : 
#      curl -v http://localhost:5000/v2/
#   |- 取得 ubuntu/latest (已 push 成功後) 的資訊 :
#      curl http://localhost:5000/v2/ubuntu/manifests/latest
docker pull registry:latest
docker run -d \
    [-p <host-port>:<container-port>] [-v <local-path>:<contaniner-path>] \
    registry 

# 標記要上傳至 Private Docker Hub 的 image
# Local-Repository : 本地鏡像
# Hub <IP|URL> : 私有 Docker 註冊器 IP 或 URL
# 範例:
# |- docker tag hello-world:latest localhost:5000/hw:latest
docker tag <Local-Repository>[:<Tag>] <Hub <IP|URL>[:Port]/[<User|Repository>[:<Tag>]]>

# 上傳已標記的鏡像至 Private Docker Hub
# 範例:
# |- docker push localhost:5000/hw:latest
# 查看倉庫中鏡像:
# |- $ curl -v http://localhost:5000/v2/<name>/manifests/<reference>
# |- 範例 : curl -v http://localhost:5000/v2/hw/manifests/latest
docker push <Tagged-Image>

# 自 Private Docker Hub 下載已標記的鏡像
# 範例:
# |- docker pull localhost:5000/hw:latest
docker pull <Tagged-Image>

results matching ""

    No results matching ""