使用Docker安装MySQL

在后台开发中,一般使用MySQL来存储用户的数据。比如开发小游戏服务端,生产环境跑在机房的Linux环境,连接机房的云数据库。平时在Windows下开发,需要使用本地的数据库。为了本机Windows系统的稳定,不安装太多的软件,决定使用Docker在安装一个MySQL用于开发。

我们开发的小游戏后端,用户的数据存储在MySQL里面,上线后跑在机房的Linux机器上,连接云数据库。平时开发使用Windows机器,为了保证本地Windows开发机的稳定,使用Docker安装一个MySQL用于本地的开发调试。

1. 安装Docker

Widnows下安装Docker是很方便的,跟安装别的软件一样,下载安装即可,也没什么特别的配置。装完之后,命令行环境输入docker --version能正常输出版本号,就成功了。

2. 在Docker中安装MySQL

在Docker中image看作container的模板,container看作image的实例。使用docker pull mysql就可以把MySQL的image下载到本地。

首先创建一个volume用来保存MySQL的数据,使之不随着container的关闭和删除而被删除,volume的生命周期独立于container。

docker volume create sql-data

上面的命令创建了一个名叫sql-data的volume,后面将引用它的名字来指定作为MySQL的数据存储位置。

创建之后运行下面的命令即可把MySQL启动起来。

docker run --name mysql-dev -v sql-data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mysql123 -d mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

--name mysql-dev是给启用的container起的名字,用于标识该container,后面使用docker命令管理时可以使用该名字。

-v sql-data:/var/lib/mysql这里把先前创建的名为sql-data的volume挂载到MySQL默认的数据存储目录/var/lib/mysql

-p 3306:3306把MySQL的端口映射到宿主本机的3306端口,这样开发调试的时候,连接localhost的3306端口就可以了。这里绑定的ip是0.0.0.0,如果要绑定特定的ip可以通过-p 127.0.0.1:3306:3306这种形式的参数来指定ip。

-e MYSQL_ROOT_PASSWORD=mysql123设置环境变量MYSQL_ROOT_PASSWORD为mysql123,该环境变量用于设置container中MySQL的root用户的密码。如果想重用以往的数据,比如创建一个新的container也使用sql-data的数据,可以省略这个参数,以免更改sql-data的数据造成破坏。

-d是指后台运行,跟在后面的mysql表示image的名称。

--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci是MySQL的配置参数,这些参数也可以写在/my/custom/my.cnf这样的配置文件中,通过映射目录-v /my/custom:/etc/mysql/conf.d的方式,配置给container。

可以通过docker ps查看正在运行的container

PS C:\Users\self> docker ps                                                                                                                                               CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
b3bea205536c        mysql               "docker-entrypoint.s…"   56 seconds ago      Up 54 seconds       0.0.0.0:3306->3306/tcp, 33060/tcp   mysql-dev

docker port查看端口映射

PS C:\Users\self> docker port mysql-dev                                                                                                                                   3306/tcp -> 0.0.0.0:3306

docker stop/start mysql-dev用来停止和启动container mysql-dev

在本地开发中,经常需要连接数据库做一些管理和维护的操作,这时可以通过docker exec -it mysql-dev bash连接到container的bash环境中,进行操作。

PS C:\Users\self> docker exec -it mysql-dev bash                                                                                                                          root@b3bea205536c:/# mysql -hlocalhost -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.16 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

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

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

mysql>

上面是在bash里面通过mysql命令连接的数据库,也可以直接执行mysql进行连接和管理。这里跟在mysql-dev后面的mysql -hlocalhost -uroot -p表示要执行的程序和参数。下面可以看到,连接之后还通过create user 'wheel'@'%' identified by 'cherry';在MySQL中创建一个叫wheel的用户密码为cherry。

PS C:\Users\jxhap> docker exec -it mysql-dev mysql -hlocalhost -uroot -p                                                                                                   Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.16 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

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

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

mysql> create user 'wheel'@'%' identified by 'cherry';
Query OK, 0 rows affected (0.01 sec)

也可以另外启动一个docker的container的运行mysql来连接和管理。首先使用docker inspect mysql-dev查看container mysql-dev的详细信息,其中有一项是IPAddress表示该container的ip地址,另一个container将通过该ip连接MySQL。执行docker run -it --rm mysql mysql -h 172.17.0.3 -uwheel -p启用一个新的container并使用wheel用户登录了mysql-dev中的MySQL。

PS C:\Users\jxhap> docker run -it --rm mysql mysql -h 172.17.0.3 -uwheel -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.16 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

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

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

mysql>

数据的备份和恢复可以使用mysqldump来进行,原理在于登入到container中执行命令和处理输入输出。

docker exec some-mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /some/path/on/your/host/all-databases.sql

docker exec -i some-mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /some/path/on/your/host/all-databases.sql