MySQLを使った開発のdockerサンプル1
この後、アプリをコードを入れるだろうから、docker compose を使う方針で行く。
version: '3'
services:
db:
image: mysql:8.0.29
ports:
- ${MYSQL_PORT:-3306}:3306
user: ${UID_GID:-1000:1000}
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/initdb.d:/docker-entrypoint-initdb.d
environment:
- MYSQL_RANDOM_ROOT_PASSWORD=yes
- MYSQL_USER=${MYSQL_USER:-dbuser}
- MYSQL_PASSWORD=${MYSQL_PASSWORD:-dbpass}
- MYSQL_DATABASE=${MYSQL_DATABASE:-db}
restart: always
networks:
- backend
networks:
backend:
driver: bridge
name: backend_network
デフォルトのままの場合コンテナはrootで実行され、bind mount されたホストのファイルシステムに root 権限のファイルが作成される。それだと使いづらいので、コンテナプロセスを実行するユーザーのユーザーID, グループIDを指定して、ホスト側のユーザーと揃える。2
user: "${UID_GID:-1000:1000}"
MySQLのデータと初期化SQLを保存する、ホストのパスを指定する。3
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/initdb.d:/docker-entrypoint-initdb.d
環境変数で、MySQLの初期設定を行う。4 それぞれの値を環境変数で上書きできるように${MYSQL_USER:-dbuser}
のようにした。5
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-mysql}
- MYSQL_USER=${MYSQL_USER:-dbuser}
- MYSQL_PASSWORD=${MYSQL_PASSWORD:-dbpass}
- MYSQL_DATABASE=${MYSQL_DATABASE:-db}
initdb.d/01_server_variable.sql
でMySQLの初期化SQLをながす。ここでは、文字種とTZを設定している。
set persist local_infile=on;
set persist character_set_server=utf8mb4;
set persist collation_server=utf8mb4_general_ci;
set persist time_zone='Asia/Tokyo';
環境変数の設定は、docker compose
の環境ファイルと、direnv を組み合わせで行う。
コンテナで必要な設定のうちパスワードなど機密情報ではないものは、.env
に記載する。.env
ファイル(デフォルトの環境変数ファイル)は、
docker compose
で自動的に読み込まれる。5
MYSQL_USER=dbuser
MYSQL_DATABASE=db
.envrc
では、dotenv
で、.env
を読み込ませる。6 ./.envrc.local
があれば読み込む7
dotenv
[[ ! -f ./.envrc.local ]] || source_env ./.envrc.local
./.envrc.local
は、git-ignore8 し、シークレットなど、ローカル環境で上書きしたい内容を書く。
export MYSQL_ROOT_PASSWORD=mysql
export MYSQL_PASSWORD=dbpass
※ 本環境はローカルでだけ実行されるので、パスワードなどシークレットをgitに上げても大きな問題は無いが、パスワードをソースコード管理に入れないのは良い習慣である。
このあたりを参考にするといろいろ書いてある。
Makefileに最低限のコマンドを記載した。
$ make
help: Show this help.
up: Up
down: Down
logs: Show logs
login: login db
clean: clean
mysql-client: connet mysql from mysql cli
docker compose exec db
のように、docker compose で起動したコンテナにサービス名を指定してアクセスすることができる。9
$ docker compose exec db /bin/bash
bash-4.4$
別のコンテナから、docker compose で起動したでMySQLのコンテナにアクセスする場合、docker compose で作成したbridge networksに接続すると、host dbとしてアクセスできる。10 ここでは、adminerを起動しMySQLにアクセスする。
$ docker run --rm -p 8080:8080 -e ADMINER_DEFAULT_SERVER=db --network backend_network adminer:4.8.1-standalone
Footnotes
-
https://github.com/docker-library/mysql https://github.com/docker-library/docs/tree/master/mysql ↩
-
https://docs.docker.com/engine/reference/run/#user https://github.com/docker-library/docs/tree/master/mysql#running-as-an-arbitrary-user ↩
-
https://github.com/docker-library/docs/tree/master/mysql#environment-variables ↩
-
https://docs.docker.com/compose/environment-variables/ typical shell syntax https://manpages.debian.org/unstable/manpages-ja/bash.1.ja.html#%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%81%AE%E5%B1%95%E9%96%8B ↩ ↩2
-
https://github.com/direnv/direnv/blob/master/man/direnv-stdlib.1.md#dotenv-dotenv_path ↩
-
https://github.com/direnv/direnv/blob/master/man/direnv-stdlib.1.md#source_env-file_or_dir_path ↩
-
https://docs.docker.com/engine/reference/commandline/compose_exec/ ↩
-
https://docs.docker.com/network/bridge/#differences-between-user-defined-bridges-and-the-default-bridge ↩