こんにちは、さるまりんです。
気づけば今年も終わりが見えてきました。
コードの大掃除までは手が回らなくても、せめて 「来年の自分が助かる種」 だけはまいておきたいな、と思いました。
Dockerまわりって、こうなりがちじゃないでしょうか。
- いつの間にかよくわからないコンテナが増えている
- とりあえず
docker ps -aで眺めるけど、そのままそっと閉じる - 「これ消したらやばいかな…?」と思って、結局何も触れない
そこで今回は、
✅ Docker環境を軽く棚卸しして、
✅ 来年も使い回せる 「Docker + Makefile のミニ雛形」 をひとつ作る
ところまでをやってみます。
1. まずは現状把握:コンテナとイメージを眺める
大掃除の基本は 「いきなり捨てない」 です。
まずは、今どんなものがいるのかを確認します。
docker ps -a
コンテナ一覧が出てきます。
「もう使ってないやつ…多いな…」となったら大成功です。
今回は Docker をリセットした直後だったので、実際にはこんな感じでした。(Dockerが立ち上がらずfactory reset…こちらの方が大問題ですね)
% docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
続いて、イメージも確認してみます。
docker images
これもリセット直後の状態だと、こうなります。
% docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ふだんであればここに
- 明らかにもう使わないプロジェクトの名前
- いつの間にか増えている同じイメージの古いタグ
などが並んでいて、このあたりが“片付け候補”になってきます。
(今回の例は、何もなくて片付け不要の「スッキリ状態」ですね。)
2. 怖くない範囲で“そっと片付ける”
いきなり docker system prune -a を叩くのはちょっと勇気がいります。
まずは 「これはもう本当に要らない」 と自分で判断できるものだけ消していきます。
2-1. もう使わないコンテナを消す
止まっているコンテナのうち、明らかに不要なものがあれば:
docker rm <コンテナID or 名前>
まとめて消す場合は:
docker rm コンテナA コンテナB コンテナC
2-2. イメージも、ピンポイントで削除
docker rmi <イメージID or 名前:タグ>
- 「このリポジトリはもう閉じた」
- 「検証で一度だけ使っただけ」
とわかるものから、少しずつ消していきます。
💭 ポイント
「どれを消していいかわからない…」という感覚が強い場合は、
無理に消さない、も立派な選択です。
その場合は、このあと出てくる “雛形ディレクトリ” を作るほうに進みましょう。
3. 来年も使える「Docker + Makefile 雛形」を作る
ここからが本題です。
新しいプロジェクトを始めるたびに、
- Dockerfileを書く
- docker composeのYAMLを書く
- コマンドも毎回ググる
…というのを、そろそろやめたい。
そこで、毎回コピペして持ってこられる最小セット をひとつ作ってしまいます。
ディレクトリ名は例として devbox-template/ にしておきます。
devbox-template/
├── Dockerfile
├── docker-compose.yml
└── Makefile
この3ファイルが“家の土台”になります。
4. Dockerfile:とりあえず何でも試せるベース
今回は言語を固定せず、軽い開発用ベース という位置づけにします。
Dockerfile
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
WORKDIR /workspace
RUN apt-get update && \
apt-get install -y --no-install-recommends \
curl \
git \
ca-certificates \
make \
vim \
bash \
&& rm -rf /var/lib/apt/lists/*
# ホストのコードをここに置いて作業する想定
VOLUME ["/workspace"]
CMD ["/bin/bash"]
- まだ特定の言語ランタイムは入れていません
- 代わりに
curl/git/make/vimなど “最低限の工具箱” だけ入れています - 「ここから先は、プロジェクトごとに追加していける土台」というイメージです
5. docker-compose.yml:コンテナの“顔”をつくる
docker compose で動かすための定義を用意します。
docker-compose.yml
services:
app:
build: .
container_name: devbox-app
working_dir: /workspace
volumes:
- ./:/workspace
tty: true
ポイント:
volumesで ホストのカレントディレクトリ を/workspaceにマウントtty: trueで対話シェルに入りやすくしておく
ここまでで、
docker compose up -d
docker compose exec app bash
とすると、Ubuntu+git+curl+make が入った箱に入れる状態になります。
実行したときの出力はこんな感じでした。
% docker compose up -d
Compose can now delegate builds to bake for better performance.
To do so, set COMPOSE_BAKE=true.
[+] Building 38.8s (9/9) FINISHED docker:desktop-linux
=> [app internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 414B 0.0s
=> [app internal] load metadata for docker.io/library/ubuntu:22.04 2.6s
=> [app auth] library/ubuntu:pull token for registry-1.docker.io 0.0s
=> [app internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [app 1/3] FROM docker.io/library/ubuntu:22.04@sha256:104ae83764a51190 3.1s
=> => resolve docker.io/library/ubuntu:22.04@sha256:104ae83764a5119017b8 0.0s
=> => sha256:7e49dc6156b0b532730614d83a65ae5e7ce61e966 29.54MB / 29.54MB 1.4s
=> => extracting sha256:7e49dc6156b0b532730614d83a65ae5e7ce61e966b049870 1.6s
=> [app 2/3] WORKDIR /workspace 0.1s
=> [app 3/3] RUN apt-get update && apt-get install -y --no-install- 23.6s
=> [app] exporting to image 9.1s
=> => exporting layers 6.7s
=> => exporting manifest sha256:a99b2dc7182735da2b1fbce2e9fafcbe6dbd6a85 0.0s
=> => exporting config sha256:a46bb54348c4fd6b6e944836b956e64f633663ca1e 0.0s
=> => exporting attestation manifest sha256:92063022b73512d0c96c282d964b 0.0s
=> => exporting manifest list sha256:74f1cf4c044d7179ceec21dcaa7fb5d8aad 0.0s
=> => naming to docker.io/library/devbox-template-app:latest 0.0s
=> => unpacking to docker.io/library/devbox-template-app:latest 2.3s
=> [app] resolving provenance for metadata file 0.0s
[+] Running 3/3
✔ app Built 0.0s
✔ Network devbox-template_default C... 0.1s
✔ Container devbox-app Started 0.8s
% docker compose exec app bash
root@e82945bd5852:/workspace#
6. Makefile:呪文はファイルに覚えさせる
ここからが “技術大掃除 × 明日からの自分に優しいところ” です。
Dockerのコマンドを毎回打つ代わりに、
Makefile にまとめてしまいます。
Makefile
PROJECT_NAME := devbox
up:
docker compose up -d
down:
docker compose down
build:
docker compose build
rebuild:
docker compose down
docker compose build --no-cache
docker compose up -d
ps:
docker compose ps
logs:
docker compose logs -f app
sh:
docker compose exec app bash
prune-dangling:
docker image prune -f
.PHONY: up down build rebuild ps logs sh prune-dangling
make up: コンテナ起動make down: 停止 & 片付けmake rebuild: 「神社でお祓い」系のフル再構築make sh: 中に入って、あとは好きに作業make prune-dangling: ぶらさがりイメージだけを掃除(ちょっとだけ大掃除)
🔧 ひとこと
呪文を覚えるのはMakefileの仕事にしてしまって、
自分は make up / make sh / make down くらいだけ覚えておけば十分、という設計にしています。
7. 実際に動かしてみる
7-1. ビルドして起動
make build
make up
そのあと:
make ps
で、devbox-app が起動していることを確認します。
7-2. 中に入ってみる
make sh
で /workspace に入れます。
中でやることは例えば:
# コンテナ内
ls
cat /etc/os-release
git --version
実際の出力はこんな感じでした。
% make up
docker compose up -d
[+] Running 1/1
✔ Container devbox-app Running 0.0s
% make down
docker compose down
[+] Running 2/2
✔ Container devbox-app Removed 10.2s
✔ Network devbox-template_default R... 0.3s
% make rebuild
docker compose down
docker compose build --no-cache
Compose can now delegate builds to bake for better performance.
To do so, set COMPOSE_BAKE=true.
[+] Building 32.4s (8/8) FINISHED docker:desktop-linux
=> [app internal] load build definition from Dockerfile 0.0s
=> [app internal] load metadata for docker.io/library/ubuntu:22.04 0.7s
=> [app internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [app 1/3] FROM docker.io/library/ubuntu:22.04@sha256:104ae83764a51190 0.1s
=> => resolve docker.io/library/ubuntu:22.04@sha256:104ae83764a5119017b8 0.0s
=> CACHED [app 2/3] WORKDIR /workspace 0.0s
=> [app 3/3] RUN apt-get update && apt-get install -y --no-install- 22.5s
=> [app] exporting to image 9.0s
=> => exporting layers 6.7s
=> => exporting manifest sha256:053497c2a93031ce646b52c22f34dffb7947381f 0.0s
=> => exporting config sha256:bb67041fb5c141404e40be4031a8074d31d70ae1d2 0.0s
=> => exporting attestation manifest sha256:a7db55325cd91406cfbb6178cdfa 0.0s
=> => exporting manifest list sha256:7e2dce3aedab5753843a7fb7c293573ec57 0.0s
=> => naming to docker.io/library/devbox-template-app:latest 0.0s
=> => unpacking to docker.io/library/devbox-template-app:latest 2.2s
=> [app] resolving provenance for metadata file 0.0s
[+] Building 1/1
✔ app Built 0.0s
docker compose up -d
[+] Running 2/2
✔ Network devbox-template_default C... 0.1s
✔ Container devbox-app Started 0.6s
% make sh
docker compose exec app bash
root@a5167cf46683:/workspace#
root@a5167cf46683:/workspace# cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.5 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
root@a5167cf46683:/workspace# git --version
git version 2.34.1
% make prune-dangling
docker image prune -f
Total reclaimed space: 0B
「今年の終わりに、来年遊べる実験箱を一個用意できた」
という感覚になれました。
8. 「ここから何でも乗せられる」状態をつくる
この devbox-template/ は、
プロジェクトごとにコピーして使える “テンプレートのテンプレート” のようなものです。
- Nodeを入れたいなら
Dockerfileにnodejsを追加 - Kotlinを触りたくなったら JDK + Gradle を載せる
- PHP/Laravelの検証をしたくなったら
php-cliやcomposerを追加
やりたくなったときに、
Dockerfileの下半分だけ変えればいい状態 にしておく。
それだけでも、かなり楽にスタートできると思います。
9. ついでの技術大掃除:安全圏での prune
最後に、今回のテンプレとは別に、
「やっても大丈夫そうな範囲」の prune を少しだけ。
停止中コンテナだけを消す
docker container prune
今回のタイミングでは、止まっているコンテナがなかったのでこうなりました。
% docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B
ぶら下がりイメージだけを掃除
docker image prune
こちらも同様に、掃除するものがない状態でした。
% docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B
もう一歩踏み込みたくなったら…
docker system df
で、どのくらいDockerがディスクを使っているか確認してから、
prune 系コマンドを検討するのが安心です。
さきほど作った devbox-template コンテナだけがある状態だと、こんな感じでした。
% docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 1 1 512.2MB 212.3MB (41%)
Containers 1 1 12.29kB 0B (0%)
Local Volumes 0 0 0B 0B
Build Cache 6 0 182.9MB 182.9MB
10. おわりに:未来の自分にひと言だけ
今回は、
- 今年の終わりに Dockerまわりをちょっと棚卸しして
- 明日から使いまわせる 「Docker + Makefile 雛形」 をひとつ用意してみる
ところまでをやってみました。
技術的にはすごくシンプルですが、
「迷ったらこの雛形をコピーすればいい」という場所 が一個あるだけで、
“新しいことを始めるハードル”がぐっと下がる気がします。
次に何かを試したくなったら、
このディレクトリをコピーして、make up からスタートしてみてください。
今年も一年おつかれさまでした。
来年も、ゆるく・楽しく・ときどき本気で、
さるまりんと一緒に遊んでもらえたら嬉しいです。
読んでくださってありがとうございました。
それではまた!
よいお年を〜。