本示例采用bitnami的镜像进行安装MySQL,官网链接:https://bitnami.com/stacks
一、镜像搜索
先搜索一下mysql有哪些镜像
[root@localhost ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 14734 [OK]
mariadb MariaDB Server is a high performing open sou… 5621 [OK]
percona Percona Server is a fork of the MySQL relati… 623 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 919 [OK]
bitnami/mysql Bitnami MySQL Docker Image 105 [OK]
bitnami是一个比较好的镜像制作机构,其文档也比较完善,所以我们用bitnami/mysql作为示例来安装mysql,点击查看官网的说明文档链接
二、拉取镜像
拉取
[root@localhost ~]# docker pull bitnami/mysql
查看镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
bitnami/mysql latest cc987bd64212 4 weeks ago 680MB
三、运行msyql容器
可以通过两种方式来运行我们的容器docker run命令行,或者docker-compose
通过docker run
官网的一个示例是这么运行
docker run \-e ALLOW_EMPTY_PASSWORD=yes \-v /path/to/mysql-persistence:/bitnami/mysql/data \bitnami/mysql:latest
通过docker-compose
需要提前安装好docker-compose,如果不清楚怎么安装,点击这里查看安装说明
version: '2'networks:app-tier:driver: bridgeservices:mysql:image: 'bitnami/mysql:latest'environment:- ALLOW_EMPTY_PASSWORD=yesnetworks:- app-tiermyapp:image: 'YOUR_APPLICATION_IMAGE'networks:- app-tier
四、重要的环境变量
下面的示例中,展示了在docker run 启动容器时,通过-e参数设置了一系列的环境变量
docker run -d \-p 3306:3306 \--name mysql \-e ALLOW_EMPTY_PASSWORD=yes \-e MYSQL_ROOT_PASSWORD=yourrootpassword \-e MYSQL_CHARACTER_SET=utf8mb4 \-e MYSQL_COLLATE=utf8mb4_general_ci \-e MYSQL_ENABLE_SLOW_QUERY=1 \-e MYSQL_LONG_QUERY_TIME=5.0 \-e TZ=Asia/Shanghai \-v /path/to/persitence-data:/bitnami/mysql/data \-v /path/to/conf/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro \bitnami/mysql:latest
-d 后台运行
-p 3306:3306: 把docker镜像内部的3306端口映射到宿主机的3306端口.
--name mysql docker实例的名字
-e ALLOW_EMPTY_PASSWORD=yes 让mysql可以使用空密码进行链接. 即可以使用没有密码的账号.
-e MYSQL_ROOT_PASSWORD=yourrootpassword 设置好新mysql 实例的root 账号密码.
-e MYSQL_CHARACTER_SET=utf8mb4 把数据库的默认字符编码修改为utf8b4 , 如果不修改,默认的设置是utf8
-e MYSQL_COLLATE=utf8mb4_general_ci 同上.
-e MYSQL_ENABLE_SLOW_QUERY=1 开启慢查询日志.
-e MYSQL_LONG_QUERY_TIME=5.0 慢查询日志的query 时间阈值. 默认值是10.0秒, 这里设置为5秒
-e TZ=Asia/Shanghai 重要: 设置 Mysql Docker实例的系统时区. 如果不设置,其默认的时区将会为UTC
-v /path/to/persitence-data:/bitnami/mysql/data 持久化配置. 把mysql的数据存储到宿主机的相关的目录.
-v /path/to/conf/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro 把镜像内部的自定义的my_custom.cnf文件映射到宿主机上.且docker内部是只读权限.
bitnami/mysql:5.7.43-debian-11-r73 最后的镜像名称.
五、修改配置文件
bitnami的mysql配置文件是在容器的
/opt/bitnami/mysql/conf/my_custom.cnf 这个位置
如何修改这个配置文件呢
第一步:宿主机上新建一个my_custom.cnf 文件
以下的启动参数基本是一个可以实际使用的命令.但是还需要配置一些其它的额外参数. 这里贴出我的配置:
[mysqld]
max_allowed_packet = 256M
innodb_log_file_size = 256M
transaction-isolation = READ-COMMITTED
default_time_zone = '+08:00'
一个是修改最大的包大小,这个在一些特别大的数据插入与查询时会用到. RC 隔离级别是 Confluence所要求的. 最后的 default_time_zone = ‘+08:00’ 是为中国区的程序员准备的. 这样可以写入正确的默认值.
第二步:将宿主机上的文件挂载到容器内部
docker run --name mysql \-p 3306:3306 \-e ALLOW_EMPTY_PASSWORD=yes \-v /path/to/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro \-v /path/to/mysql-persistence:/bitnami/mysql/data \bitnami/mysql:latest
配置参数 - my_custom.cnf
六、日志
通过docker启动的,可以通过下面命令查看日志
docker logs mysql
通过docker-compose启动的,可以通过下面命令查看日志
docker-compose logs mysql
七、实操
我们给自己定下如下目标:
- 使用mysql8.0版本
- 设置好数据存储的挂载到宿主机
- 设置好用户名和密码
- 端口号映射到宿主机的3306
- 自定义一个配置文件挂载到容器my_custom.cnf
- 系统重启时,自动启动mysql容器
- 容器被误删除时,数据还在
通过docker run 启动一个mysql容器,实现上述功能
准备工作
#拉取镜像
[root@localhost ~]# docker pull bitnami/mysql
#创建配置文件
[root@localhost ~]# mkdir -p /opt/bitnami/mysql/conf
[root@localhost ~]# cd /opt/bitnami/mysql/conf
[root@localhost conf]# touch my_custom.cnf
[root@localhost conf]# vim my_custom.cnf
[root@localhost conf]# cat my_custom.cnf
#配置文件如下
[mysqld]
max_allowed_packet = 256M
innodb_log_file_size = 256M
transaction-isolation = READ-COMMITTED
default_time_zone = '+08:00'
#创建一个挂载目录
[root@localhost conf]# mkdir -p /bitnami/mysql/data
#设置目录和文件的权限
[root@localhost data]# chmod 777 /bitnami/mysql/data/
[root@localhost data]# chmod 777 /opt/bitnami/mysql/conf/my_custom.cnf
运行容器
其中–restart=always表示,重启系统后,只要docker进程自动启动,那就可以把mysql启动起来
docker run -d \-p 3306:3306 \--name mysql \--restart=always \-e ALLOW_EMPTY_PASSWORD=yes \-e MYSQL_ROOT_PASSWORD=123456\-e MYSQL_CHARACTER_SET=utf8mb4 \-e MYSQL_COLLATE=utf8mb4_general_ci \-e TZ=Asia/Shanghai \-v /bitnami/mysql/data:/bitnami/mysql/data \-v /opt/bitnami/mysql/conf/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro \bitnami/mysql:8.0
查看一下日志,主要看看有没有报错啥的,有报错的话,根据报错信息,修改上面的启动命令,比如环境变量有没有设置错的
#先看有没有启动成功
[root@localhost data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9f8eadad1226 bitnami/mysql:latest "/opt/bitnami/script…" About a minute ago Up About a minute 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp mysql
#再查看日志
[root@localhost conf]# docker logs mysql
mysql 20:54:45.86 INFO ==>
mysql 20:54:45.86 INFO ==> Welcome to the Bitnami mysql container
mysql 20:54:45.86 INFO ==> Subscribe to project updates by watching https://github.com/bitnami/containers
mysql 20:54:45.86 INFO ==> Submit issues and feature requests at https://github.com/bitnami/containers/issues
mysql 20:54:45.86 INFO ==>
mysql 20:54:45.86 INFO ==> ** Starting MySQL setup **
mysql 20:54:45.90 INFO ==> Validating settings in MYSQL_*/MARIADB_* env vars
mysql 20:54:45.90 WARN ==> You set the environment variable ALLOW_EMPTY_PASSWORD=yes. For safety reasons, do not use this flag in a production environment.
mysql 20:54:45.90 ERROR ==> root user is already created in the database and you can't use it as username for user creation.
...略...
查看一下我们的宿主机的挂载目录,是不是有了数据库的文件了
可以看到文件都有了
[root@localhost data]# pwd
/bitnami/mysql/data
[root@localhost data]# ls -al
总用量 95700
drwxrwxrwx. 7 root root 4096 12月 27 08:13 .
drwxr-xr-x. 3 root root 18 12月 27 07:53 ..
-rw-r-----. 1 1001 root 56 12月 27 08:12 auto.cnf
-rw-r-----. 1 1001 root 1814 12月 27 08:13 binlog.000001
-rw-r-----. 1 1001 root 180 12月 27 08:13 binlog.000002
-rw-r-----. 1 1001 root 157 12月 27 08:13 binlog.000003
-rw-r-----. 1 1001 root 48 12月 27 08:13 binlog.index
-rw-------. 1 1001 root 1680 12月 27 08:12 ca-key.pem
-rw-r--r--. 1 1001 root 1108 12月 27 08:12 ca.pem
-rw-r--r--. 1 1001 root 1108 12月 27 08:12 client-cert.pem
-rw-------. 1 1001 root 1680 12月 27 08:12 client-key.pem
-rw-r-----. 1 1001 root 196608 12月 27 08:13 '#ib_16384_0.dblwr'
-rw-r-----. 1 1001 root 8585216 12月 27 08:13 '#ib_16384_1.dblwr'
-rw-r-----. 1 1001 root 8001 12月 27 08:13 ib_buffer_pool
-rw-r-----. 1 1001 root 12582912 12月 27 08:13 ibdata1
-rw-r-----. 1 1001 root 12582912 12月 27 08:13 ibtmp1
drwxr-x---. 2 1001 root 4096 12月 27 08:13 '#innodb_redo'
drwxr-x---. 2 1001 root 187 12月 27 08:13 '#innodb_temp'
drwxr-x---. 2 1001 root 143 12月 27 08:13 mysql
-rw-r-----. 1 1001 root 30408704 12月 27 08:13 mysql.ibd
-rw-r-----. 1 1001 root 5 12月 27 08:13 mysql_upgrade_info
drwxr-x---. 2 1001 root 8192 12月 27 08:12 performance_schema
-rw-------. 1 1001 root 1680 12月 27 08:12 private_key.pem
-rw-r--r--. 1 1001 root 452 12月 27 08:12 public_key.pem
-rw-r--r--. 1 1001 root 1108 12月 27 08:12 server-cert.pem
-rw-------. 1 1001 root 1680 12月 27 08:12 server-key.pem
drwxr-x---. 2 1001 root 28 12月 27 08:13 sys
-rw-r-----. 1 1001 root 16777216 12月 27 08:13 undo_001
-rw-r-----. 1 1001 root 16777216 12月 27 08:13 undo_002
数据库操作
远程连接数据库,创建一个数据库,一个表
发现远程连接宿主机的3306端口连接不上,这是什么原因呢
查了一下,说的是,在 JDBC 连接串中加入 allowPublicKeyRetrieval=true 参数;
dbeaver连接设置如下,设置好后,连接成功了
通过dbeaver来创建一个数据库,一个表
CREATE DATABASE `test`;
USE test;
CREATE TABLE `project` (`id` bigint(20) NOT NULL,`name` varchar(255) NOT NULL,`status` bit(1) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO test.project (id,name,status) VALUES(1,'项目1',1);
进入容器通过命令行查看数据
[root@localhost data]# docker exec -it mysql /bin/bash
I have no name!@9f8eadad1226:/$ mysql -uroot -p
Enter password:
...略...
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 -ADatabase changed
mysql> select * from project;
+----+---------+----------------+
| id | name | status |
+----+---------+----------------+
| 1 | 项目1 | 0x01 |
+----+---------+----------------+
1 row in set (0.00 sec)
mysql容器误删演练
重点:删除容器,宿主机的挂载文件不会删除
[root@localhost data]# docker stop mysql
mysql
[root@localhost data]# docker rm mysql
mysql
再重新启动容器
docker run -d \-p 3306:3306 \--name mysql \--restart=always \-e ALLOW_EMPTY_PASSWORD=yes \-e MYSQL_ROOT_PASSWORD=123456\-e MYSQL_CHARACTER_SET=utf8mb4 \-e MYSQL_COLLATE=utf8mb4_general_ci \-e TZ=Asia/Shanghai \-v /bitnami/mysql/data:/bitnami/mysql/data \-v /opt/bitnami/mysql/conf/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro \bitnami/mysql:8.0
参数–restart=always,我们等会重启系统时,mysql会自动重启(前提开启docker进程自动启动 systemctl enable docker)
新建一个容器,指定数据文件挂载点,检查数据是否还在。经过测试,数据依然还在的。
服务器重启演练
前提开启docker进程自动启动
systemctl enable docker
重启操作系统,可以看到mysql随着系统启动,自动启起来了
其它问题
在用我的java应用程序连接mysql8.0时,连接Mysql8时 报错:
java.sql.SQLException: Unable to load authentication plugin ‘caching_sha2_password’
原因
不同版本的认证插件不同造成的
8版本前是:default_authentication_plugin=mysql_native_password
8版本后是:default_authentication_plugin=caching_sha2_password
解决办法
修改认证plugin,即添加环境变量MYSQL_AUTHENTICATION_PLUGIN=mysql_native_password
docker run -d \-p 3306:3306 \--name mysql \--restart=always \-e ALLOW_EMPTY_PASSWORD=yes \-e MYSQL_ROOT_PASSWORD=123456\-e MYSQL_CHARACTER_SET=utf8mb4 \-e MYSQL_COLLATE=utf8mb4_general_ci \-e TZ=Asia/Shanghai \-e MYSQL_AUTHENTICATION_PLUGIN=mysql_native_password \-v /bitnami/mysql/data:/bitnami/mysql/data \-v /opt/bitnami/mysql/conf/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro \bitnami/mysql:8.0
到这里,我们的MySQL就安装完成了
附:安装mysql5.7版本
[root@localhost ~]# mkdir -p /bitnami/mysql57/data
[root@localhost ~]# chmod 777 /bitnami/mysql57/datadocker run -d \-p 5566:3306 \--name mysql57 \--restart=always \-e ALLOW_EMPTY_PASSWORD=yes \-e MYSQL_ROOT_PASSWORD=123456 \-e MYSQL_CHARACTER_SET=utf8mb4 \-e MYSQL_COLLATION=utf8mb4_general_ci \-e MYSQL_ENABLE_SLOW_QUERY=1 \-e MYSQL_LONG_QUERY_TIME=5.0 \-e TZ=Asia/Shanghai \-v /bitnami/mysql57/data:/bitnami/mysql/data \-v /opt/bitnami/mysql/conf/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro \bitnami/mysql:5.7
在启动应用程序连接MySQL时,发现报错了,查了一下,原来是MySQL表名大小写敏感的问题
可以在SQL命令行查询一下这个配置值
show variables like 'lower_case_table_names%';
lower_case_table_names=0说明对表名大小写敏感,故需要进行配置。
修改方式:在[mysqld]下加入一行:lower_case_table_names=1
最终my_custom.cnf文件如下
[root@localhost data]# cat /opt/bitnami/mysql/conf/my_custom.cnf
[mysqld]
max_allowed_packet = 256M
innodb_log_file_size = 256M
transaction-isolation = READ-COMMITTED
default_time_zone = '+08:00'
lower_case_table_names=1
思考
如果通过docker-compose,那这个yaml应该怎么写呢
version: '2'
services:mysql:image: 'bitnami/mysql:8.0'environment:- ALLOW_EMPTY_PASSWORD=yes - MYSQL_ROOT_PASSWORD=123456- MYSQL_CHARACTER_SET=utf8mb4 - MYSQL_COLLATE=utf8mb4_general_ci - TZ=Asia/Shanghai ports:- '3306:3306'volumes:- '/opt/bitnami/mysql/conf/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf'- '/bitnami/mysql/data:/bitnami/mysql/data'