はじめに
今回はDockerを使ってPythonの環境を作っていきます。
以前現場でGo言語をDockerで使ったことがあるのですが、その時凄い便利だなと思ったので
今回はPythonの環境をDockerで作っていきます。
環境
macOS Ventura 13.0.1
Docker Desktop for Mac
Docker version 20.10.21
Docker Compose version v2.13.0
VS code
ゴール
今回のゴールはdockerコンテナをbuildして"Hello World"を出力することです。
構成
ディレクトリ構成です。
.
├── Dockerfile
├── docker-compose.yml
├── .env
└── backend
└── app.py
Docker Desktopのインストール
ご自身の環境に合ったものをインストールして下さい。
作業ディレクトリの作成
Dockerfileやdocker-compose.ymlを作成する作業ディレクトリを作成します。
mkdir docker_python && cd docker_python
次に作業ディレクトリでPythonのコードを配置するディレクトリを作成します。
今回はbackendという名前で作成します。
mkdir backend
これでディレクトリの準備は完了しましたのでコードを書いていきます。
Dockerfileの作成
dockerコンテナをbuildするDockerfileを作成します。
FROM python:3.9.10
RUN mkdir -p /root/backend
WORKDIR /root/backend
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
1行目でPythonのバージョンを指定しています。
WORKDIRはpythonのコードを置く作業場としてコンテナ上に/root/backendディレクトリを作成し、指定します。
これによって以降のRUNはWORKDIRで実行されます。
環境変数の設定
pythonのコードを配置するパスの環境変数を設定します。
.envファイルを作成し、下記のコードを入力します。
BACKEND_PATH=./backend
.envファイルは特殊なファイルで、設定した環境変数はDockerfileや、これから作成するdocker-compose.ymlなどから参照することができます。
パスを環境変数として外出しにすることによって汎用性を持たせています。
docker-compose.ymlの作成
docker-composeコマンドを使う時の設定ファイルです。
version: '3.9'
services:
python3:
restart: always
build: .
container_name: 'python'
working_dir: '/root/backend'
tty: true
volumes:
- ${BACKEND_PATH}:/root/backend
-
build
buildでDockerfileの場所を指定しています。今回はカレントディレクトリを表しています。 -
container_name
container_name には任意のコンテナ名を指定してください。
後ほど使用するコンテナ実行コマンド docker -exec -it {コンテナ名} のコンテナ名となります。 -
working_dir
working_dirはDockerfileのWORKDIRと同じ階層を指定します。コンテナ内のコマンドを実行した時のデフォルト階層になります。 -
volumes
volumesにはローカルのbackendディレクトリを/root/backendにマウントする記述を書いています。マウントするとローカルのbackend配下のファイルがコンテナから参照されるようになります。
コンテナをビルドします
コンテナをビルドする時は下記のコマンドです。
docker-compose build
docker_python % docker-compose build
[+] Building 7.4s (10/10) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 32B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/python:3.9.10 7.2s
=> [auth] library/python:pull token for registry-1.docker.io 0.0s
=> [1/5] FROM docker.io/library/python:3.9.10@sha256:3aae21920963df3205fba69826cc07fcf2fad91f9e062add9217 0.0s
=> CACHED [2/5] RUN mkdir -p /root/backend 0.0s
=> CACHED [3/5] WORKDIR /root/backend 0.0s
=> CACHED [4/5] RUN pip install --upgrade pip 0.0s
=> CACHED [5/5] RUN pip install --upgrade setuptools 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:f7bcfd7c1350206351a0fa429539f2b8a50dc5464e89f35b1bed222d46e06d1b 0.0s
=> => naming to docker.io/library/docker_python-python3 0.0s
上記のようなログが出力されれば、docker-compose build 完了です。
コンテナの起動
コンテナの起動は下記コマンドです。
docker-compose up -d
docker-compose upでコンテナを起動します。
後ろの-dオプションはバックグラウンドで起動するという意味です。
docker_python % docker-compose up -d
[+] Running 2/2
⠿ Network docker_python_default Created 0.1s
⠿ Container python3 Started 0.4s
Pythonの実行
コンテナでpythonのプログラムを実行しましょう。
backendディレクトリにapp.pyというファイルを作成します。
今回は"Hello World"と出力します。
print("Hello World")
下記コマンドでプログラムを実行します。
docker exec -it python3 python app.py
実行結果がこちら
docker_python % docker exec -it python3 python app.py
Hello World
"Hello World"と出力されていますね。
コンテナの終了
下記のコマンドでコンテナを終了します。
docker-compose down
最後に
今回はDockerでPythonの環境構築を行いました。
AWS Lambdaでdockerコンテナが利用できるので、ローカルのコンテナをそのままAWS Lambdaにのせれますし使いこなせた方がいいかなって個人的に思っています。
今後はフロント部分の追加もしながら、DockerとPythonを使ってCRUDアプリだったり色々機能を増やしていきたいと思います。