概要

仕事や自宅サーバ構築などでも Docker を使うことが増えてきたので、個人的メモ。
有償版の Docker Desktop ではなく、無償版の Docker Engine CE (Community Edition) の方で、いわゆる CLI 版の話。
この記事は、気が向いたら追記してゆく予定。

インストール

RHEL/Rocky/Alma Linux

# dnf リポジトリの登録
dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
# パッケージインストール
dnf install -y docker-ce docker-compose-plugin

CentOS Stream

※2025-01-07現在で既に CentOS Stream 10 版が用意されていた

# dnf リポジトリの登録
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# パッケージインストール
dnf install -y docker-ce docker-compose-plugin

Ubuntu

apt update
apt install -y ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update
# install Docker packages
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

ブリッジネットワークの払い出しアドレス設定

dockerd はデフォルトで、ローカルで使っていなそうなセグメントを、172.17.0.0/16 などの広い範囲でブリッジとして確保してしまう。 完全自動割当だと社内の他セグメントと衝突することがあり、「リモートVM 上で docker コンテナを起動した瞬間にサーバに接続できなくなった」という事象が発生する。

これを防止するため、docker ブリッジネットワークの払い出し範囲を定義しておく。

例)

  • 172.29.0.0/24 ~ 172.29.255.0/24 までを /24 単位で払い出す
    • 絶対に使わなそうなプライベートアドレスを選んでおく
  • デフォルトの docker0 ブリッジは 172.29.0.0/24 になる
cat <<'__EOT__' >/etc/docker/daemon.json
{
    "default-address-pools":[  
        {  
            "base":"172.29.0.0/16",
            "size":24
        }
    ]
}
__EOT__
systemd restart docker.service

docker compose 等で、新たにブリッジが追加されても、この範囲を逸脱することはなくなる。

起動中と停止中のコンテナ一覧

docker container ls -a

CONTAINER ID   IMAGE                             COMMAND                  CREATED       STATUS                   PORTS                                     NAMES
00b0c16ce586   powerdnsadmin/pda-legacy:latest   "entrypoint.sh gunic…"   7 weeks ago   Up 8 days (healthy)      0.0.0.0:9191->80/tcp, [::]:9191->80/tcp   infallible_mendeleev
d662d485fe03   powerdnsadmin/pda-legacy:latest   "entrypoint.sh gunic…"   7 weeks ago   Exited (0) 7 weeks ago                                             unruffled_allen

コンテナの起動状態と自動起動ステータスを表示

dockerd を再起動した際に自動的に各コンテナを起動するには、コンテナ起動時に --restart フラグをセットする必要がある。

起動中の全コンテナのフラグを確認する分かりやすい方法がないため、下記のような bash ワンライナーを使う。 JSON 応答をパースするため、あらかじめ jq コマンドを入れておくこと。

jq のインストール例 (dnf)

dnf install -y jq

docker container status ワンライナー

sudo docker inspect -f json $(sudo docker ps -a -q) | jq --raw-output '(["ContainerId","ContainerName","Image","State","RestartPolicy"]| (., map(length*"-"))), (.[] | [.Config.Hostname,.Name,.Config.Image,.State.Status,.HostConfig.RestartPolicy.Name]) | @tsv' | column -ts $'\t'

出力例

ContainerId   ContainerName          Image                            State    RestartPolicy
-----------   -------------          -----                            -----    -------------
00b0c16ce586  /infallible_mendeleev  powerdnsadmin/pda-legacy:latest  running  always
d662d485fe03  /unruffled_allen       powerdnsadmin/pda-legacy:latest  exited   no

docker ゴミ掃除

docker のコンテナを差し替えたりリトライしてくると、メモリやディスクにゴミが溜まってくる。

状態の確認

コンテナのリソース消費状況

docker system df

出力例

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          1         1         218MB     0B (0%)
Containers      2         1         0B        0B
Local Volumes   1         1         331.7MB   0B (0%)
Build Cache     0         0         0B        0B

コンテナが使ったブリッジの一覧

docker network ls

出力例

NETWORK ID     NAME      DRIVER    SCOPE
579ed13faf46   bridge    bridge    local
066f87a2cd1c   host      host      local
1b669453f07e   none      null      local

docker 関連リソースを全て削除

docker 関連が喰っているリソースをすべて削除したい場合は、次の手順を実施。

# コンテナ全停止
docker stop $(docker ps -aq)
# コンテナ全削除
docker rm $(docker ps -aq)
# イメージ全削除
docker rmi $(docker images -q)
# ボリューム削除
docker volume rm $(docker volume ls -qf dangling=true)
# ビルドキャッシュ削除
docker builder prune -f
# ネットワークブリッジを削除
docker network prune -f

完了したら、再度 docker system df docker network ls で確認する。

参考

余談

  • docker engine CLI の使い方は、オリジナルのドキュメントがわかりにくくて日本語記事をググって探すのだが、書かれた世代によって使い方が古かったりして混乱する。
  • 自分で試して動いたものをここに書き溜めてゆくことにした。