Docker Compose 初学者向け：docker-compose.yamlファイルでNGINXとPostgreSQLを一括で立ち上げる技術検証

## はじめに

Docker Composeは、複数のDockerコンテナを定義、実行、管理するためのツールです。

:::note warn
***通常、アプリケーションは複数のサービス（例: Webサーバー、データベース、キャッシュなど）で構成されますが、Docker Composeを使用することで、簡単にセットアップできます。***
:::

未来の自分への備忘録としても活用できるよう、基礎的な部分を体系的にまとめました。***そのため、Docker初心者の方にも役立つ内容となっています！***

## Docker Composeとは？
Docker Composeは、```docker-compose.yaml```という設定ファイルを使って、複数のコンテナを定義し、構成を一元管理するためのツールです。

:::note
***このツールを使うことで、複雑なコンテナ間の依存関係や環境設定を簡単に処理できます。***
:::

例えば、アプリケーションがデータベースやキャッシュサーバーを必要とする場合、***個別にコマンドを実行して起動するのは手間がかかりますが、Docker Composeを使えば、一度設定することで、すべてを一度に起動できます。***

https://www.kagoya.jp/howto/cloud/container/dockercompose/

さらに詳しく知りたい方は、上記の記事で詳細に紹介されているので、参考にしてみてください。

### docker-compose.yamlファイルについて
```docker-compose.yaml```は、Docker Composeがサービスの構成を定義するために使用する設定ファイルです。

:::note warn
***このファイルでは、アプリケーションを構成する各サービスの設定、使用するイメージ、ボリューム、ネットワーク設定、環境変数などを記述します。***
:::

さらに詳しく知りたい方は、以下の記事でもハンズオン形式で紹介されているので、参考にしてみてください。

https://envader.plus/article/327

## 実際にローカルで起動してみた

ここでは、```docker-compose.yaml```ファイルを使用して、ローカル環境でDockerコンテナを起動し、ブラウザでアクセスできるようにする手順を紹介します。

### ディレクトリ構成
今回、簡単に実行するためのディレクトリ構成は以下のようになります。

```bash
/my-app
│
├── docker-compose.yaml  # Docker Compose構成ファイル
└── README.md            # (任意) アプリケーションの説明ファイル
```

以下のコマンドで、あらかじめディレクトリを作成しておいてください。

```bash
mkdir my-app
cd my-app
```

### ```docker-compose.yaml```ファイルの作成

```/my-app```ディレクトリ内に```docker-compose.yaml```という名前のファイルを作成します。

```/my-app/docker-compose.yaml
version: '3.8'  # Docker Composeファイルのバージョン

services:  # サービスの定義
  web:  # Webサーバーのサービス
    image: nginx:latest  # 使用するNginxのDockerイメージ
    ports:
      - "80:80"  # ホストのポート80をコンテナのポート80にマッピング
    networks:
      - app_network  # ネットワークの指定

  db:  # データベースのサービス
    image: postgres:latest  # 使用するPostgreSQLのDockerイメージ
    environment:
      POSTGRES_PASSWORD: examplepassword  # PostgreSQLのパスワードを設定
    volumes:
      - db_data:/var/lib/postgresql/data  # データの永続化
    networks:
      - app_network  # 同じネットワークに参加

volumes:  # ボリュームの定義
  db_data:  # 名前付きボリューム
    driver: local  # ドライバの指定

networks:  # ネットワークの定義
  app_network:  # ネットワーク名
    driver: bridge  # ドライバの指定
```

:::note warn
```Docker Compose```について、まだインストールされていない場合は、公式ガイドに従ってインストールを行ってください。
:::

私の環境では、以下の通り「```Docker Compose version v2.27.0-desktop.2```」が導入されていることが確認できました。

![スクリーンショット 2024-12-14 10.21.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/7a51a028-8060-b9b3-d17d-c1ba9bad3d3d.png)

## コンテナの起動

```docker-compose.yaml```ファイルが準備できたら、次のコマンドでコンテナをバックグラウンドで起動します。

```bash
docker-compose up -d
```

### エラー発生時の対処

上記コマンドを実行後、以下のようなエラーが発生した場合、Docker Desktopが起動していない、つまりDockerデーモンが動作していない可能性があります。

