docker-compose.ymlをなんとなく理解する


# この投稿について
公式サイト・Qiita・ブログなどをみて
自分なりに理解したことを備忘録として記載しています

下記の記事からの補足になる
【IntelliJ + Docker (APP+DB) + SpringBoot (Maven) 環境構築】
https://qiita.com/SSM3G/items/bd61970648d94ccb691a

# 下記のdocker-compose.ymlを理解する
```yml:docker-compose.yml
version: '3'
services:
  app:
    image: openjdk:14-jdk-alpine
    ports:
      - "80:8080"
    volumes:
      - .:/app
    working_dir: /app
    command: ./mvnw spring-boot:run
    environment:
      DATASOURCE: jdbc:mysql://db:3306/sample
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: sample
      MYSQL_USER: user
      MYSQL_PASSWORD: passwrod
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    volumes:
      - ./docker/mysql:/docker-entrypoint-initdb.d
    ports:
      - "3306:3306"
```
# Dockerとは
アプリケーションを開発・移動・実行するためのプラットフォーム

# docker-compose.ymlとは
**複数のコンテナを同時に扱うためのツール**
今回はappとdbのコンテナ(サーバ)を作成したいためdocker-compose.ymlを使用します

```yml:docker-compose.yml
version: '3'
# docker-composeで使用するバージョンを定義している
# 最新どうかは公式サイトを見てね
# https://docs.docker.com/compose/compose-file/

services:
# アプリケーションを動かすための各要素をServiceと読んでいる
# 今回はappとdbがサービスとして定義されいるね※名前はわかりやすければ何でも良い
# appとかwebとかよく見るね
  app:
# appという名前でコンテナ作成

    image: openjdk:14-jdk-alpine
# コンテナを実行するときに必要なファイルシステムを構築する
# 今回はJAVAで実装しているからJAVAのイメージを構築して動かす
# alpineこれはたぶん軽量版なんだと思う
# image: openjdk:14-jdk　でも動くはず

    ports:
      - "80:8080"
# ポートを指定

# ※ポート番号として80番を使用する場合だけは例外で、ポート番号を省略した場合は80番が指定されたものとして扱われる
# http://localhost:80/ のようにアクセスする代わりに http://localhost/ のようにポート番号を省略してアクセスすることができる
# "8080:8080"ならhttp://localhost:8080/とアクセスすればアクセス可能

    volumes:
      - .:/app
# [PC側パス]:[Dockerコンテナ側パス]でPC側のディレクトリをDockerコンテナにボリュームとしてマウントすることができる
# 今回PC側は.なので現在いる階層のdemo配下をマウント
# HELP.md docker mvnw pom.xml target demo.iml docker-compose.yml mvnw.cmd src
# 上記ファイルがDocker側のapp配下に作成(マウント)される


    working_dir: /app
    command: ./mvnw spring-boot:run
# Dockerコンテナが実行される際、commandに記述しているコマンドがDockerコンテナ内で実行される
# 実行時のカレントディレクトリとしてworking_dirが使用される
# なので/appで ./mvnw spring-boot:runが実行されプロジェクトが起動

# ※Spring InitializrでDependenciesにSpring Boot DevToolを追加したと思いますが
# ファイルが変更された時にコンパイルしてくれてブラウザを更新するだけで表示に反映させてくれる
# え？なんで？！
# volumesでPC側とDocker側をマウント(共有)しているためPC側で変更した内容がDocker側にも即反映される仕組み
# しゅごい。。。

    environment:
# Dockerコンテナを起動する際に渡す環境変数を記述できる

      DATASOURCE: jdbc:mysql://db:3306/sample
# 「db」と命名したコンテナ(データベース)にアクセスしたいので設定してあげる
# サービス名とポートを記載してあげればつながります この部分ね→ db:3306
# ※ポート番号はdbの方で設定してあげているのと同じもの
# /sample はMYSQL_DATABASE:sample の部分だよ データベースを指定している

# ※jdbc:mysql://localhost:3306/sampleと書いては接続できないので注意
# コンテナの場合、localhost を指定しまうとコンテナ内の領域にアクセスしていってしまうので接続できません

  db:
# dbという名前でコンテナ作成

    image: mysql:5.7
# コンテナを実行するときに必要なファイルシステムを構築する
# データベースを構築したいのでmysql:5.7をイメージする

    environment:
# Dockerコンテナを起動する際に渡す環境変数

      MYSQL_ROOT_PASSWORD: password
# rootアカウント用のパスワード設定※必須事項

      MYSQL_DATABASE: sample
# データベース名を指定する

      MYSQL_USER: user
      MYSQL_PASSWORD: passwrod
# 新規ユーザとパスワード設定

    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
# MySQLの文字コードを指定
# ※appサーバとdbサーバの文字コードが違ってエラーを起こす可能があるため

    volumes:
      - ./docker/mysql:/docker-entrypoint-initdb.d
# Docker側の/docker-entrypoint-initdb.dディレクトリ内に
# SQLやスクリプトを置くことでimage起動時に自動的に実行される
# サンプルのデータとして太郎次郎三郎データ用意している

    ports:
      - "3306:3306"
# ポートを指定

```

# 参考サイト
https://qiita.com/nanakenashi/items/180941699dc7ba9d0922
https://nulab.com/ja/blog/typetalk/docker-tutorial-local-environment-team/