Dockerの“大掃除”:明日のためにMakefile付きミニ環境をひとつ作っておこう

こんにちは、さるまりんです。

気づけば今年も終わりが見えてきました。
コードの大掃除までは手が回らなくても、せめて 「来年の自分が助かる種」 だけはまいておきたいな、と思いました。

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を入れたいなら Dockerfilenodejs を追加
  • Kotlinを触りたくなったら JDK + Gradle を載せる
  • PHP/Laravelの検証をしたくなったら php-clicomposer を追加

やりたくなったときに、
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 からスタートしてみてください。

今年も一年おつかれさまでした。
来年も、ゆるく・楽しく・ときどき本気で、
さるまりんと一緒に遊んでもらえたら嬉しいです。

読んでくださってありがとうございました。
それではまた!

よいお年を〜。