Docker Compose を使って Mac に MySQL を構築する

IT

はじめに

Docker Compose を使って Mac に MySQL を構築する手順をまとめます。

環境

以下が今回の環境です。Docker Compose の v2 を使用します。
Docker Compose v2 のインストールは後述する手順の中で行います。

$ docker compose version
Docker Compose version v2.2.3

手順

Docker Compose のインストール

公式ドキュメントを参考に Docker Compose v2 をインストールします。
下記コマンドを実行します。

$ DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
$ mkdir -p $DOCKER_CONFIG/cli-plugins
$ curl -SL https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose

ダウンロードが完了したら、バイナリに対して、実行権限を付与します。

$ chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose

インストールできていることを確認します。

$ docker compose version
Docker Compose version v2.2.3

各種ファイルの作成

以下の構成でファイルを作成します。

mysql_docker
├── docker-compose.yml
└── mysql
    ├── db
    │   └── init.sql
    ├── Dockerfile

Dockerfile の内容は以下です。

FROM mysql

EXPOSE 3306

CMD ["mysqld"]

EXPOSEでポートに関する記述をしていますが、EXPOSEでは実際にはポートは公開されません。
そのため次で作成する、docker-compose.yml でポートの指定を行う必要があります。

The EXPOSE instruction does not actually publish the port. It functions as a type of documentation between the person who builds the image and the person who runs the container, about which ports are intended to be published. To actually publish the port when running the container, use the -p flag on docker run to publish and map one or more ports, or the -P flag to publish all exposed ports and map them to high-order ports.

Dockerfile reference | Docker Documentationより

docker-compose.yml の内容は以下です。

version: "3.9"
services:
  mysql:
    build: ./mysql/ #Dockerfileのパス
    ports:
      - "33060:3306" #ホストの33060番ポートとコンテナの3306番ポートをマッピング
    volumes:
      - ./mysql/db:/docker-entrypoint-initdb.d #初期データをマウントする場所
    image: mysql_sample:latest #イメージ名
    environment:
      - MYSQL_ROOT_PASSWORD=mysql_password 

Docker の MySQL イメージを使用する場合、”/docker-entrypoint-initdb.d” にマウントしたディレクトリに “.sql”、”.sh”、”.sql.gz” という拡張子でファイルを配置することで、MySQL イメージからコンテナを生成・起動する時に、それらのファイルを読み込み実行させることできます。

init.sql の内容は以下です。

CREATE DATABASE pets;
USE pets;

CREATE TABLE cats
(
  id              INT unsigned NOT NULL AUTO_INCREMENT, # Unique ID for the record
  name            VARCHAR(150) NOT NULL,                # Name of the cat
  owner           VARCHAR(150) NOT NULL,                # Owner of the cat
  birth           DATE NOT NULL,                        # Birthday of the cat
  PRIMARY KEY     (id)                                  # Make the id the primary key
);

コンテナ作成 ~ MySQL の起動

Docker Compose コマンドを使用して、コンテナを作成します。
作成したコンテナにログインし、MySQL に接続します。

# イメージのビルド
$ docker compose build
# コンテナの作成、起動
$ docker compose up -d
# コンテナにログイン(下記の mysql_docker-mysql-1 はコンテナ名)
$ docker exec -it mysql_docker-mysql-1 bash
# MySQL に接続
root@c32e5c712407:/# mysql -u root -p

init.sql に記載した SQL が実行され、データベースおよびテーブルが作成されていることが確認できます。

mysql> use pets;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> 
mysql> desc cats;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int unsigned | NO   | PRI | NULL    | auto_increment |
| name  | varchar(150) | NO   |     | NULL    |                |
| owner | varchar(150) | NO   |     | NULL    |                |
| birth | date         | NO   |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

設定をデフォルトから変更する場合、my.cnfを作成し Docker イメージに含めてください。
my.cnf の保存場所はこちらを参考に決めてください。
my.cnf の例

[client]
port=3306
socket=/tmp/mysql.sock

[mysqld]
port=3306
socket=/tmp/mysql.sock
key_buffer_size=16M
max_allowed_packet=8M

[mysqldump]
quick

おまけ

Docker Compose を使用せずとも、下記コマンドを実行することで、MySQL コンテナを作成し、ログインすることができます。
サクッと構築したい場合はこちらでも良いかもしれないですね。

$ docker pull mysql:latest
$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql_password -d -p 33060:3306 mysql
$ docker exec -it mysql bash
$ mysql -u root -p
Enter password: 

おわりに

Docker Compose を使って MySQL を構築する手順をまとめました。この記事がどなたかの参考になれば幸いです。

参考

コメント