PythonスクリプトをDockerコンテナ化して、世界にこんにちは、する

# この記事の目的
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コンテナを使用することにした。

https://hub.docker.com/r/continuumio/anaconda3

まずはDockerイメージを取得する。コマンドは次の通り。

```powershell
PS> docker pull continuumio/anaconda3
```

Docker pullコマンドの詳細は公式サイトをご確認ください。

https://docs.docker.jp/engine/reference/commandline/pull.html

完了したらイメージが取得できたか、確認する。

```powershell
PS> docker images
REPOSITORY              TAG       IMAGE ID       CREATED        SIZE
continuumio/anaconda3   latest    5e5dd010ead8   4 months ago   2.71GB
```

(2.71GBもあった。もっと小さいイメージにすればよかった。)

次にDockerイメージからコンテナを作成します。Docker runコマンドを使用すると、イメージからコンテナの作成と実行を同時にやってくれます。こんな感じです。コマンドの引数の意味は公式ドキュメントをご参考ください。

```powershell
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コマンドの公式ドキュメントはこちら。

https://docs.docker.jp/engine/reference/commandline/run.html

ソースコードはホストのWindows 10のVisual Studio Codeを使いたいので共有フォルダをマウントします。
-vオプションでホストのパスとコンテナのパスを設定します。

```powershell
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は力作だ('ω')。

```python:hello_world.py
# coding: UTF-8

print('Hello World!!')
```

Dockerコンテナ上で実行します。動いた。

```powershell
(base) root@c29714605d16:/mnt/docker/python# python hello_world.py
Hello World!!
(base) root@c29714605d16:/mnt/docker/python#
```

# 実行用のDockerfileの作成

次に実行用のDockerイメージをビルドするためのDockerfileを作ります。Dockerfileのリファレンスを見て作成してください。

https://docs.docker.jp/engine/reference/builder.html

今回はこんな感じで作成しました。

```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
```
作業用のディレクトリをコンテナの中に作成します。このディレクトリのしたに実行スクリプトを実行させます。

https://docs.docker.jp/engine/reference/builder.html#workdir

```
COPY ./hello_world.py /app
```

ホストPCにある開発済みのHello Worldスクリプトをコンテナの作業用ディレクトリにコピーします。これはDockerfileからイメージをビルドするときに実行されるようです。

今回はDockerfileとhello_world.pyスクリプトが同じフォルダに保存されています。階層が異なる場合は適切に相対パスを設定してください。

```powershell
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 >
```

https://docs.docker.jp/engine/reference/builder.html#copy

```
CMD ["python", "hello_world.py"]
```
作成したPythonスクリプトを実行します。

https://docs.docker.jp/engine/reference/builder.html#cmd

# Dockerイメージのビルド
Docker buildコマンドでDockerfileからイメージを作成します。詳しくは公式ドキュメントをご覧ください。

http://docs.docker.jp/engine/reference/commandline/build.html

今回はこんな感じで作成しました。tagオプションでイメージ名を指定します。

```powershell
PS > docker build --tag=helloworld .
[+] Building 23.6s (8/8) FINISHED
PS >
```

# Dockerコンテナの作成と実行
作成したDockerイメージからコンテナを生成して実行します。

```powershell
PS > docker run helloworld
Hello World!!
PS >
```

見事、世界にこんにちはできました。やったね!!!。これでDocker環境であればどこでも世界にこんにちはできるよ('ω')。