【初心者向け】Dockerfileで環境構築手順を保存してイメージを簡単に作成する方法!

はじめに

Dockerで開発環境を構築する際に、pythonのように最初から実行環境が用意されているものもあれば、自分でインストールを行う必要があるものもあります。
また、開発プロジェクトや案件によって必要な機能は異なるので、Docker Hubからイメージをダウンロードして終わりというのは少ないように思います。
そのような場合、開発環境を構築するときにダウンロードするイメージや必要なパッケージ、インストール手順をメモに残したりして、次回の開発時やほかの人に環境構築してもらう際に参照してもらって作業を進めることになると思います。
でも、それって非常にめんどくさいですし、手順をミスしたりスキップしたりで構築作業をミスしてのちの開発工程に影響を及ぼす可能性があります。
そこでDockerにはDockerfileという環境構築の手順を記載して、自動的にイメージを作成してくれる仕組みがあります。
今回は、Dockerfileを使って自動的に環境を構築する方法についてまとめていきます。
動作環境

 Windows10

 Docker Desktop

Dockerについて

そもそものDockerについて、またインストール方法は以下の記事で紹介しています。

関連記事

はじめに プログラミングを行う際に実行環境を構築する必要がありますが、普段利用しているローカルPCに直接インストールしてしまっては、トライアンドエラーを繰り返すうちに不要なアプリケーションが積み重なり動作が不安定にな[…]

また、DockerはWindows TerminalのPowerShellで行います。
こちらの記事でWindows Terminalのインストール方法も紹介していますので良ければ参照してください。
関連記事

はじめに Windows環境でLinuxのコマンドが利用できるWSL2についてインストールおよび利用方法を説明します。 Linuxコマンドが使えるようになると、様々なプログラミング言語や開発に利用できますので非常に[…]

Dockerfileの作成

はじめにでも書いたように、Dockerfileには利用したいイメージと、そのイメージに対して実行したいコマンドを記述することができます。

ここではpythonイメージをダウンロードしてpythonのプログラムを実行するまでを確認したいと思います。

事前準備

事前準備として、ローカルPC(ここではWindows10)で作業するフォルダを作成します。

そこに、Dockerfileとpythonのソースコードを格納します。フォルダ構成としては以下となります。

