docker搭建Mysql单机
数据库其实不建议容器来处理,主要原因是底层磁盘管理效率。
使用容器后,需要考虑底层存储、网络以及配置的持久化。
1. 拉取镜像并创建目录
docker pull mysql:8.0.20 &&
mkdir -p /home/mysql/data &&
mkdir -p /home/mysql/conf &&
mkdir -p /home/mysql/logs
2. 修改配置文件
2.1 首先将默认配置文件拷贝到宿主机上
docker run -d --net=host --name mysql -e MYSQL_ROOT_PASSWORD=Test-1234 mysql:8.0.20 &&
docker cp mysql:/etc/mysql/my.cnf /home/mysql/conf/mysqld.cnf &&
docker cp mysql:/etc/mysql/conf.d/mysql.cnf /home/mysql/conf/mysql.cnf &&
docker rm -f mysql
2.2 然后编辑配置文件
vi /home/mysql/conf/mysqld.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
#symbolic-links=0
lower_case_table_names=1
character-set-server=utf8mb4
collation-server=utf8mb4_bin
#需要修改为合适的值(推荐设置为服务器内存的75%左右)
innodb_buffer_pool_size = 4G
#下面开启binlog,做数据库同步时必备
log-bin = master-bin
log-bin-index = master-bin.index
binlog-format = ROW
server-id = 1
#设置binlog的保存时间,如果磁盘充足,可以设置为更长时间,比如一年,这样当数据误删时可以通过binlog进行恢复(这里的值为30天)
binlog_expire_logs_seconds = 2592000
#设置客户端连接时的默认时区
default-time_zone = '+8:00'
innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:10G
#查询避免全表扫描
max_seeks_for_key = 1000
#可以创建触发器
log_bin_trust_function_creators = 1
#使用MySQL5.7的认证模式
default_authentication_plugin = mysql_native_password
#禁用mysqlx插件(33306端口)
mysqlx=0
mysqlx_cache_cleaner=0
innodb_monitor_enable=all
group_concat_max_len=4294967295
# Custom config should go here
!includedir /etc/mysql/conf.d/
3. 启动Docker
注意:ROOT密码请使用16位随机密码。
docker run -d --net=host --name mysql --restart=always \
-v /etc/localtime:/etc/localtime:ro \
-v /home/mysql/conf/mysqld.cnf:/etc/mysql/my.cnf \
-v /home/mysql/conf/mysql.cnf:/etc/mysql/conf.d/mysql.cnf \
-v /home/mysql/logs:/var/log/mysql \
-v /home/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=1234567887654321 \
mysql:8.0.20