【docker-compose.yaml】Dockerの設定ファイル一覧（特にDB系）

# 概要

[こちらの本](https://book.impress.co.jp/books/1121101138)を参考に、pythonやDB系のツールの`docker-compose.yaml`（`docker-compose.yml`、または`compose.yml`）の設定ファイルの一覧を備忘として残します。

参考にしている本の設定ファイルをそのまま、にしているか所もありますが、私の経験をもとにより使いやすくなるような設定もしています。

## 本記事で紹介しているdocker-compose.yaml設定ファイルの一覧

- DjangoとPostgreSQL
    - DjangoとPostgreSQLをつなげて動くサーバ
- Flask
    - Flaskが動くサーバ
- mariadb
    - MariaDBが動くサーバ
- mariadbとphpmyadmin
    - MariaDBとそれをSQLクライアントで接続して、SQLをたたけるようにしているdocker-compose.yamlの設定
- postgresql
    - PostgreSQLが動くサーバ
- postgresqlとpgadmin4
    - PostgreSQLとそれをSQLクライアントで接続して、SQLをたたけるようにしているdocker-compose.yamlの設定


**Github**
- [この記事で紹介しているファイルを格納しているGithub](https://github.com/KENTAROSZK/docker_compose_yamls)


## DjangoとPostgreSQL
- DjangoとPostgreSQLをつなげて動くサーバ

```Dockerfile:Dockerfile
FROM python:3.10
WORKDIR /code
ADD requirements.txt /code/
RUN pip install --no-cache-dir -r requirements.txt
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
```

```yaml:docker-compose.yaml
services:
  db:
    image: postgres:14.2
    environment:
      POSTGRES_DB: testdb
      POSTGRES_USER: testuser
      POSTGRES_PASSWORD: testpass
    volumes:
      - db-data:/var/lib/postgresql/data

  web:
    build:
      context: .
      dockerfile: Dockerfile
    depends_on:
      - db
    ports:
      - "8000:8000" # 「http://localhost:8000/」
    volumes:
      - .:/code

volumes:
  db-data:
```

```text:requirements.txt
Django
psycopg2-binary
```

```python:manage.py
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys


def main():
    """Run administrative tasks."""
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)


if __name__ == '__main__':
    main()
```

## Flask
- Flaskが動くサーバ

```Dockerfile:Dockerfile
FROM python:3.10
WORKDIR /usr/src/app
RUN pip install flask==2.3.1
CMD ["flask", "run", "--host=0.0.0.0", "--debug"]
```

```yaml:docker-compose.yaml
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: flask-container
    ports:
      - "5000:5000" # 「http://localhost:5000/」
    volumes:
      - ./src:/usr/src/app
```

```python:src/manage.py
from flask import Flask

app = Flask(__name__)


@app.route("/")
def hello_flask() -> str:
	return "hello flask!" # ブラウザに hello flask を表示する
```

```yaml:docker-compose.yaml
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: flask-container
    ports:
      - "5000:5000" # 「http://localhost:5000/」
    volumes:
      - ./src:/usr/src/app
```


## mariadb
- MariaDBが動くサーバ

```yaml:docker-compose.yaml
# DBを使うためには、ユーザ名やパスワードの設定が必要である.

# MariaDBの主な環境変数は
# - MARIADB_ROOT_PASSWORD : ルートユーザのパスワード
# - MARIADB_DATABASE : データベース名
# - MARIADB_USER : データベースのユーザ名
# - MARIADB_PASSWORD : データベースのパスワード


services:
  mariadb:
    image: mariadb:10.7
    container_name: mariadb-container
    environment:
      MARIADB_ROOT_PASSWORD: rooptpassword
      MARIADB_DATABASE: testdb
      MARIADB_USER: testuser
      MARIADB_PASSWORD: testpass
    volumes:
      - db-data:/var/lib/mysql

# 通常はコンテナを削除した時に、コンテナのデータも一緒に削除されてしまう.
# それを避けるために、ボリュームの永続化をする.
# 永続化したいディレクトリを以下のvolumesで定義しておく.
# 定義する時は、ホスト側（ローカル側）のPCのディレクトリを指定しておく.
volumes:
  db-data:
```




## mariadbとphpmyadmin
- MariaDBとそれをSQLクライアントで接続して、SQLをたたけるようにしているdocker-compose.yamlの設定



```yaml:docker-compose.yaml
# DBを使うためには、ユーザ名やパスワードの設定が必要である.

# MariaDBの主な環境変数は
# - MARIADB_ROOT_PASSWORD : ルートユーザのパスワード
# - MARIADB_DATABASE : データベース名
# - MARIADB_USER : データベースのユーザ名
# - MARIADB_PASSWORD : データベースのパスワード


services:
  db:
    image: mariadb:10.7
    environment:
      MARIADB_ROOT_PASSWORD: rootpass
      MARIADB_DATABASE: tetsdb
      MARIADB_USER: testuser
      MARIADB_PASSWORD: testpass
    volumes:
      - db-data:/var/lib/mysql

  phpmyadmin:
    image: phpmyadmin:5.2
    depends_on:
      - db
    environment:
      PMA_HOST: db # データベースのホスト名。MariaDBのコンテナの名前を設定する.
      PMA_USER: testuser # データベースのユーザ名。上で設定したMariaDBのユーザ名を設定する.
      PMA_PASSWORD: testpass # データベースのパス。上で設定したMariaDBのパスワードを設定する.
    ports:
      - "8080:80" # ブラウザで「http://localhost:8080/」
    volumes:
      - phpmyadmin-data:/sessions

volumes:
  db-data:
  phpmyadmin-data:
```





## postgresql
- PostgreSQLが動くサーバ



```yaml:docker-compose.yaml
# DBを使うためには、ユーザ名やパスワードの設定が必要である.

# PostgreSQLの主な環境変数は
# - POSTGRES_DB : データベース名
# - POSTGRES_USER : データベースのユーザ名
# - POSTGRES_PASSWORD : データベースのパスワード


services:
  db:
    image: postgres:14.2
    environment:
      POSTGRES_DB: testdb
      POSTGRES_USER: testuser
      POSTGRES_PASSWORD: testpass
    volumes:
      - db-data:/var/lib/postgresql/data

volumes:
  db-data:
```




## postgresqlとpgadmin4
- PostgreSQLとそれをSQLクライアントで接続して、SQLをたたけるようにしているdocker-compose.yamlの設定


```yaml:docker-compose.yaml
# DBを使うためには、ユーザ名やパスワードの設定が必要である.

# PostgreSQLの主な環境変数は
# - POSTGRES_DB : データベース名
# - POSTGRES_USER : データベースのユーザ名
# - POSTGRES_PASSWORD : データベースのパスワード


services:
  db:
    image: postgres:14.2
    environment:
      POSTGRES_DB: testdb
      POSTGRES_USER: testuser
      POSTGRES_PASSWORD: testpass
    volumes:
      - db-data:/var/lib/postgresql/data

  pgadmin4:
    image: dpage/pgadmin4:8.13
    depends_on:
      - db
    environment:
      PGADMIN_DEFAULT_EMAIL: admin@gmail.com # 【実際に自分が使用できるメアド】
      PGADMIN_DEFAULT_PASSWORD: pass
    ports:
      - "8080:80" # ブラウザで「http://localhost:8080/」
    volumes:
      - pgadmin4-data:/var/lib/pgadmin

volumes:
  db-data:
  pgadmin4-data:
```


# まとめ

- Dockerを使う系のファイルを参考書籍を基にまとめてみました。
- `docker-compose.yaml`って今は`compose.yaml`でも良いとのことらしいです。Dockerのバージョンが変わり、`compose.yaml`が今は推奨で、`docker-compose.yaml`が非推奨（知らなかったです..しかし、docker-compose.yamlの方が書きなれているので、今回はずっとファイル名を古い名前でやってました。）
- 今後、上記していないdockerコンテナ用の設定ファイルも作成次第、Githubにも随時更新をしていこうと思っています。
    - 特に、pythonやjupyterなど、データサイエンスでよく使う系のコンテナを作成したいと思っています。