Docker設定ファイルの記載について #2（初心者）

この記事は前回の記事の続きになります。

https://qiita.com/syakesoba/items/47decde49b4dc889078c

# 2.必要なDocker関連ファイル
### 2.docker-compose.yml
docker-compose.ymlとは各環境を一括管理するための設定ファイルです。
今回のプロジェクトでは以下のように記述しています。
```docker-compose.yml
networks:
  app-network:
    driver: bridge
services:
  backend:
    build: ./backend
    ports:
      - "8080:8080"
    environment:
      SPRING_PROFILES_ACTIVE: ${SPRING_PROFILE}
      SPRING_DATA_MONGODB_URI: "mongodb://admin:password@mongo:27017/taskmanager"

    depends_on:
      mongo:
        condition: service_healthy
    networks:
      - app-network
    restart: always

  frontend:
    build: ./frontend
    ports:
      - "3000:3000"
    volumes:
      - ./src:/app/src  # ローカルのsrcをコンテナの/app/srcにマウント
    depends_on:
      - backend
    networks:
      - app-network
    restart: always

  mongo:
    image: mongo:latest
    ports:
      - "27017:27017"
    volumes:
      - mongo_data:/data/db
    environment:
      MONGO_USERNAME: ${MONGO_USERNAME}
      MONGO_PASSWORD: ${MONGO_PASSWORD}
    networks:
      - app-network
    restart: always
    healthcheck:
      test: ["CMD", "mongosh", "--eval", "db.runCommand({ ping: 1 })"]
      interval: 10s
      timeout: 5s
      retries: 5


volumes:
  mongo_data:
```
上から順に確認していきましょう。

##### 1.networks
```yaml
networks:
  app-network:
    driver: bridge
```
- すべてのサービスが app-network を使用して通信するよう設定。
- driver: bridge により、サービス間での通信が可能。

##### 2.backend
```yaml
services:
  backend:
    build: ./backend
    ports:
      - "8080:8080"
    environment:
      SPRING_PROFILES_ACTIVE: ${SPRING_PROFILE}
      SPRING_DATA_MONGODB_URI: "mongodb://admin:password@mongo:27017/taskDB"
    depends_on:
      mongo:
        condition: service_healthy
    networks:
      - app-network
    restart: always
```
- build：./backend → backend ディレクトリ内の Dockerfile を基にコンテナを作成。
- ports：ホストの 8080 をコンテナの 8080 にマッピング。
- environment：
  - SPRING_PROFILES_ACTIVE → .env から Spring Boot のプロファイル設定を適用。
  - SPRING_DATA_MONGODB_URI → MongoDB への接続 URI（環境変数未使用）
- depends_on：mongo の healthcheck が成功したら backend を起動。
- restart：always → 異常終了時も自動で再起動。

##### 3.frontend
```yaml
services:
  frontend:
    build: ./frontend
    ports:
      - "3000:3000"
    volumes:
      - ./src:/app/src
    depends_on:
      - backend
    networks:
      - app-network
    restart: always
```
- build：./frontend → frontend ディレクトリの Dockerfile を基にイメージを作成。
- ports：ホストの 3000 をコンテナの 3000 にマッピング。
- volumes：./src:/app/src → ローカルの src ディレクトリをコンテナにマウントし、変更を即座に反映可能。
- depends_on：backend 起動後に frontend を起動。
- restart：always → 障害時に再起動。

##### 4.mongo
```yaml
services:
  mongo:
    image: mongo:latest
    ports:
      - "27017:27017"
    volumes:
      - mongo_data:/data/db
    environment:
      MONGO_USERNAME: ${MONGO_USERNAME}
      MONGO_PASSWORD: ${MONGO_PASSWORD}
    networks:
      - app-network
    restart: always
    healthcheck:
      test: ["CMD", "mongosh", "--eval", "db.runCommand({ ping: 1 })"]
      interval: 10s
      timeout: 5s
      retries: 5
```
- image：mongo:latest → MongoDB の最新バージョンを使用。
- ports：ホストの 27017 をコンテナの 27017 にマッピング。
- volumes：mongo_data:/data/db → MongoDB のデータを永続化。
- environment：.env ファイルから MONGO_USERNAME と MONGO_PASSWORD を取得し環境変数として適用。
- restart：always → 異常終了時に再起動。
- healthcheck：mongosh コマンドで MongoDB が稼働しているか確認（5回リトライ）。

##### 5.volumes
```yaml
volumes:
  mongo_data:
```
- mongo_data：MongoDB のデータを保持。

説明は以上になります。
これからも学習の記録を投稿していきますのでよろしくお願いします。