docker-composeを何故使う?
・依存関係やnetwork設定を気にしながら複数のコンテナを作るのはめんどくさい
→docker-composeを使えば簡単に連携出来る
・いちいち複数のコンテナを起動停止するのはめんどくさい
→docker-composeを使えば複数のコンテナをワンコマンドで起動停止出来る
・別の環境に複数のコンテナを連携するのがめんどくさい
→yml ファイル1つだけで複数のコンテナを別環境に持ち運べる
※dockerfile等を作ってる場合はそれも持ってかないといけない
今回やること
python と mysql それぞれ別のコンテナで連携します。
具体的にはpython で mysql の test_db にあるテーブルを取得する。
ファイル構成
python+mysql │ Dockerfile │ docker-compose.yml │ table_get.py
docker-compose.ymlの作成
#docker-composeのver指定
version: "3.4"
services:
app:
container_name: python_app
build:
#認識する範囲
context: .
#Dockerfileからbuild
dockerfile: ./Dockerfile
db:
#dockerhubからpullするイメージ
image: mysql:5.7.37
container_name: mysql_db
#環境変数をコンテナに渡す
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test_db
ports:
- 3306:3306
python_app用のDockerfileを作成
FROM python:3.9.10
RUN apt-get update && \
apt-get -y install gcc libmariadb-dev && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
RUN /usr/local/bin/python -m pip install --upgrade pip
RUN pip install mysqlclient
COPY ./table_get.py /app/table_get.py
WORKDIR /app
CMD python ./table_get.py
python_app用のコードの作成
import MySQLdb
import time
#mysql起動のため10秒待つ
time.sleep(10)
# 接続する
connection = MySQLdb.connect(
host = 'db',
user='root',
passwd='root',
db='test_db')
# カーソルを取得する
cursor = connection.cursor()
# SQLを実行する
cursor.execute("""show tables;""")
# 実行結果を取得する
rows = cursor.fetchall()
# 1行ずつ表示する
for row in rows:
print(row)
cursor.close
connection.close
python_appはDockerfileを使ってるのでbuildする
docker-compose build ${docker-compose.ymlに記載したサービス名}
でbuildを実施する
docker-compose build app
docker-composeで複数のコンテナを一発で起動
docker-compose.ymlがあるフォルダまで移動して以下のコマンドを実行
docker-compose up
テーブルがない状態なので試しにテーブルを入れてpython_app実行
1.別ターミナルを立ち上げてdocker-compose.ymlがあるフォルダまで移動
2.dbコンテナに入る
docker-compose exec db bash
3.mysql ログイン
mysql -u root -p
4.tableの作成
create table test_db.test_table (id int,name varchar(10));
5.python_appを実行
docker-compose up app
結論
インフラでも開発でも複数のコンテナを使う状況は結構あるのでエンジニアであれば必須知識。
参考:https://docs.docker.jp/compose/toc.html
https://takaya030.hatenablog.com/entry/2022/02/11/181847
コメント