docker-mysql
第一步:环境准备与目录创建
为了防止数据丢失和便于管理配置文件,需要在宿主机上为两个环境创建独立的目录。
将文件存放在 /opt/docker/mysql 目录下:
# 创建测试环境目录 (conf 放配置文件, data 放数据, logs 放日志)
mkdir -p /opt/docker/mysql/test/conf
mkdir -p /opt/docker/mysql/test/data
mkdir -p /opt/docker/mysql/test/logs
# 创建生产环境目录
mkdir -p /opt/docker/mysql/prod/conf
mkdir -p /opt/docker/mysql/prod/data
mkdir -p /opt/docker/mysql/prod/logs
把 /opt/docker/mysql/test 和 /opt/docker/mysql/prod 权限提高
sudo chown -R 999:999 /opt/docker/mysql/test/
sudo chown -R 999:999 /opt/docker/mysql/prod/
第二步:准备配置文件 (my.cnf)
为了支持中文并统一时区,我们需要预先创建配置文件。
测试环境:
touch /opt/docker/mysql/test/conf/my.cnf
cat > /opt/docker/mysql/test/conf/my.cnf << 'EOF'
[mysqld]
# 基础设置
user=mysql
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default-time-zone='+08:00'
# 禁用主机名解析 (提高连接速度)
skip-name-resolve
# 连接数限制
max_connections=200
# 日志
log-error=/var/log/mysql/error.log
EOF
线上环境:
touch /opt/docker/mysql/prod/conf/my.cnf
cat > /opt/docker/mysql/prod/conf/my.cnf << 'EOF'
[mysqld]
# 基础设置
user=mysql
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default-time-zone='+08:00'
# 禁用主机名解析
skip-name-resolve
# 生产环境连接数通常更大
max_connections=1000
max_connect_errors=1000
# 缓冲区设置 (根据机器内存调整)
innodb_buffer_pool_size=2G
# 日志
log-error=/var/log/mysql/error.log
slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=2
EOF
第三步:启动容器
拉取最新的 MySQL 镜像
- 访问下面github,找到目前最新可用的docker地址
https://github.com/dongyubin/DockerHub
- 执行命令(下面的
docker.1ms.run替换为可用的地址,这里以 MySQL 8.0 为例,也可以用 latest)
docker pull docker.1ms.run/mysql:8.0
docker tag docker.1ms.run/mysql:8.0 mysql:8.0
启动两个容器,映射不同的宿主机端口。
- 测试环境: 宿主机端口 3307 -> 容器端口 3306
- 生产环境: 宿主机端口 3306 (默认) -> 容器端口 3306
1. 启动测试环境 (MySQL-Test)
docker run -d \
--name mysql-test \
--restart always \
-p 3307:3306 \
-v /opt/docker/mysql/test/conf/my.cnf:/etc/mysql/conf.d/my.cnf \
-v /opt/docker/mysql/test/data:/var/lib/mysql \
-v /opt/docker/mysql/test/logs:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=你的密码 \
--privileged=true \
mysql:8.0
2. 启动生产环境 (MySQL-Prod)
docker run -d \
--name mysql-prod \
--restart always \
-p 3306:3306 \
-v /opt/docker/mysql/prod/conf/my.cnf:/etc/mysql/conf.d/my.cnf \
-v /opt/docker/mysql/prod/data:/var/lib/mysql \
-v /opt/docker/mysql/prod/logs:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=你的密码 \
--privileged=true \
mysql:8.0
参数解释:
-e MYSQL_ROOT_PASSWORD=...: 设置 MySQL root 用户的初始密码。-v ...:/etc/mysql/conf.d/my.cnf: 将自定义配置文件挂载到容器配置目录中,MySQL 启动时会自动读取。-v ...:/var/lib/mysql: 挂载数据目录,确保持久化。--privileged=true: 获取宿主机 root 权限,解决 CentOS 8 下可能出现的挂载目录权限不足问题。
第四步:检查与验证
查看容器状态:
docker ps应该能看到两个容器
mysql-test和mysql-prod都在Up状态。连接测试 (使用 docker exec 内部连接):
测试环境:
docker exec -it mysql-test mysql -uroot -p'你的密码' -e "SELECT VERSION();" # 输出应该包含 MySQL 版本号生产环境 (密码复杂):
docker exec -it mysql-prod mysql -uroot -p'你的密码' -e "SELECT VERSION();" # 注意:密码如果有特殊字符,最好用单引号括起来 # 输出应该包含 MySQL 版本号
第五步:防火墙设置 (重要)
CentOS 8 默认开启 firewalld。需要放行这两个端口。
# 开放生产环境端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
# 开放测试环境端口
firewall-cmd --zone=public --add-port=3307/tcp --permanent
# 重载配置生效
firewall-cmd --reload