我使用docker-compose启动MySQL 5.7并尝试连接


本文是为想要轻松在Docker容器中启动MySQL的Docker初学者编写的。
另外,请注意,由于它基于SpringBoot(FrameWork)的开发,因此目标受众可能会受到限制。
vertical.png

假设

  • 什么是Docker?
  • 您已安装Mac版Docker

*如果尚未安装Docker,请参考下面的链接并启动Docker。
Qiita:https://qiita.com/scrummasudar/items/750aa52f4e0e747eed68

开发环境如下。

开发环境

  • Mac OS High Sierra
  • IntelliJ IDEA
  • SpringBoot 2.0.5
  • Java8的
  • 码头工人

Docker首先是什么?

简而言之,它是开源容器管理软件。
通过使用Docker容器,可以加快应用程序的构建和部署。请参阅以下内容,因为将省略详细说明。
Qiita:https://qiita.com/gold-kou/items/44860fbda1a34a001fc1
官方文档:https://docs.docker.com/

什么是Docker Compose? ??

可以定义和启动各种容器的工具(码头工人)。基本上,您可以使用YAML文件设置服务环境。另外,您只需一个命令即可轻松上手。
*当您安装Docker For Mac时,它会自动提供,因此您不需要单独安装

这次要做什么

  • 尝试使用docker-compose命令启动MySQL5.7(官方图片)
  • 尝试连接到已启动的MySQL 5.7
  • 检查数据库和表是否根据准备好的配置文件初始化
  • 查看输出查询日志

步骤

1.检查是否已安装Docker

终端

1
2
3
4
5
6
7
8
$ docker --version
Docker version 18.03, build c97c6d6 #インストールされていればバージョンが表示される

$ docker-compose --version
docker-compose version 1.22.0, build 8dd22a9

$ docker-machine --version
docker-machine version 0.14.0, build 9ba6da9

2.创建一个Dockerfile

目录结构如下。

宪法

1
2
3
4
5
6
7
8
9
10
sample-project/
             ├ docker/
             |       └ mysql/
             |              ├ conf.d/
             |              |       └ my.cnf
             |              ├ initdb.d/
             |              |         ├ schema.sql
             |              |         └ testdata.sql
             |              └ Dockerfile
             └ docker-compose.yml

Dockerfile就像一个指令,用于命令构建哪种类型的映像。
要使用5.7版的MySQL,请编写以下内容以构建正式映像。

Docker文件

1
2
FROM mysql:5.7
RUN touch /var/log/mysql/mysqld.log # 指定の場所にログを記録するファイルを作る

3.创建docker-compose.yml

此YAML文件允许您配置多个服务。具体来说,您可以指定每个服务的端口号并设置存储区域(卷)。

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: '3.3'                 # docker-composeのversionを指定
services:
  db:
    build: ./docker/mysql       # Dockerfileの置き場所を指定
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: sample_db
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: rootpassword
    ports:
      - "3314:3306"
    volumes:
      - ./docker/mysql/initdb.d:/docker-entrypoint-initdb.d
      - ./docker/mysql/conf.d:/etc/mysql/conf.d
      - ./log/mysql:/var/log/mysql

4.创建my.cnf

您可以在此处配置MySQL。

my.cnf

1
2
3
4
5
6
7
8
[mysqld]
character-set-server=utf8mb4       # mysqlサーバー側が使用する文字コード
explicit-defaults-for-timestamp=1   # テーブルにTimeStamp型のカラムをもつ場合、推奨
general-log=1                   # 実行したクエリの全ての履歴が記録される(defaultではOFFになっているらしい)
general-log-file=/var/log/mysql/mysqld.log # ログの出力先

[client]
default-character-set=utf8mb4               # mysqlのクライアント側が使用する文字コード

5.创建一个表定义文件

我想创建表作为初始化过程,因此准备一个DDL文件。

schema.sql

1
2
3
4
5
6
CREATE TABLE users (
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(32) NOT NULL,
    email VARCHAR(32) NOT NULL,
    PRIMARY KEY (id)
);

6.创建测试数据

您可以预先准备表中的数据。

testdata.sql

1
INSERT INTO users (id,name,email) VALUES (1, 'TOM','[email protected]');

7.执行docker-compose命令

以下命令在项目的根目录中执行。

终端

1
2
3
4
5
6
7
8
9
10
11
12
13
$ docker-compose up -d # コンテナを作成しスタートする
Creating network "sample-project_default" with the default driver
Creating sample-project_db_1 ... done

$ docker-compose ps # 存在するコンテナのリストを表示する
        Name                   Command           State           Ports        
--------------------------------------------------------------------------------
sample-project_db_1    docker-entrypoint.sh     Up      0.0.0.0:3314->3306/tcp
                       mysqld                           , 33060/tcp  

↓その他コマンド↓
$ docker-compose stop # サービスを停止させる
$ docker-compose down # コンテナの停止、削除、さらにネットワーク、記憶領域を全て削除

8.尝试连接到启动的MySQL

中,我将尝试立即连接到docker-compose启动的Mysql。

终端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ docker exec -it sample-project_db_1 bash # sample-project_db_1というコンテナに入りコマンドを実行
# mysql -u user -p # ログインする
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
mysql> use sample_db;
Database changed

Database changed
mysql> show tables; # テーブルが作られているか確認する
+---------------------+
| Tables_in_sample_db |
+---------------------+
| users               |
+---------------------+
1 row in set (0.00 sec)

mysql> select * from users; # 仕込んだデータが入っているか確認する
+----+------+-----------------+
| id | name | email           |
+----+------+-----------------+
|  1 | TOM  | [email protected] |
+----+------+-----------------+
1 row in set (0.00 sec)

由于您仅按原样从容器内部连接到Mysql,因此请更改连接方法并进行检查。
通过指定主机名和端口登录。 (如果未指定,则似乎已连接到默认端口3306)

终端

1
2
3
4
5
6
$ mysql --host 127.0.0.1 --port 3314 -u user -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g
?
?
mysql>

9.检查日志

确保在先前设置的位置创建文件。

目录结构

1
2
3
4
5
6
7
sample-project/
              ├ docker
              ├ log/
              |    └ mysql/
              ├ src       └ mysqld.log
              |
              └ docker-compose.yml

文件的内容如下所示。

mysqld.log

1
2
3
4
5
6
7
8
mysqld, Version: 5.7.23-log (MySQL Community Server (GPL)). started with:
Tcp port: 0  Unix socket: /var/run/mysqld/mysqld.sock
Time                 Id Command    Argument
2018-10-13T11:38:04.918533Z     1 Query CREATE DATABASE mysql;
2018-10-13T11:38:04.919437Z     1 Query USE mysql;
                 ?
                 ?
            以下割愛

这一次,所有查询日志都设置为输出,因此文件大小似乎很大(6.71MB)

印象数

我对容器的概念了解甚少,所以我觉得自己在做些事情,但是它比在本地安装MySQL并使用它要容易得多,并且它不会污染本地环境,所以我我正在考虑越来越多地使用它。
这次我没有介绍它,但是我希望以后可以分享使用Springboot开发的应用程序进行连接的过程。

其他参考页

  • 外部链接1:http://dqn.sakusakutto.jp/2015/10/docker_mysqld_tutorial.html
  • 外部链接2:https://blog.local-c.com/archives/1984