1. ホーム
  2. ドッカー

docker-composeによるmysqlのデプロイメントの実践

2022-03-03 12:09:44
<パス

記事目次

docker-composeによるmysqlのデプロイメントの実践

golangでapiサーバを書いたけど、テストデータも使いたいし、他の人にもファシリテートしたいので、dockerで環境をデプロイするのが一番簡単だと思う。単純に2つのコマンドを実行するだけで完了です。ブログ主の環境はwindowsで、windowsの中にcentos7の仮想マシンをデプロイします。その仮想マシンの中に、dockerをインストールし、デプロイしています。

1. dockerのインストールとデプロイ

linuxでは、簡単なコマンドで。

yum install docker


他のシステムも同様です。

2. docker-composeファイルの作成

version: '2'
services:
    mysql:
        network_mode: "host"
        environment:
            MYSQL_ROOT_PASSWORD: "yourpassword"
            MYSQL_USER: 'test'
            MYSQL_PASS: 'yourpassword'
        image: "docker.io/mysql:latest" 
        restart: always
        volumes:
            - ". /db:/var/lib/mysql"
            - ". /conf/my.cnf:/etc/my.cnf"
            - ". /init:/docker-entrypoint-initdb.d/"


network_mode はコンテナのネットワークモードで、通常はテスト用にホストモードを使用します。 MYSQL_ROOT_PASSWORD は、データベースのパスワードで、rootユーザのパスワードです。 MYSQL_USER MYSQL_PASS imageは引っ張ってくるイメージのアドレスとバージョンです。自分のイメージリポジトリに変更してもいいですが、ここは公式のものを使ってください。 volumesはローカルとDockerコンテナ内のフォルダとディレクトリをマッピングするためのパラメータがあります。 . /db は、データベースのテーブルファイルを格納するために使用されます。 . /conf/my.cnf はカスタム設定ファイルを保持します。 . /init ポートで、ホストとコンテナのポートをマッピングします。docker-compose.ymlを書いたら、対応するフォルダを作成するか、自分の好きなフォルダに変更してください。以下はブロガーのフォルダ構成です。

root@localhost mysql # tree
.
├── conf
│ └── my.cnf
├── db
├── docker-compose.yml
└── init
    └── init.sql

root@localhost conf # cat my.cnf 
[mysqld]
user=mysql
default-storage-engine=INNODB
character-set-server=utf8
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8


3. 設定ファイル、初期化ファイルの作成

root@localhost init # cat init.sql 
use mysql;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'yourpassword';
create database test;
use test;
create table user
(
    id int auto_increment primary key,
    username varchar(64) unique not null,
    email varchar(120) unique not null,
    password_hash varchar(128) not null,
    avatar varchar(128) not null
);
insert into user values(1, "zhangsan","[email protected]","passwd","avaterpath");
insert into user values(2, "lisi","[email protected]","passwd","avaterpath");

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'yourpassword';

ここにある設定ファイルはあくまで簡単な例ですので、ご自身の設定に合わせて変更してください。

root@localhost mysql # docker-compose pull

....... Download the image process

root@localhost mysql # docker-compose up -d

mysql_mysql_1_234be9b015e4 is up-to-date
root@localhost mysql # 


root@localhost mysql # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cffe8d56f222 docker.io/mysql:latest "docker-entrypoint... " 21 minutes ago Up 21 minutes mysql_mysql_1_234be9b015e4 root@localhost mysql # docker exec -it cffe8d56f222 bash root@localhost:/# mysql -uroot -p Enter password: Welcome to the MySQL monitor. commands end with ; or \g. Your MySQL connection id is 11 Server version: 8.0.13 MySQL Community Server - GPL Copyright (c) 2000, 2018, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use test; 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> select * from user; +----+----------+------------------+---------------+------------+ | id | username | email | password_hash | avatar | +----+----------+------------------+---------------+------------+ | 1 | zhangsan | [email protected] | passwd | avaterpath | | 2 | lisi | [email protected] | passwd | avaterpath | + ----+----------+------------------+---------------+------------+ 2 rows in set (0.00 sec) この行はルートアクセスを解除するために重要なので、他のホストでルートユーザーでデータベースにログインする場合は、この行を記述する必要があります。残りの文は、テーブル作成操作とデータ挿入操作です。

4. データベースを起動する

root@localhost mysql # docker-compose pull

....... Download the image process

root@localhost mysql # docker-compose up -d

mysql_mysql_1_234be9b015e4 is up-to-date
root@localhost mysql # 


docker-compose.ymlが格納されているフォルダで実行する必要があります。

5. 初期化されたデータの確認

root@localhost mysql # docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cffe8d56f222 docker.io/mysql:latest "docker-entrypoint... " 21 minutes ago Up 21 minutes mysql_mysql_1_234be9b015e4
root@localhost mysql # docker exec -it cffe8d56f222 bash
root@localhost:/# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor. commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.13 MySQL Community Server - GPL

Copyright (c) 2000, 2018, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.
Other names may be trademarks of their respective owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use test;
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> select * from user;
+----+----------+------------------+---------------+------------+
| id | username | email | password_hash | avatar |
+----+----------+------------------+---------------+------------+
| 1 | zhangsan | [email protected] | passwd | avaterpath |
| 2 | lisi | [email protected] | passwd | avaterpath |
+ ----+----------+------------------+---------------+------------+
2 rows in set (0.00 sec)



データベースにデータが預けられるのがわかります。

6. リモート接続を確認する

Windowsホスト上のNavicatでもデータベースに接続できます。ipは仮想マシンのip、ポートは3306、パスワードはdocker-composeファイルにあるrootパスワードです。ここで、ホストマシンのファイアウォール(私はliunx VM)をオフにしないと接続できませんし、ポート3306を開放して外部からのアクセスにすることも可能です。