この投稿について
公式サイト・Qiita・ブログなどをみて
自分なりに理解したことを備忘録として記載しています
下記の記事からの補足になる
【IntelliJ + Docker (APP+DB) + SpringBoot (Maven) 環境構築】
https://qiita.com/SSM3G/items/bd61970648d94ccb691a
下記のdocker-compose.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を使用します
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/