【初心者脱出】Dockerfileでオリジナルイメージを自作しよう

docker

前回の記事では、Nginxコンテナの起動からマウント機能まで、Dockerの基本操作を一通り体験しました。

今回は、「自分だけのオリジナルイメージ」を作るステップに進みます。

キーワードは Dockerfile(ドッカーファイル)。これを使いこなすことで、「毎回コンテナの中に入って手動でインストールする」という手間から完全に解放されます。

コマンドはすべてそのままコピペで動きます。まずは手を動かしながら読んでみてください。

この記事を読み終えると…

  • Dockerfileが何者か、なぜ必要なのかが説明できるようになっている
  • Dockerfile の基本4大命令(FROM / WORKDIR / COPY / CMD)が理解できている
  • docker build コマンドでオリジナルイメージを自作できるようになっている
  • 自作したイメージから、Pythonプログラムを自動で実行するコンテナが動かせている

まず押さえよう:Dockerfileって何?

前回のハンズオンでは、docker run で出来合いのイメージを持ってきて、コンテナの中に入って手動でコマンドを打っていました。

でも、これには弱点があります。

コンテナを消したら、中でやった作業がすべてリセットされてしまうのです。

そこで登場するのが Dockerfile です。

Dockerfileとは、「どんな環境をベースにして、どのファイルをコピーして、どんなコマンドを実行するか」を1つのテキストファイルに書き連ねた、自動ビルド用のレシピです。

これがあれば、コマンド一発でいつでも全く同じ環境を再現できます。毎回手動でセットアップする必要は、もうありません。


Part 1. 作業用フォルダとPythonファイルを準備する

デスクトップに作業フォルダを作る

まず、PC上のデスクトップに今回の作業用フォルダを作り、そこに移動します。

PowerShell(またはターミナル)を開いて、以下を実行してください。

# デスクトップに移動
cd ~/Desktop

# 新しいフォルダを作って中に入る
mkdir docker-build-test
cd docker-build-test

Pythonプログラムファイルを作る

次に、コンテナの中で動かしたいPythonプログラム(app.py)を作ります。

メモ帳やVS Codeなどで以下の1行だけを書いたファイルを作成し、docker-build-test フォルダ内に app.py という名前で保存してください。

print("Hello! This Python script is running inside a custom Docker container!")

Part 2. レシピ(Dockerfile)を書く

Dockerfileを作成する

同じ docker-build-test フォルダの中に、新しくファイルを作ります。

ファイル名は Dockerfile(拡張子なし・先頭は大文字のD)にしてください。

# 新しいDockerファイルを作成する
New-Item -Path . -Name "Dockerfile" -ItemType "file"

中身に以下の4行を記述して保存します。

# 1. 公式が用意しているPython 3.10の軽量版イメージをベースにする
FROM python:3.10-slim

# 2. コンテナ内の作業フォルダを「/app」に設定する
WORKDIR /app

# 3. 自分のPCの「app.py」を、コンテナ内の今いる場所(.)にコピーする
COPY app.py .

# 4. コンテナが起動したときに、自動で実行するコマンドを指定する
CMD ["python", "app.py"]

💡 Dockerfileの基本4大命令

命令役割
FROMすべてのベース。「Pythonが入った状態のミニOS」など、先人が作ったイメージを土台に指定する
WORKDIRコンテナ内の「作業フォルダ」を決める。これ以降の命令はここで実行される
COPY自分のPCにあるファイルをコンテナ内に送り込む
CMDコンテナが起動した瞬間に、自動で一発目に実行してほしいコマンドを書く

ここまでで、フォルダの中は以下の状態になっているはずです。

docker-build-test/
├── app.py
└── Dockerfile

Part 3. 設計図からイメージをビルドする

docker build でイメージを作る

app.py と Dockerfile の2つが揃っていることを確認したら、以下のコマンドを実行します。

docker build -t my-python-app .

⚠️ 末尾の「 . 」を忘れないで!

最後の半角スペース+ピリオド(.)は、「今いるフォルダのDockerfileを使いなさい」という意味です。これを忘れるとエラーになります。

-t my-python-app は、出来上がるイメージに名前(タグ)をつけるオプションです。

コマンドを実行すると、画面に STEP 1/4... のように、Dockerfileに書いた指示が上から順番に実行されていく様子が表示されます。最後に FINISHED や SUCCESS と出ればビルド完了です。

作成したイメージを確認する

以下のコマンドで、PC内に保存されているイメージの一覧を確認できます。

docker images

一覧の中に、今作った my-python-app が表示されていれば成功です。


Part 4. 自作イメージを動かしてみる

コンテナを起動する

いよいよ起動です。以下のコマンドを実行してください。

docker run my-python-app

以下のメッセージが表示され、コンテナが自動で終了すれば大成功です!

Hello! This Python script is running inside a custom Docker container!

💡 これがDockerの最大の強みです

今回作ったイメージは、Pythonがインストールされていない他の人のPCに持っていっても、docker run するだけで全く同じようにPythonが動き出します。

「自分のPCでは動いたのに、別の環境では動かない」という問題を、Dockerfileは根本から解決しています。


まとめ:今回覚えたコマンド一覧

コマンド役割
docker build -t [イメージ名] .今いるフォルダのDockerfileを元に、オリジナルイメージを作成する
docker imagesPC内に保存されているイメージの一覧を表示する
docker run [イメージ名]イメージからコンテナを起動する

これで、1週目のメニュー(単体コンテナのマスター)がすべて完了です。

  • コンテナの起動・停止・削除
  • データのマウント(同期)
  • 独自のDockerfileビルド

これらができるようになれば、すでに Docker初心者脱出レベル です。

最後に、今回の復習用に演習問題を用意しました。さらに定着させたい方はぜひ実際に手を動かして解いてみてください!


演習問題:実践ハンズオンに挑戦!

今回は、PythonではなくNode.jsを使ったオリジナルイメージを自作してみます。

今回のゴール

  • Dockerfileを自分で書いて、Node.jsが動くオリジナルイメージを作れること
  • 作ったイメージからコンテナを起動し、プログラムが自動実行されること
  • ビルドしたイメージが一覧に表示されることを確認できること

🛠️ 問題(ステップ1〜3)

【STEP 1】プログラムファイルを作る

デスクトップに docker-node-test というフォルダを作り、その中に app.js という名前で以下の内容のファイルを保存してください。

console.log("Hello! This is Node.js running inside a custom Docker container!");

【STEP 2】Dockerfileを書く

同じフォルダに Dockerfile を作成してください。以下の条件を満たすように記述してください。

命令設定内容
FROMnode:18-slim(Node.js 18の軽量版イメージ)をベースにする
WORKDIRコンテナ内の作業フォルダを /app にする
COPYapp.js をコンテナ内にコピーする
CMDコンテナ起動時に node app.js を自動実行する

【STEP 3】ビルドして実行する

Dockerfileを使ってイメージをビルドし(イメージ名は my-node-app)、docker run でコンテナを起動してください。

ターミナルに以下が表示されれば成功です。

Hello! This is Node.js running inside a custom Docker container!

演習問題の解答

上記の演習問題の解答は私のnoteの方で公開しておりますので、解答・解説を確認したい方はぜひ以下のリンクからご確認いただき、今回学んだ範囲の理解をさらに深めてください!
【演習問題+解説】Node.jsで自分だけのDockerイメージを作ってみよう

次の記事では、複数のコンテナを一括で管理できる Docker Compose を使って、WebサーバーとDBを同時に立ち上げる構成に挑戦していきたいと思います!

この記事をSNSでシェア!

コメント