この記事では、環境を構築しながらプログラマーに必須なスキルを学んで行きます。
docker-compose.ymlとDockerfileを使って
Python(django)とMysqlの2つのコンテナを作って連携できている環境
を構築します。
構築しながら、docker-compose.ymlやDockerfileの記述の意味を説明していくので、環境を作りながら勉強していってください。
まずは下記のようなディレクトリ構成を目指します。
test_directory/
├─docker-compose.yml
├─Dockerfile
├─requirements.txt
├─mysql/
├─data/
├─sql/
├─my.cnf
├─.env
docker-compose.ymlの準備と意味
まずはdocker-compose.ymlを作成します。
version: '3.7'
services:
# サービス名
python:
# Dockerfileの場所を示す
build: .
# ホストとコンテナの共有するフォルダを指定する
volumes:
- .:/usr/src/app
- ~/.ssh/id_rsa:/home/user/.ssh/id_rsa
container_name: django_test
# 公開するポート番号
ports:
- 8000:8000
# 依存関係の記述
depends_on:
- db
tty: true
stdin_open: true
# サービス名
db:
# コンテナの元となるイメージを指定
image: mysql:5.7
# 環境変数を読み込むファイルの指定
env_file: ./mysql/.env
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
- ./mysql/sql:/docker-entrypoint-initdb.d
container_name: db_test
tty: true
ports:
- 3306:3306
version:’3,7′
compose fileのバージョンを示しています。このバージョンによってはファイルの書き方も異なってくるので注意しましょう。2020年4月現在は、3系が最新です。
今から新しく作るなら基本バージョン3以上を選んでおけばOKだと思います。
services:
docker-compose.ymlでは、コンテナとして動かす各アプリケーションのことをserviceと呼びます。インデントを見て直下にある名前がservice名となります。
このdocker-compose.ymlでは、pythonとdbというservice名になっていますね。このservice名は自由に決めてOKです。2つのコンテナを作るという意味になります。このservice名の中に更に色々な情報を書いて、コンテナを構築していきます。
build: .
buildが書かれているサービスのコンテナを立ち上げるためのDockerfileの場所を示しています。相対パスで書かれている場合、このymlファイルの位置からの相対パスとなります。
このymlファイルでは「build: .」とピリオドが書かれていますね。よってこの意味は「docker-compose.ymlと同じディレクトリにあるDockerfileを利用する」という意味になります。
volumes:
マウントするフォルダを指定します。簡単にいうと、ホスト(自分のパソコン)とコンテナ内のフォルダを共有するという意味だと思ってもらって良いと思います。
例えばコンテナ内でコードを書き換えても普通はホストのコードには影響しません。しかし、ここでマウントしていれば、ローカルとコンテナ内のフォルダが共有されることになります。そのため。コンテナ内でコードを書き換えるとマウントしているローカルのファイルにも影響を与えることになります。逆にローカルでコードを書き換えても、コンテナ内にも影響を与えます。
例えばこのymlファイルでは
volumes:
- .:/usr/src/app
と書かれています。volumesの書き方は「ホストのフォルダ:コンテナ内のフォルダ」と書くことができるので、このymlファイルで作られたコンテナは「カレンドディレクトリと/usr/src/appwp共有している」ということになりますね。
container_name:
そのままの意味で、作成したコンテナに名前をつけます。このymlファイルの場合、pythonというserviceのコンテナ名は「django_test」、dbというserviceのコンテナ名は「db_test」となります。
コンテナが乱立するとどれがどれだかわからなくなるので、わかりやすい名前をつけておいたほうが良いです。
ports:
ポートを公開します。詳しくはネットワーク関係の記事にまた書こうと思いますが、コンテナ内部には、ホストのコンピューターからしか接続ができません。ネットワークからは接続できないんです。だからこの項目で、ホストのポート番号に連絡が来たらコンテナ内のポート番号に受け渡して(ポートフォワーディング)、外からコンテナ内にアクセスできるようにしています。「ホストのポート番号:コンテナ内のポート番号」と書きます。
ports:
- 8000:8000
と書くことで、ホストの8000番ポートにアクセスが来たら、コンテナの8000番ポートと繋ぐよーという意味になります。
まだプログラミングを始めたての方がよく環境が構築できない理由に、ポートが公開されていないってのが多いのではないでしょうか。(自分がそうでした…w)
depends_on:
service同士の依存関係を書きます。このymlファイルで言うと、「python」と「db」というserviceの依存関係になりますね。
また、ここでコンテナの作成順序も決めています。このpythonというserviceはdbに依存しているので、このymlファイルを起動するとdbのコンテナが先に作成されます。
tty: true
docker-compose.ymlでコンテナを起動すると、コンテナがすぐに終了してしまいます。tty:trueを設定することで、コンテナが終了することを防ぎ、起動し続けさせることができます。
そもそもttyって何かというと、標準入力(入力待機画面みたいな感じ)への接続を表すらしいです。(あまりわかってない)コンテナに出入力を行える状態にさせるといった感じで覚えておけば良いと思います。
stdin_open: true
こちらもttyと同じで、標準入力への接続を表すようです。
image: mysql:5.7
コンテナを立ち上げるDockerfileがある場合が、その場所を示す「build:」を記述しましたが、Dockerfileがない場合はここでイメージを指定する必要があります。今回は、mysqlコンテナを作るためのDockerfileを書いていません。その場合はここに書かれているイメージを元にしてコンテナを作成します。
env_file: ./mysql/.env
環境変数を読み込むファイルを指定しています。git等に上げたらまずい環境変数(パスワードとか)は.envファイルで管理して、ここでdocker-composeに読み込ませましょう。
.envの中身は次の記事で作成していきます。
長くなったので続きは次の記事で
長くなったのでこの記事は一旦ここで終わります。次の記事で、Dockerfileとmysqlフォルダを作成していきます。