ITエンジニア日記 ~NO SKILL, NO LIFE~

学んだ技術や、気になることをアウトプットしていきます。プログラミング, インフラ, etc...

DockerでPythonの開発環境を作成してみる その1

タイトルの通り、DockerでPythonの開発環境を作成してみようと思います。最終的にはWindows上のVSCodeからデバッグ実行できる環境を作るのを目指します。
今回はDocker上にPythonの実行環境を作るところまでです。

[目次]

1. Dockerfileを用意する

Dockerでインフラ構成を記述したファイルをDockerfileと呼びます。Dockerfileに記述された構成情報をもとにDockerイメージの生成ができできます。
今回は、DockerfileからDockerイメージを作成してみます。
作成するのはPython3の実行環境とし、作成したDockerfileは下記となります。

【Dockerfile】

# ベースイメージ
FROM python:3.5.9

# pipをアップグレード
RUN pip install --upgrade pip

# 作業ディレクトリ作成
WORKDIR /workdir

# ポート
EXPOSE 8080

FROM

作成するDockerイメージのベースとなるイメージを指定します。
今回はPythonの公式イメージであるpython:3.5.9をベースに作成します。

RUN

FROMで指定したベースイメージに対してコマンドを実行したいときにRUN命令を使います。
今回はPythonのパッケージ管理ツールであるpipを最新版に更新する処理をRUN命令で記述しています。

WORKDIR

Dockerfileで定義した命令を実行するための作業ディレクトを指定するときにWORKDIR命令を使います。 もし、指定したディレクトリが存在しなければ、新規で作成されます。
今回は、特にWORKDIRに対する命令は実行しませんが、WORKDIR命令によってコンテナ側のルート直下にworkdirという名前の作業ディレクトリを作っています。

EXPOSE

コンテナの公開するポート番号を指定するときに、EXPOSE命令を使用します。
今回は、8080ポートを公開するように指定しています。

2. DockerfileからDockerイメージを作る

作成したDockerfileをbuilコマンドでビルドし、Dockerイメージを作成します。

【ビルド実施前のDockerイメージ一覧】

PS D:\docker\python3> docker image ls
REPOSITORY                       TAG                 IMAGE ID            CREATED             SIZE
ubuntu                           latest              cf0f3ca922e0        3 weeks ago         64.2MB
mcr.microsoft.com/mssql/server   2017-latest         cfe5615bf6a8        5 weeks ago         1.38GB


【ビルド実施】
下記コマンドでビルドを実施します。

 docker build -t pythondev .

-t オプションを付けることでDockerイメージの名前を指定します。
今回はDockerfileの置いてあるディレクトリでdocker buileコマンドを実行するので、パスは 「.」で指定してます。
また、Dockerfileのファイル名を「Dockerfile」以外の名称で作成したときは、Dockerfileのファイル名を指定する必要があります。(Dockerfileのファイル名が「Dockerfile」の時は、ファイル名を省略可能。)


【ビルド実行結果】

PS D:\docker\python3> docker build -t pythondev .
Sending build context to Docker daemon   2.56kB
Step 1/4 : FROM python:3.5.9
3.5.9: Pulling from library/python
c7b7d16361e0: Pull complete                                                                                             b7a128769df1: Pull complete                                                                                             1128949d0793: Pull complete                                                                                             667692510b70: Pull complete     
~ 省略 ~
Successfully built fb9ef271807b
Successfully tagged pythondev:latest
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.


【ビルド実施後のDockerイメージ一覧】

PS D:\docker\python3> docker image ls
REPOSITORY                       TAG                 IMAGE ID            CREATED              SIZE
pythondev                        latest              fb9ef271807b        About a minute ago   914MB
python                           3.5.9               c02d3cb0a185        7 days ago           908MB
ubuntu                           latest              cf0f3ca922e0        3 weeks ago          64.2MB
mcr.microsoft.com/mssql/server   2017-latest         cfe5615bf6a8        5 weeks ago          1.38GB

ビルドして作成した「pythondev」がDockerイメージ一覧の中に存在することがわかります。
また、ベースイメージと使用した「python」もDockerイメージとして存在しています。初回のビルド時はDockerリポジトリからベースイメージのダウンロードがされます。2回目以降はベースイメージのダウンロードしないので、Dockerイメージの作成処理のみとなります。

3. コンテナを起動する

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

docker container run -it -v D:\docker\python3\src:/workdir --name pythonwork pythondev /bin/bash

-v オプションを付けることでコンテナとホスト間でディレクトの共有ができます。
上記のコマンドだとホスト側の「D:\docker\python3\src」ディレクトリと、コンテナ側の「/workdir」ディレクトリを共有するように指定します。


【コンテナ起動結果】

PS D:\docker\python3> docker container run -it -v D:\docker\python3\src:/workdir --name pythonwork pythondev /bin/bash
root@e7619f49b532:/workdir#    


【ホストとコンテナのファイル一覧確認】
ホスト側のディレクトリにファイルが存在しない場合、コンテナ側のディレクトリにもファイルが存在しないことがわかります。

f:id:masakiXX0:20191112232600j:plain
ホスト側のディレクト

[コンテナ側のディレクトリ]

root@7773bb5fc812:/workdir# ls -l
total 0


【ホスト側にファイルを追加した時のファイル一覧確認】
ホスト側のディレクトリにファイルを追加すると、コンテナ側のディレクトリにもファイルが存在(追加)されることがわかります。

f:id:masakiXX0:20191112232741j:plain
ホスト側のディレクト

[コンテナ側のディレクトリ]

root@7773bb5fc812:/workdir# ls -l
total 1
-rwxr-xr-x 1 root root 80 Nov 12 13:28 test.py

4. Pythonスクリプト実行

起動したコンテナでPythonスクリプトファイルが実行できることを確認します。

【test.py】

def main():
    print("Hello World!")

if __name__ == "__main__":
    main()

/workdirに追加したスクリプトファイル「test.py」をコンテナ上で実行すると、実行結果が表示されることがわかります。

【test.pyの実行結果】

root@e7619f49b532:/workdir# python3 test.py
Hello World!

f:id:masakiXX0:20191112232821j:plain
test.py の実行結果

5. まとめ

DockerfileからDockerイメージを作成し、コンテナを起動するところまで実施しました。さらにPythonスクリプトファイルを実行し、正常にPythonが動作することも確認できました。
次回は、ホストのVSCodeからコンテナ上のPythonデバッグ実行できるようにする環境を構築しようと思います。

参考

WINGSプロジェクト阿佐志保 「プログラマのためのDocker教科書 第2版」 株式会社翔泳社