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#
【ホストとコンテナのファイル一覧確認】
ホスト側のディレクトリにファイルが存在しない場合、コンテナ側のディレクトリにもファイルが存在しないことがわかります。
[コンテナ側のディレクトリ]
root@7773bb5fc812:/workdir# ls -l total 0
【ホスト側にファイルを追加した時のファイル一覧確認】
ホスト側のディレクトリにファイルを追加すると、コンテナ側のディレクトリにもファイルが存在(追加)されることがわかります。
[コンテナ側のディレクトリ]
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!
5. まとめ
DockerfileからDockerイメージを作成し、コンテナを起動するところまで実施しました。さらにPythonのスクリプトファイルを実行し、正常にPythonが動作することも確認できました。
次回は、ホストのVSCodeからコンテナ上のPythonでデバッグ実行できるようにする環境を構築しようと思います。