概要
仕事や自宅サーバ構築などでも 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 の使い方は、オリジナルのドキュメントがわかりにくくて日本語記事をググって探すのだが、書かれた世代によって使い方が古かったりして混乱する。
- 自分で試して動いたものをここに書き溜めてゆくことにした。