:::note
***Docker Desktopを起動して、再度実行してください。***
:::

![スクリーンショット 2024-12-14 10.29.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/41516dd8-f056-0071-0cfa-5ff7a374371a.png)

また、```docker-compose.yaml```ファイル内の```version```プロパティが非推奨であるという警告が表示されることがあります。

```bash
/Users/xxx/docker-compose.yaml: `version` is obsolete
```

この警告は、```version行```を削除することで解決できますが、特に支障はないため、このまま進めていきます。

![スクリーンショット 2024-12-14 10.37.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/d04cd2cf-5474-1e1a-0cac-358bb143616d.png)

上記のように、バックグラウンドで問題なく起動していることが確認できました。

## コンテナの状態確認

起動中のコンテナの状態を確認するには、以下のコマンドを実行します。

```bash
docker-compose ps
```

これにより、起動したサービスの状態やポートのマッピングが表示されます。

![スクリーンショット 2024-12-14 10.39.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/c37411d8-e8cf-6667-7629-718603f17f98.png)

## ブラウザでの確認

Nginxがポート80で公開されているので、ブラウザを開いて以下のURLにアクセスします。

```bash
http://localhost
```

Nginxのデフォルトのウェルカムページが表示されれば、サービスは正常に起動しています。

![スクリーンショット 2024-12-14 10.41.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/24eb1d83-1563-2afb-bfdd-b97f55df9497.png)

## PostgreSQLにログイン

次に、PostgreSQLのコンテナに接続します。```docker exec```コマンドを使って、コンテナ内で```psql```コマンドを実行します。

```bash
docker exec -it my-app-db-1 psql -U postgres
```

コンテナ名は```my-app-db-1```です。コンテナ名は、```docker-compose ps```コマンドで確認できます。

上記コマンドを実行すると、```psql```にログインでき、以下のようなプロンプトが表示されるはずです。

![スクリーンショット 2024-12-14 10.49.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/9b5f8ded-bdcb-f0df-9147-8cb2e60bd8b3.png)

余談ですが、PostgreSQLにログイン後、```\l```コマンドを実行することで、使用可能なデータベースを確認することができます。

```sql
➜  my-app git:(honda-branch) ✗ docker exec -it my-app-db-1 psql -U postgres
psql (17.2 (Debian 17.2-1.pgdg120+1))
Type "help" for help.

postgres=# \l
                                                    List of databases
   Name    |  Owner   | Encoding | Locale Provider |  Collate   |   Ctype    | Locale | ICU Rules |   Access privileges   
-----------+----------+----------+-----------------+------------+------------+--------+-----------+-----------------------
 postgres  | postgres | UTF8     | libc            | en_US.utf8 | en_US.utf8 |        |           | 
 template0 | postgres | UTF8     | libc            | en_US.utf8 | en_US.utf8 |        |           | =c/postgres          +
           |          |          |                 |            |            |        |           | postgres=CTc/postgres
 template1 | postgres | UTF8     | libc            | en_US.utf8 | en_US.utf8 |        |           | =c/postgres          +
           |          |          |                 |            |            |        |           | postgres=CTc/postgres
(3 rows)

postgres=# 
```

## まとめ
これで、ローカル環境で簡単にDocker Composeを使用して、NginxとPostgreSQLを含むアプリケーションをセットアップし、ブラウザでアクセスできるようになりました。

:::note warn
***Docker Composeを使用することで、複数のコンテナを簡単に管理でき、開発環境やテスト環境の構築がスムーズになります。***
:::

今後もDocker関連の知識を整理しながら発信していきますので、この記事が誰かの技術的な参考になれば幸いです！

## おまけ：コンテナの停止と削除

作業が完了したら、以下のコマンドでコンテナを停止し、削除します。

```bash
docker-compose down
```

このコマンドは、実行中のコンテナ、ネットワーク、ボリュームを削除します。

:::note
（***私自身もたまに忘れてしまうことがあるので、備忘録としてコマンドをおまけでまとめておきました（笑）。***）
:::

## 関連記事

https://qiita.com/kohki_takatama/items/651a5620494300ec5f9d

https://envader.plus/article/327

https://zenn.dev/mom/articles/519466e9c7a22d