loader image

[docker]docker-composeで複数のコンテナを連携

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

コメント

タイトルとURLをコピーしました