
关于数据库是否适合放在容器里运行,一直备受争议。
小马过河的故事从小听到大:与其听别人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-latestdocker rm mysql-latestdocker 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最新版,端口3306docker 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最新版,端口3307docker 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最新版,端口3308docker 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.6docker start mysql-5.7docker start mysql-8.0
确认已都启动:
[root@bogon ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESec29909cd6d7 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.0cb10ba336663 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.7aae85c630200 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.670a1cc61129a 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.6docker exec -it mysql-5.6 mysql -uroot -P3306 -pstrongpasswordmysql> \s--------------mysql Ver 14.14 Distrib 5.6.46, for Linux (x86_64) using EditLine wrapperConnection id: 6Current database:Current user: root@localhostSSL: Not in useCurrent pager: stdoutUsing outfile: ''Using delimiter: ;Server version: 5.6.46 MySQL Community Server (GPL)
# 5.7docker exec -it mysql-5.7 mysql -uroot -P3307 -pstrongpasswordmysql> \s--------------mysql Ver 14.14 Distrib 5.7.28, for Linux (x86_64) using EditLine wrapperConnection id: 7Current database:Current user: root@localhostSSL: Not in useCurrent pager: stdoutUsing outfile: ''Using delimiter: ;Server version: 5.7.28 MySQL Community Server (GPL)
# 8.0docker exec -it mysql-8.0 mysql -uroot -P3308 -pstrongpasswordmysql> \s--------------mysql Ver 8.0.18 for Linux on x86_64 (MySQL Community Server - GPL)Connection id: 12Current database:Current user: root@localhostSSL: Not in useCurrent pager: stdoutUsing 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 -pstrongpasswordmysql> 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 -pstrongpasswordmysql> show variables like '%iso%';+-----------------------+----------------+| Variable_name | Value |+-----------------------+----------------+| transaction_isolation | READ-COMMITTED || tx_isolation | READ-COMMITTED |+-----------------------+----------------+
容器的出现,简化了很多繁琐的操作,就像把大象放冰箱里一样,几步就可以搞定,甚至可以搭建一套复杂环境自己打包。
但是由于万能修先生的docker水平十分有限,基本属于现学现卖、现用现查级别,更多的玩儿法等着小伙伴们来发掘吧。

冰箱门已经打开,PP不要着凉
最后推荐一个美剧,星战迷不要错过。周末愉快





