关于数据库是否适合放在容器里运行,一直备受争议。
小马过河的故事从小听到大:与其听别人OOXX,不如自己试下。
目前比较官方的 MySQL Docker库有两个:
1 由Docker团队维护,通过运行mysql:latest即可使用。
2 由Oracle的MySQL团队维护,使用docker run mysql/mysql-server:latest语法使用。
在以下示例中,将使用Oracle提供的Docker映像,并且只搭建单实例。由于基本都是默认参数,建议仅用于测试开发环境。
参考:
https://www.percona.com/blog/2019/11/19/installing-mysql-with-docker/
如果要使用复制功能,建议用这个 DBDeployer
(https://github.com/datacharmer/dbdeployer)
在Docker运行MySQL
# 1、使用Docker安装最新的MySQL版本
docker run --name mysql-latest \
-p 3306:3306 -p 33060:33060 \
-e MYSQL_ROOT_HOST='%' -e MYSQL_ROOT_PASSWORD='strongpassword' \
-d mysql/mysql-server:latest
复制
# 2、连接到MySQL
通过Docker Run启动MySQL命令行:
docker exec -it mysql-latest mysql -uroot -pstrongpassword
复制
也可以启动MySQL Shell:
docker exec -it mysql-latest mysqlsh -uroot -pstrongpassword
复制
管理Docker中的MySQL
# 停止
docker stop mysql-latest
复制
# 启动
docker start mysql-latest
复制
# 如遇到问题时,排查日志
docker logs mysql-latest
复制
# 重新创建一个新的Docker容器
docker stop mysql-latest
docker rm mysql-latest
docker run XXXXX
复制
# 将配置参数传递给Docker容器中的MySQL中
docker run --name mysql-latest \
-p 3306:3306 -p 33060:33060 \
-e MYSQL_ROOT_HOST='%' -e MYSQL_ROOT_PASSWORD='strongpassword' \
-d mysql/mysql-server:latest \
--innodb_buffer_pool_size=256M \
--innodb_flush_method=O_DIRECT \
复制
我的测试
针对不同版本,各自建立一个MySQL:
# 5.6最新版,端口3306
docker run --name mysql-5.6 \
-p 3306:3306 -p 33060:33060 \
-e MYSQL_ROOT_HOST='%' -e MYSQL_ROOT_PASSWORD='strongpassword' \
-d mysql/mysql-server:5.6
复制
# 5.6最新版,端口3307
docker run --name mysql-5.7 \
-p 3307:3306 -p 33070:33060 \
-e MYSQL_ROOT_HOST='%' -e MYSQL_ROOT_PASSWORD='strongpassword' \
-d mysql/mysql-server:5.7
复制
# 8.0最新版,端口3308
docker run --name mysql-8.0 \
-p 3308:3306 -p 33080:33060 \
-e MYSQL_ROOT_HOST='%' -e MYSQL_ROOT_PASSWORD='strongpassword' \
-d mysql/mysql-server:8.0
复制
启动吧:
docker start mysql-5.6
docker start mysql-5.7
docker start mysql-8.0
复制
确认已都启动:
[root@bogon ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ec29909cd6d7 mysql/mysql-server:8.0 "/entrypoint.sh mysq…" 27 seconds ago Up 26 seconds (health: starting) 0.0.0.0:3308->3306/tcp, 0.0.0.0:33080->33060/tcp mysql-8.0
cb10ba336663 mysql/mysql-server:5.7 "/entrypoint.sh mysq…" About a minute ago Up About a minute (healthy) 0.0.0.0:3307->3306/tcp, 0.0.0.0:33070->33060/tcp mysql-5.7
aae85c630200 mysql/mysql-server:5.6 "/entrypoint.sh mysq…" About a minute ago Up About a minute (healthy) 0.0.0.0:3306->3306/tcp, 0.0.0.0:33060->33060/tcp mysql-5.6
70a1cc61129a percona/pmm-server:2 "/opt/entrypoint.sh" 5 weeks ago Up 9 days 0.0.0.0:443->443/tcp, 0.0.0.0:2019->80/tcp pmm-server
复制
这样在几分钟内,就搞定了3个不同版本的数据库。
连进去看看,是想象中的版本:
# 5.6
docker exec -it mysql-5.6 mysql -uroot -P3306 -pstrongpassword
mysql> \s
--------------
mysql Ver 14.14 Distrib 5.6.46, for Linux (x86_64) using EditLine wrapper
Connection id: 6
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.6.46 MySQL Community Server (GPL)
复制
# 5.7
docker exec -it mysql-5.7 mysql -uroot -P3307 -pstrongpassword
mysql> \s
--------------
mysql Ver 14.14 Distrib 5.7.28, for Linux (x86_64) using EditLine wrapper
Connection id: 7
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.7.28 MySQL Community Server (GPL)
复制
# 8.0
docker exec -it mysql-8.0 mysql -uroot -P3308 -pstrongpassword
mysql> \s
--------------
mysql Ver 8.0.18 for Linux on x86_64 (MySQL Community Server - GPL)
Connection id: 12
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 8.0.18 MySQL Community Server - GPL
复制
测试下,其实速度还是可以的。
由于启动的基本都是默认参数,那么可以把自己的参数文件也导入到容器中的数据库运行:
# 当前隔离级别为默认的RR:
[root@bogon mysql_cnf]# docker exec -it mysql-5.7 mysql -uroot -P3307 -pstrongpassword
mysql> show variables like '%iso%';
+-----------------------+-----------------+
| Variable_name | Value |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
| tx_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
复制
# 复制容器中的配置文件到本地:
docker cp mysql-5.7:/etc/my.cnf ./
复制
# 修改本地配置文件
vi my.cnf
# 加一个参数试试
transaction_isolation = READ-COMMITTED
复制
# 复制本地my.cn 到容器库
docker cp ./my.cnf mysql-5.7:/etc/
复制
# 重启数据库
docker restart mysql-5.7
复制
# 隔离级别已变成RC
[root@bogon mysql_cnf]# docker exec -it mysql-5.7 mysql -uroot -P3307 -pstrongpassword
mysql> show variables like '%iso%';
+-----------------------+----------------+
| Variable_name | Value |
+-----------------------+----------------+
| transaction_isolation | READ-COMMITTED |
| tx_isolation | READ-COMMITTED |
+-----------------------+----------------+
复制
容器的出现,简化了很多繁琐的操作,就像把大象放冰箱里一样,几步就可以搞定,甚至可以搭建一套复杂环境自己打包。
但是由于万能修先生的docker水平十分有限,基本属于现学现卖、现用现查级别,更多的玩儿法等着小伙伴们来发掘吧。
冰箱门已经打开,PP不要着凉
最后推荐一个美剧,星战迷不要错过。周末愉快