この記事の目的
Pythonで記述された"Hello World"スクリプトをPythonの実行環境とともにDockerコンテナ化して、Docker Engineがインストールされた環境であればHello Worldできるようにします。
何を始めるにもまずは世界にこんにちはしなきゃね('ω')。
実行環境
- Windowsの仕様
- エディション:Windows 10 Home
- バージョン:20H2
- OS ビルド:19042.867
- エクスペリエンス:Windows Feature Experience Pack 120.2212.551.0
- Docker Desktop
- 3.2.2
- Docker
- 20.10.5 build 55c4c88
まずはPythonの開発環境を作成
ホストのWindows 10にPythonの実行環境を直接インストールしたくないし、せっかくDocker Desktopインストールしたので、Pythonの開発用イメージをダウンロードしてコンテナとして使用する。
なんだかんだでNumpy使うだろうし、Anacondaコンテナを使用することにする。(この辺はお好みで。)
今回は公式のanaconda3コンテナを使用することにした。
まずはDockerイメージを取得する。コマンドは次の通り。
PS> docker pull continuumio/anaconda3
Docker pullコマンドの詳細は公式サイトをご確認ください。
完了したらイメージが取得できたか、確認する。
PS> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
continuumio/anaconda3 latest 5e5dd010ead8 4 months ago 2.71GB
(2.71GBもあった。もっと小さいイメージにすればよかった。)
次にDockerイメージからコンテナを作成します。Docker runコマンドを使用すると、イメージからコンテナの作成と実行を同時にやってくれます。こんな感じです。コマンドの引数の意味は公式ドキュメントをご参考ください。
PS > docker run --interactive --tty continuumio/anaconda3 bash
(base) root@a5a6df15c938:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
(base) root@a5a6df15c938:/# exit
exit
PS >
Docker runコマンドの公式ドキュメントはこちら。
ソースコードはホストのWindows 10のVisual Studio Codeを使いたいので共有フォルダをマウントします。
-vオプションでホストのパスとコンテナのパスを設定します。
PS > docker run --interactive -v C:\Users\<ユーザー名>\Development\docker:/mnt/docker --tty continuumio/anaconda3 bash
(base) root@c29714605d16:/# ls /mnt/
docker
(base) root@c29714605d16:/# ls /mnt/docker/
Python版Hello Worldの開発
PythonでHello Worldを開発します。今回のHwllo Worldは力作だ('ω')。
# coding: UTF-8
print('Hello World!!')
Dockerコンテナ上で実行します。動いた。
(base) root@c29714605d16:/mnt/docker/python# python hello_world.py
Hello World!!
(base) root@c29714605d16:/mnt/docker/python#
実行用のDockerfileの作成
次に実行用のDockerイメージをビルドするためのDockerfileを作ります。Dockerfileのリファレンスを見て作成してください。
今回はこんな感じで作成しました。
FROM python:3.9.4-slim-buster
WORKDIR /app
COPY ./hello_world.py /app
CMD ["python", "hello_world.py"]
一行ずつ見ていきましょう。
FROM python:3.9.4-slim-buster
この行はベースイメージを指定しています。開発用のanaconda3イメージは2.71GBもあり、配布用としては巨大すぎるのでpythonの公式コンテナから3.9.4を選びました。バージョンは適当です。もっと軽量な実行環境を選んでもよいと思います。今回のPythonスクリプトは外部モジュール呼び出しておりませんし。
WORKDIR /app
作業用のディレクトリをコンテナの中に作成します。このディレクトリのしたに実行スクリプトを実行させます。
COPY ./hello_world.py /app
ホストPCにある開発済みのHello Worldスクリプトをコンテナの作業用ディレクトリにコピーします。これはDockerfileからイメージをビルドするときに実行されるようです。
今回はDockerfileとhello_world.pyスクリプトが同じフォルダに保存されています。階層が異なる場合は適切に相対パスを設定してください。
PS > ls
ディレクトリ: hello_docker
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2021/04/09 22:15 125 Dockerfile
-a---- 2021/04/05 23:24 41 hello_world.py
PS >
CMD ["python", "hello_world.py"]
作成したPythonスクリプトを実行します。
Dockerイメージのビルド
Docker buildコマンドでDockerfileからイメージを作成します。詳しくは公式ドキュメントをご覧ください。
今回はこんな感じで作成しました。tagオプションでイメージ名を指定します。
PS > docker build --tag=helloworld .
[+] Building 23.6s (8/8) FINISHED
PS >
Dockerコンテナの作成と実行
作成したDockerイメージからコンテナを生成して実行します。
PS > docker run helloworld
Hello World!!
PS >
見事、世界にこんにちはできました。やったね!!!。これでDocker環境であればどこでも世界にこんにちはできるよ('ω')。