はじめに
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 を構築する手順をまとめました。この記事がどなたかの参考になれば幸いです。
コメント