dockerfiletest/
`-- Dockerfile
`-- files/
    `-- hello.py

dockerfiletestという作業フォルダの中にDockerfileとfilesというpythonのプログラムコードを格納するフォルダを作成しています。

pythonプログラムのhello.pyの中身は以下です。

print("Hello World!")

Dockerfileを作成する

それでは、Dockerfileの中身を記述していきます。まずは記述内容として以下となります。

FROM python:latest

RUN apt update -y && apt upgrade -y && apt autoremove -y
RUN apt install -y vim

RUN cd /root && mkdir pytest
ADD files/hello.py /root/pytest

CMD ["/bin/bash"]

1行目のFROMDocker Hubから取得したいイメージのリポジトリ名とタグを記載します。今回はpythonの最新(latest)イメージをダウンロードします。

3行目のRUNでコマンドを実行できます。apt update でパッケージリストを最新化するなどOSインストール直後に行うようなコマンドを記載しています。また-yオプションをつけることによって、コマンド実行中にインストールするかどうか聞かれる選択肢をyesで進めることができます。

4行目もRUNでvimエディターをインストールしています。

6行目で、rootディレクトリに移動し、さらにpytestというディレクトを作成しています。

7行目のADDはローカルPCのファイルをコンテナにコピーすることができます。今回はfiles/hello.pyのファイルをコンテナ内の/root/pytestディレクトにコピーします。

9行目のCMDはコンテナ実行時の挙動を指定できます。これは、イメージをコンテナとして起動するときに自動的に実行するコマンドを指定しています。今回の内容はコンテナ起動時に/bin/bashを起動するようにしています。

Dockerfileが準備できたら作業フォルダ(ここではdockerfiletest)にpowershellで移動し、以下のコマンドを実行します。

docker image build -t pyimage:v1 .

-tオプションの後ろに作成するイメージ名とタグ名を任意で決めます。今回は、イメージ名をpyimage、タグ名をv1としました。

また、末尾の.(ピリオド)はDockerfileの格納場所を指定します。ここでは.(ピリオド)なので、現在のフォルダ(カレントフォルダ)を示します。

それでは、Dockerイメージの一覧を表示します。

docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
pyimage      v1        50ada581f3c6   2 hours ago   988MB

リポジトリ名とタグ名にpyimage:v1というのが作成されているのが確認できます。

イメージからコンテナを起動する

Dockerfileを使って作成したイメージからコンテナを起動します。

docker run -it --name pydev pyimage:v1

作成したpyimage:v1からpydevという名前を付けたコンテナを起動できました。

次に、Dockerfileに記載したpythonのプログラムコードを実行してみましょう。

cd /root/pytest/ #/root/pytest/ディレクトリに移動する
ls #フォルダ内のファイルリスト取得
hello.py
cat hello.py #hello.pyのファイルの中身を標準出力に出力
print("Hello World!")
python hello.py #pythonプログラムコードを実行
Hello World!

指定したディレクトリにpythonプログラムファイルが存在し、実行できることが確認できました。

Dockerfileの作成例

Ubuntuにpythonの開発環境としてvenvをインストールする手順をDockerfileに記述してイメージ作成、コンテナ起動ができるようにしてます。

pythonのインストール手順についての詳細は以下の記事でまとめています。

関連記事

はじめに Pythonの開発現場ではDockerなどの仮想環境を用いることが多いと思いますが、実際にwebサービスなどの運用を始める際はPythonのインストール、環境構築が必要になってくる場合もあります。 今回は[…]

仮想環境venvのインストールについては以下の記事です。

関連記事

はじめに 前回、Ubuntu上にPythonの実行環境をインストールしました。その際に、Python を開発する際はプロジェクトごとに仮想環境を作成するとしてvenvを選択しました。 前回の記事はこちら [sit[…]

#Ubuntu22.10をダウンロード
FROM ubuntu:22.10
 
#パッケージの最新化
RUN apt update -y && apt upgrade -y && apt autoremove -y
 
#利用するパッケージを追加
RUN apt install -y wget vim
 
#ビルドツール・ライブラリのインストール
RUN DEBIAN_FRONTEND=noninteractive apt install -y build-essential libbz2-dev libdb-dev \
    libreadline-dev libffi-dev libgdbm-dev liblzma-dev \
    libncursesw5-dev libsqlite3-dev libssl-dev \
    zlib1g-dev uuid-dev tk-dev
# TimeZone設定
ENV TZ=Asia/Tokyo
 
#Pythonのインストール
RUN mkdir /root/python
WORKDIR /root/python
RUN wget https://www.python.org/ftp/python/3.11.0/Python-3.11.0.tar.xz && tar xJf Python-3.11.0.tar.xz && cd Python-3.11.0 && ./configure && make && make install
 
#仮想環境venvのディレクトリ作成
RUN mkdir py_venvs && mkdir py_venvs/py1
 
WORKDIR /root/python/py_venvs/py1
RUN python3 -m venv ./.venv1
RUN . .venv1/bin/activate && python3 -m pip install -U pip && python3 -m pip install numpy
 
ADD files/* /root/python/py_venvs/py1/
 
CMD ["/bin/bash"]</code></pre>

11行目のDEBIAN_FRONTEND=noninteractiveはインストール時に入力を求められる部分をスキップすることができます。

今回はタイムゾーンを聞かれるので、17行目で改めてセットしています。

また、20,26行目のWORKDIRはcdの代わりに使用しています。Docker のビルドでは Dockerfile の各命令ごとにコンテナを作るため、デフォルトだと各命令時のカレントディレクトリは常に「/」になるためです。

docker image build -t pyimage:v2 .
docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
pyimage      v2        f9d83e150ed9   34 seconds ago   1.48GB
pyimage      v1        50ada581f3c6   3 hours ago      988MB

pyimageのv2が追加されていることが確認できますので、コンテナを起動します。

docker run -it --name pydev2 pyimage:v2

pythonの仮想環境である.venv1に切り替えます。

source .venv1/bin/activate
pip list
Package    Version
---------- -------
numpy      1.23.4
pip        22.3
setuptools 65.5.0
python calc.py
root2 : 1.4142135623730951
e : 2.718281828459045
pi : 3.141592653589793
log2 : 0.6931471805599453
X^2+2X-8 : [-4.  2.]

pythonの追加パッケージとしてnumpyがインストールされていることが確認できます。

また、numpyを利用したpythonのプログラムコードも実行できていました。

まとめ

Dockerfileを使って環境構築手順をファイルとして保存およびイメージ作成、コンテナ作成方法についてまとめました。
Dockerの操作についてより詳しく知りたい方は以下のような書籍を参考にしてみてください。
たった1日で基本が身に付く! Docker/Kubernetes超入門
著者:伊藤 裕一 (著)
出版社:技術評論社
本書は、次世代のアプリケーションアーキテクチャとして注目されている「マイクロサービス」の技術基盤となるコンテナ技術「Docker」とコンテナオーケストレーション技術「Kubernetes」を取り上げ、Dockerの基本的な利用法、DockerfileやComposeの設計、コンテナのデータ永続化やCI/CD、Kubernetesによる複数コンテナの自動管理までを、一気に学習します。出典:Amazon
さわって学ぶクラウドインフラ docker基礎からのコンテナ構築

著者:大澤 文孝 (著), 浅居 尚 (著) 
出版社:日経BP
本書では、Dockerのインストール方法に始まり、基本的なWebサーバーを起動させるところから、永続化、ネットワーク、コンテナイメージへと順番に学ぶことができます。さらに、複数のコンテナを使うことを想定し、「Docker Compose」や「Kubernetes」についても学習できます。Kubernetesは学習ツールとして「Minikube」を用い、最終的に「Amazon EKS」でコンテナを実行するはじめの一歩までを説明します。出典:Amazon
Docker実践ガイド 第2版 impress top gearシリーズ

著者:古賀 政純 (著)
出版社:インプレス
IT現場で役立つ、Dockerの導入、運用ノウハウを凝縮。Dockerが利用される環境や背景を説明し、導入前のシステム設計、Dockerの基本的な利用方法、Dockerfileによる自動化の手法、管理・監視ツールについて、実際に操作をしながら解説します。出典:Amazon