Giter VIP home page Giter VIP logo

mysql-docker-localdev's Introduction

MySQL docker local dev

MySQLを使った開発のdockerサンプル1

mysql ローカルコンテナ

この後、アプリをコードを入れるだろうから、docker compose を使う方針で行く。

docker-compose.yaml

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}

初期化SQL

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

  1. https://github.com/docker-library/mysql https://github.com/docker-library/docs/tree/master/mysql

  2. https://docs.docker.com/engine/reference/run/#user https://github.com/docker-library/docs/tree/master/mysql#running-as-an-arbitrary-user

  3. https://docs.docker.com/storage/bind-mounts/

  4. https://github.com/docker-library/docs/tree/master/mysql#environment-variables

  5. 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

  6. https://github.com/direnv/direnv/blob/master/man/direnv-stdlib.1.md#dotenv-dotenv_path

  7. https://github.com/direnv/direnv/blob/master/man/direnv-stdlib.1.md#source_env-file_or_dir_path

  8. https://git-scm.com/docs/gitignore

  9. https://docs.docker.com/engine/reference/commandline/compose_exec/

  10. https://docs.docker.com/network/bridge/#differences-between-user-defined-bridges-and-the-default-bridge

mysql-docker-localdev's People

Contributors

takekazuomi avatar

Watchers

 avatar James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.