0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

dockerでmysqlのイメージを起動する手順

0
Last updated at Posted at 2026-04-12

dockerでmysqlを作成する際の手順について

ディレクトリ構造

Plaintext
.
├── docker-compose.yml
└── db/
    ├── conf.d/
    │   └── my.cnf            # MySQLの詳細設定
    └── init/
        ├── 01_schema.sql     # 1: テーブル作成
        └── 02_data.sql       # 2: 初期データ(別ファイル化)

初期化ファイルの準備
ファイルの先頭に番号をつけることで、実行順序を制御します。

01_schema.sql

CREATE TABLE IF NOT EXISTS users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

02_data.sql

INSERT INTO users (name) VALUES ('Qiita太郎'), ('Docker次郎');

MySQL設定ファイル (db/conf.d/my.cnf)
日本語環境に合わせて文字コードとタイムゾーンを最適化します。

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default-time-zone = 'Asia/Tokyo'

[client]
default-character-set=utf8mb4
docker-compose.yml の記述

YAML

services:
  db:
    image: mysql:8.0
    container_name: mysql-dev-container
    platform: linux/amd64
    restart: always
    # 外部(IntelliJ等)から接続するためのポート
    ports:
      - "3306:3306"
    # 基本設定
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_DATABASE: my_app_db
      MYSQL_USER: dev_user
      MYSQL_PASSWORD: dev_password
      TZ: 'Asia/Tokyo'
    # ホストとコンテナの同期
    volumes:
      - ./db/init:/docker-entrypoint-initdb.d  # SQLの自動実行
      - ./db/conf.d:/etc/mysql/conf.d          # 設定ファイルの反映
      - mysql_data:/var/lib/mysql              # データの永続化

volumes:
  mysql_data:

運用のポイント

初期化が走らない場合: 既にボリュームが存在していると、SQLは実行されません。docker-compose down -v でボリュームを一度破棄して再起動してください。

ログの確認方法: 起動中に何が起きているかは docker-compose logs -f db で確認できます。

docker-compose.yml の詳細解説

Docker Composeは、複数のコンテナの「起動オプション」を一つのファイルに集約したものです。

項目 詳細な役割
platform: linux/amd64 M1/M2/M3 Mac(ARM)でMySQLを動かす際、これを指定しないと「イメージがOSと一致しない」という警告やエラーが出ることがあります。互換性を保つためのおまじないです。
environment MYSQL_ROOT_PASSWORDは必須です。MYSQL_DATABASEを指定すると、起動時にその名前のDBが空の状態で自動作成されます。
volumes 最重要項目です
「./db/init:/docker-entrypoint-initdb.d: 初期化SQLの注入。」
「./db/conf.d:/etc/mysql/conf.d: 設定ファイルの反映。」
「mysql_data:/var/lib/mysql: コンテナを消してもデータが消えないようにホスト側に保存。』
restart: always PCの再起動時や、エラーでコンテナが落ちた際に自動で再立ち上げを行う設定です。

db/conf.d/my.cnf の詳細解説

MySQL本体の挙動をカスタマイズする設定ファイルです。Dockerでは、設定ファイルを直接書き換えるのではなく、/etc/mysql/conf.d に独自の .cnf ファイルを配置(マウント)することで、デフォルト設定を上書きするのが一般的です。

Ini, TOML

[mysqld]
# 文字コード設定。utf8mb4は絵文字なども扱える現代の標準設定です。
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

# タイムゾーンの設定
default-time-zone = 'Asia/Tokyo'

[client]
# MySQLクライアントから接続する際のデフォルト文字コード
default-character-set=utf8mb4

environmentの変数を別だしする方法

  1. 直接 docker-compose.yml に書く(基本)
    先ほどの例のように、ファイル内に直接値を記述します。

・メリット: 構造が分かりやすく、自分だけで試すなら一番早い。

・デメリット: Gitなどにアップロードするとパスワードが丸見えになる。

YAML

environment:
  MYSQL_ROOT_PASSWORD: my_strong_password
  1. .env ファイルを使う(推奨・応用)
    docker-compose.yml と同じ階層に .env という名前のファイルを作り、そこで変数として管理します。Docker Composeは起動時に自動でこのファイルを読み込みます。

プロジェクト構成

.
├── .env                 <-- ここにパスワードを書く
└── docker-compose.yml   <-- 変数名だけを書く

.env の中身

# key=value 形式で記述
DB_ROOT_PASS=root_password
DB_USER=dev_user
DB_PASS=dev_password

docker-compose.yml の書き方
${変数名} という形式で記述します。

environment:
  MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS}
  MYSQL_USER: ${DB_USER}
  MYSQL_PASSWORD: ${DB_PASS}
  1. OSの環境変数から読み込む
    PC(ホスト側)のターミナルで export DB_ROOT_PASS=password と設定されている場合、Docker Composeはそれを利用することも可能です。

:point_up:セキュリティ:パスワードの管理について

パスワードを docker-compose.yml に直接書くと、GitHub等にプッシュした際に漏洩するリスクがあります。
実務や公開用プロジェクトでは .env ファイル を使用しましょう。

.env ファイルを作成し、MYSQL_ROOT_PASSWORD=password のように定義。

docker-compose.yml では ${MYSQL_ROOT_PASSWORD} と記述して参照。

.gitignore に .env を追加して、Gitの管理から外す。

AWSでdocekerの環境変数を管理するためには

1. AWS ECS (Fargateなど) を使う場合
ECSの「タスク定義」には、環境変数を設定する項目があります。ここで設定した値は、コンテナ内のOS環境変数として自動的に注入されます。

docker-compose.yml の書き方:
値を直接書かずに、変数名だけを記述します。これにより、ホスト(AWS環境)の環境変数をそのままコンテナへ引き継ぎます。

services:
  db:
    image: mysql:8.0
    environment:
      # 値を書かないことで、ホスト側の環境変数を自動で読み込む
      - MYSQL_ROOT_PASSWORD 
      - MYSQL_DATABASE

2. Secrets Manager / Parameter Store を使う場合(推奨)
パスワードなどの機密情報は、AWSの専用サービスで管理するのがベストプラクティスです。

ECSの場合:

タスク定義の secrets セクションで、Parameter StoreのARNを指定します。

メリット: docker-compose.yml やコンテナ定義にパスワードが一切残らないため、非常に安全です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?