はじめに
docker-composeでなくても、「dockerで一つコンテナを用意するだけではだめなのか」という問いもあるかもしれません。ですが、そもそもこれは通信アルゴリズムのテストに使用したかった、という経緯ですので、そこはまずご了承くださいな。
この記事では、docker-composeによりpythonの仮想環境を整えるということのみに焦点を当てています。他、TCP/UDPによるnode.jsとの通信は他の記事にて解説する気ですのでよろしくお願いします。
なお、この記事の成果物は以下のリポジトリに入ってますので、多少docker-composeに慣れていて「見れば分かるわ~わはははは~」という方は次のURLからクローンしてみてくださいな。(そもそもこの記事を見てないかな?)
ディレクトリ構成
docker-compose.yml
python/
├ app.py
├ Dockerfile
└ requirements.txt
docker-compose
version: '3'
services:
python:
build: ./python
container_name: PYTHON
重要なのはbuildの項だけでしょう。
これはpythonディレクトリにDockerfileがあるので、それを参考にコンテナを作ってね、ということです。docker-composeでは他にも環境変数をいじったり出来る用ですが、pythonコンテナをとりあえず建てたいというだけであれば、問題はありません。
Dockerfile
FROM python:3
# アプリケーションディレクトリを作成する
WORKDIR /usr/src/python
# pipのアップデート
RUN pip install --upgrade pip
# pipでインストールしたいモジュールをrequirements.txtに記述しておいて、
# コンテナ内でpipにインストールさせる
# requirements.txtの書き方は[pip freeze]コマンドから参考に出来る
COPY requirements.txt ./
RUN pip install -r requirements.txt
# アプリケーションコードをコンテナにコピー
COPY . .
EXPOSE 8000
CMD [ "python", "app.py" ]
FROM python:3
「Python3.xのバージョンのあるイメージを使う」という意味…だと思います。たぶん。
WORKDIR /usr/src/python
コンテナ内では仮想のLinuxOSが起動しています。
その/usr/srcディレクトリにpythonディレクトリを作成し、どうやらカレントディレクトリにしているようです。
RUN pip install -rf requirements.txt
これはrequirements.txtに書かれているインストールしたいモジュールをインストールする処理です。この前にCOPYによって、用意していたrequirements.txtをコンテナ内にコピーしているため使うことが出来ています。インストールしたいモジュールをRUN pip install numpyのようにいくつも書くのはめんどくさいのでこのインストール方法を採用しました。
requirements.txtの書き方は「pip freeze」コマンドで確認できます。
COPY . .
コンテナ外のカレントディレクトリの全ファイルおよびディレクトリを、コンテナ内のカレントディレクトリにコピーしています。これにより、コンテナ外にあるファイルを編集することでプログラムの変更が可能です。
docker-composeを使ってアプリ開発をするのであれば、必須級のコマンドだと思います。
COPY . .
app.py
コンテナを起動して、ちゃんと動くか確認するためのコード。
なのでとても短い。
print('test')
requirements.txt
requirements.txtの内容です。参考までにnumpyをインストールしていますが、見ての通り今回は使用していません。
numpy
起動
docker-compose up --build
コマンドを実行するとprintのアウトプットが表示されると思われます。
Attaching to PYTHON
PYTHON | test
PYTHON exited with code 0
終わりに
docker-composeは他のコンテナを同時に立ち上げ、ネットワークを構築することに強みがあります。なのでpythonコンテナを一つ立ち上げるだけではさほど意味があるとは言えません、もしdocker-compose初心者の方がこの記事を見て、pythonのコンテナを立ち上げたのなら、そこから他のコンテナとの通信を試して見すことをお勧めします。
docker-compose玄人の方がこの記事を見たなら、間違ってる点を指摘して頂ければと思います。僕の勉強にもなりますので。
以上です。