🐳

【Docker】マルチコンテナアプリケーションとは

2024/06/21に公開

マルチコンテナアプリケーションとは

  • ネットワークを通じて複数のコンテナが互いにやり取りを行いながら処理を実行するアプリケーションのこと。
  • 複数のコンテナとは、webアプリケーション(RailsやDjangoなど)とDB(MySQLやPostgreSQLなど)などのことを指す。
  • docker-compose.ymlファイルで定義する。docker-compose.ymlファイルでは、webdbを定義する。
  • 2つのコンテナーが同一ネットワーク上にあれば互いにやりとりができる。 同一ネットワーク上にないときはできない。

マルチコンテナアプリケーションのディレクトリ構成

myapp/
├── docker-compose.yml
├── web/
│   ├── Dockerfile
│   └── app.py
└── db/
    └── Dockerfile
  • Dockerfile
    各サービスごとに作成する。各サービスのイメージをビルドする際の依存関係や設定を個別に管理する。

  • docker-compose.yml
    単一のファイルで複数のサービスを定義する。サービス間のネットワーク設定、ボリュームの共有、依存関係の管理が容易になる。

docker-compose.yml

version: '3'
services:
  web:
    build: ./web
    ports:
      - "5000:5000"
    volumes:
      - ./web:/app
    environment:
      - FLASK_ENV=development
    depends_on:
      - db
  db:
    build: ./db
    ports:
      - "3306:3306"
    volumes:
      - db_data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=rootpassword
      - MYSQL_DATABASE=mydatabase

volumes:
  db_data:

Dockerfile

web/Dockerfile
# ベースイメージを指定
FROM python:3.8-slim

# 作業ディレクトリの設定
WORKDIR /app

# 依存関係のインストール
COPY requirements.txt .
RUN pip install -r requirements.txt

# アプリケーションのコピー
COPY . .

# コンテナ起動時に実行するコマンド
CMD ["python", "app.py"]
db/Dockerfile
# ベースイメージを指定
FROM mysql:5.7

# 環境変数の設定
ENV MYSQL_ROOT_PASSWORD=rootpassword
ENV MYSQL_DATABASE=mydatabase

# 初期化スクリプトのコピー
COPY init.sql /docker-entrypoint-initdb.d/

まとめ

参考:

https://matsuand.github.io/docs.docker.jp.onthefly/get-started/07_multi_container/

Discussion