Docker 安装MySql
大约 15 分钟约 4383 字
Docker 安装MySql
1.拉取镜像
docker pull mysql:5.7 # 拉取 mysql 5.7
docker pull mysql # 拉取最新版mysql镜像镜像管理
# 拉取指定版本
docker pull mysql:5.7
docker pull mysql:5.7.44
docker pull mysql:8.0
docker pull mysql:8.0.35
# 从国内镜像源拉取(加速)
docker pull registry.cn-hangzhou.aliyuncs.com/library/mysql:5.7
docker tag registry.cn-hangzhou.aliyuncs.com/library/mysql:5.7 mysql:5.7
# 查看本地镜像
docker images | grep mysql
# 查看镜像详情
docker inspect mysql:5.7
# 删除镜像
docker rmi mysql:5.7
# 清理悬空镜像
docker image prune -f
# 查看镜像历史层
docker history mysql:5.72不指定目录映射
#安装指定版本
sudo docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
#安装最新版本
sudo docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql-p 端口配置 主机3306/容器3306
-name 容器名,此处为mysql
-e 配置信息 MYSQL_ROOT_PASSWORD=123456 指定密码为123456
-d 指定镜像
默认的配置文件是:/etc/mysql/my.cnf
默认的数据目录是:/var/lib/mysql
我们进入mysql容器中,查看my.cnf.
docker exec -it mysql bash
cat /etc/mysql/my.cnfmy.cnf 加载了 /etc/mysql/conf.d目录中所有以后缀为.cnf的配置文件,所以我们映射目录,只需要映射conf.d目录即可。
先在linux上创建目录
sudo mkdir -p /usr/local/docker/mysql/conf.d
cd /usr/local/docker/mysql/conf.d
sudo vi mysql-docker.cnf保存内容
[mysqld]
server-id = 1 #服务Id唯一
port = 3306
log-error = /var/log/mysql/error.log
#只能用IP地址
skip_name_resolve
#数据库默认字符集
character-set-server = utf8mb4
#数据库字符集对应一些排序等规则
collation-server = utf8mb4_general_ci
#设置client连接mysql时的字符集,防止乱码
init_connect='SET NAMES utf8mb4'
#最大连接数
max_connections = 300#如果遇到这个错就执行下权限
#mysqld: [Warning] World-writable config file '/etc/mysql/conf.d/mysql-docker.cnf' is ignored
sudo chmod 644 mysql-docker.cnf生产级 MySQL 配置
# ====== 完整的生产级 MySQL 配置 ======
# /usr/local/docker/mysql/conf.d/my.cnf
[mysqld]
# ====== 基础配置 ======
server-id = 1
port = 3306
skip_name_resolve
default-time-zone = '+08:00'
# ====== 字符集配置 ======
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect = 'SET NAMES utf8mb4'
character-set-client-handshake = FALSE
# ====== 连接配置 ======
max_connections = 500
max_connect_errors = 1000
wait_timeout = 600
interactive_timeout = 600
thread_cache_size = 64
# ====== 缓冲区配置 ======
innodb_buffer_pool_size = 1G
innodb_buffer_pool_instances = 4
innodb_log_buffer_size = 64M
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
innodb_file_per_table = ON
# ====== 日志配置 ======
log-error = /var/log/mysql/error.log
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = ON
# ====== Binlog 配置(主从复制需要) ======
log-bin = mysql-bin
binlog_format = ROW
binlog_cache_size = 4M
max_binlog_size = 256M
expire_logs_days = 7
sync_binlog = 0
# ====== 安全配置 ======
local_infile = OFF
skip-symbolic-links
explicit_defaults_for_timestamp = TRUE
# ====== 临时表和排序 ======
tmp_table_size = 64M
max_heap_table_size = 64M
sort_buffer_size = 4M
join_buffer_size = 4M
read_buffer_size = 2M
read_rnd_buffer_size = 4M
[client]
default-character-set = utf8mb4
port = 3306
[mysql]
default-character-set = utf8mb43.建立目录映射
在linux上创建目录,用于存放mysql的日志和数据。
sudo mkdir -p /usr/local/docker/mysql/logs
sudo mkdir -p /usr/local/docker/mysql/datasudo docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/conf.d:/etc/mysql/conf.d \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--restart=always \
-d mysql:5.7#查看docker 下进程,mysql是否启动
docker ps
#由于 mysql /var/log/mysql 默认情况下查看
## 查看未正常启动的错误信息
docker logs --tail 50 --follow --timestamps mysql
docker restart mysql
docker exec mysql chown mysql:root /var/log/mysql- -p 端口配置 linux主机3310/容器3306
- -name 容器名,此处为mysql
- -v 指定容器及其挂载的卷,此外为 宿主机文件目录:容器文件目录,可指定多个数据文件目录
- -e 配置信息 MYSQL_ROOT_PASSWORD=123456 设置 MySql服务的root密码为123456
- --restart=always 容器退出时总是重启
- -d 后台运行。
- 镜像名
完整的目录映射部署
# ====== 创建目录结构 ======
mkdir -p /usr/local/docker/mysql/{conf.d,logs,data,init}
# ====== 设置目录权限 ======
chown -R 999:999 /usr/local/docker/mysql/data
chown -R 999:999 /usr/local/docker/mysql/logs
# MySQL 容器内使用 uid 999 的 mysql 用户
# ====== 初始化脚本(可选) ======
cat > /usr/local/docker/mysql/init/01-init.sql << 'EOF'
-- 创建数据库
CREATE DATABASE IF NOT EXISTS app_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE DATABASE IF NOT EXISTS log_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-- 创建应用用户
CREATE USER IF NOT EXISTS 'app_user'@'%' IDENTIFIED BY 'AppPass2024!';
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'%';
GRANT SELECT ON log_db.* TO 'app_user'@'%';
FLUSH PRIVILEGES;
EOF
# ====== 启动 MySQL 容器(完整参数) ======
docker run -d \
--name mysql \
--restart=always \
-p 3306:3306 \
-v /usr/local/docker/mysql/conf.d:/etc/mysql/conf.d \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-v /usr/local/docker/mysql/init:/docker-entrypoint-initdb.d \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=app_db \
-e MYSQL_USER=app_user \
-e MYSQL_PASSWORD=AppPass2024! \
-e TZ=Asia/Shanghai \
--memory=2g \
--cpus=2 \
mysql:5.7 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_general_ci
# ====== 参数说明 ======
# --name: 容器名称
# --restart=always: 容器退出时总是重启
# -p 3306:3306: 端口映射(主机:容器)
# -v: 目录映射(宿主机:容器)
# -e MYSQL_ROOT_PASSWORD: root 密码
# -e MYSQL_DATABASE: 自动创建的数据库
# -e MYSQL_USER / MYSQL_PASSWORD: 自动创建的用户
# -e TZ: 时区设置
# --memory: 内存限制
# --cpus: CPU 限制
# 最后的参数会传递给 mysqld 命令
# ====== 使用自定义配置文件 ======
# 如果需要挂载完整的 my.cnf(而不是 conf.d 目录)
docker run -d \
--name mysql \
--restart=always \
-p 3306:3306 \
-v /usr/local/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7使用 Docker 网络连接多个容器
# ====== 创建 Docker 网络 ======
docker network create app-network
# ====== 启动 MySQL 并连接到网络 ======
docker run -d \
--name mysql \
--restart=always \
--network app-network \
-p 3306:3306 \
-v /usr/local/docker/mysql/conf.d:/etc/mysql/conf.d \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=app_db \
mysql:5.7
# ====== 其他容器通过容器名连接 MySQL ======
# 例如在应用容器中:
# MYSQL_HOST=mysql (容器名)
# MYSQL_PORT=3306
# MYSQL_USER=root
# MYSQL_PASSWORD=123456
# ====== 启动应用容器连接到同一网络 ======
docker run -d \
--name myapp \
--network app-network \
-e DB_HOST=mysql \
-e DB_PORT=3306 \
-e DB_NAME=app_db \
-e DB_USER=root \
-e DB_PASS=123456 \
myapp:latestDocker相关命令
其中mysql为容器的name或id
#重启容器
docker restart mysql
#暂停容器
docker stop mysql
#删除容器
docker rm mysql
#启动容器
docker start mysql
#更新容器 开机也能重启
docker update mysql --restart=alwaysDocker 容器管理完整命令
# ====== 容器生命周期管理 ======
docker create # 创建容器但不启动
docker start # 启动已创建的容器
docker stop # 优雅停止容器
docker kill # 强制终止容器
docker restart # 重启容器
docker rm # 删除已停止的容器
docker rm -f # 强制删除运行中的容器
# ====== 查看容器状态 ======
docker ps # 查看运行中的容器
docker ps -a # 查看所有容器(包括已停止的)
docker ps -q # 只显示容器 ID
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" # 格式化输出
docker stats mysql # 实时查看容器资源使用
docker top mysql # 查看容器内进程
docker inspect mysql # 查看容器详细信息
# ====== 进入容器 ======
docker exec -it mysql bash # 进入容器(推荐)
docker exec -it mysql /bin/bash # 同上
docker exec -it mysql mysql -uroot -p123456 # 直接连接 MySQL
# ====== 查看日志 ======
docker logs mysql # 查看所有日志
docker logs --tail 100 mysql # 查看最后 100 行
docker logs --tail 50 --follow --timestamps mysql # 实时跟踪日志
docker logs --since "2024-01-01" mysql # 查看指定时间后的日志
docker logs --since 30m mysql # 查看最近 30 分钟的日志
# ====== 文件操作 ======
# 从容器复制文件到宿主机
docker cp mysql:/var/log/mysql/error.log /tmp/error.log
# 从宿主机复制文件到容器
docker cp /tmp/backup.sql mysql:/tmp/backup.sql
# ====== 资源限制查看 ======
docker stats --no-stream mysql # 查看当前资源使用
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}" mysql
# ====== 容器导出/导入 ======
docker export mysql > mysql_backup.tar # 导出容器
docker import mysql_backup.tar mysql:restored # 导入
# ====== 镜像保存/加载 ======
docker save mysql:5.7 -o mysql_5.7.tar # 保存镜像
docker load -i mysql_5.7.tar # 加载镜像配置远程Navicat可访问
如果遇到无法访问时,可以使用此方式
sudo docker exec -it mysql /bin/bash
mysql -uroot -p123456
use mysql;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;远程连接配置详解
# ====== MySQL 5.7 远程连接配置 ======
docker exec -it mysql mysql -uroot -p123456
# 方法 1:修改 root 用户密码和认证方式
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;
# 方法 2:创建新的远程用户
CREATE USER 'remote_user'@'%' IDENTIFIED BY 'RemotePass2024!';
GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
# 方法 3:只允许特定 IP 访问
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'AppPass2024!';
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'192.168.1.%';
FLUSH PRIVILEGES;
# 查看用户权限
SELECT user, host, plugin FROM mysql.user;
SHOW GRANTS FOR 'root'@'%';
# ====== MySQL 8.0 注意事项 ======
# MySQL 8.0 默认认证插件为 caching_sha2_password
# 部分客户端不支持,需要改为 mysql_native_password
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;
# 或者修改配置文件(永久生效)
# 在 my.cnf 的 [mysqld] 段添加:
# default_authentication_plugin=mysql_native_passwordRestart参数
Docker 中restart参数用于指定自动重启docker容器策略,包含3个选项:no,on-failure[:times],always,unless-stopped
no 默认值,表示容器退出时,docker不自动重启容器
docker run --restart=no [容器名]on-failure 若容器的退出状态非0,则docker自动重启容器,还可以指定重启次数,若超过指定次数未能启动容器则放弃**
docker run --restart=on-failure:3 [容器名]always 容器退出时总是重启**
docker run --restart=always [容器名]unless-stopped 容器退出时总是重启,但不考虑Docker守护进程启动时就已经停止的容器**
docker run --restart=unless-stopped [容器名]如果容器启动时没有设置–restart参数,则通过下面命令进行更新:* *
docker update --restart=always [容器名]防火墙放行端口3306
#查看防火墙目前的放行端口列表
firewall-cmd --list-ports
#添加防火墙放行端口(permanent代表永久生效)
firewall-cmd --add-port=3306/tcp --permanent
#重新加载防火墙(添加完放行端口一定要重新加载防火墙)
firewall-cmd --reload安全加固
# ====== 防火墙限制来源 IP ======
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3306" accept'
firewall-cmd --reload
# ====== 数据库安全配置 ======
# 进入 MySQL 后执行:
# 禁止 root 远程登录(推荐)
DELETE FROM mysql.user WHERE user='root' AND host NOT IN ('localhost', '127.0.0.1');
FLUSH PRIVILEGES;
# 删除匿名用户
DELETE FROM mysql.user WHERE user='';
FLUSH PRIVILEGES;
# 删除 test 数据库
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE db='test' OR db='test_%';
FLUSH PRIVILEGES;
# 设置密码策略
SET GLOBAL validate_password_policy=STRONG;
SET GLOBAL validate_password_length=12;
# 设置密码过期策略
SET GLOBAL default_password_lifetime=90;
# ====== 网络安全 ======
# 不映射端口到公网
docker run -d --name mysql \
-p 127.0.0.1:3306:3306 \ # 只绑定本地
...
# 或使用 Docker 内部网络,不暴露端口
docker run -d --name mysql \
--network app-network \
... # 不使用 -p 参数数据备份与恢复
备份操作
# ====== 使用 mysqldump 备份(推荐) ======
# 备份单个数据库
docker exec mysql mysqldump -uroot -p123456 --databases app_db > /backup/app_db_$(date +%Y%m%d).sql
# 备份所有数据库
docker exec mysql mysqldump -uroot -p123456 --all-databases > /backup/all_db_$(date +%Y%m%d).sql
# 备份表结构
docker exec mysql mysqldump -uroot -p123456 --no-data app_db > /backup/app_db_schema.sql
# 备份指定表
docker exec mysql mysqldump -uroot -p123456 app_db users orders > /backup/app_db_tables.sql
# 压缩备份
docker exec mysql mysqldump -uroot -p123456 app_db | gzip > /backup/app_db_$(date +%Y%m%d).sql.gz
# ====== 使用数据卷直接备份 ======
# 停止容器后直接打包数据目录
docker stop mysql
tar czf /backup/mysql_data_$(date +%Y%m%d).tar.gz -C /usr/local/docker/mysql/ data
docker start mysql
# ====== 自动备份脚本 ======
#!/bin/bash
# mysql_backup.sh
BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
MYSQL_CONTAINER="mysql"
MYSQL_ROOT_PASS="123456"
DATABASES="app_db log_db"
RETENTION_DAYS=7
mkdir -p "$BACKUP_DIR"
for db in $DATABASES; do
echo "Backing up $db..."
docker exec $MYSQL_CONTAINER mysqldump -uroot -p$MYSQL_ROOT_PASS \
--single-transaction --routines --triggers \
$db | gzip > "${BACKUP_DIR}/${db}_${DATE}.sql.gz"
done
# 清理过期备份
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete
echo "Backup completed: ${BACKUP_DIR}/*_${DATE}.sql.gz"恢复操作
# ====== 恢复数据库 ======
# 从 SQL 文件恢复
docker exec -i mysql mysql -uroot -p123456 < /backup/app_db_20240101.sql
# 从压缩文件恢复
gunzip < /backup/app_db_20240101.sql.gz | docker exec -i mysql mysql -uroot -p123456
# 恢复到指定数据库
gunzip < /backup/app_db_20240101.sql.gz | docker exec -i mysql mysql -uroot -p123456 app_db
# 从数据目录恢复
docker stop mysql
rm -rf /usr/local/docker/mysql/data/*
tar xzf /backup/mysql_data_20240101.tar.gz -C /usr/local/docker/mysql/
chown -R 999:999 /usr/local/docker/mysql/data
docker start mysqlDocker Compose 部署
# ====== docker-compose.yml ======
version: '3.8'
services:
mysql:
image: mysql:5.7
container_name: mysql
restart: always
ports:
- "3306:3306"
volumes:
- ./mysql/conf.d:/etc/mysql/conf.d
- ./mysql/logs:/var/log/mysql
- ./mysql/data:/var/lib/mysql
- ./mysql/init:/docker-entrypoint-initdb.d
environment:
MYSQL_ROOT_PASSWORD: "123456"
MYSQL_DATABASE: "app_db"
MYSQL_USER: "app_user"
MYSQL_PASSWORD: "AppPass2024!"
TZ: "Asia/Shanghai"
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_general_ci
- --max-connections=500
- --innodb-buffer-pool-size=1G
networks:
- app-network
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-p123456"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
deploy:
resources:
limits:
memory: 2G
cpus: '2'
reservations:
memory: 1G
cpus: '1'
networks:
app-network:
driver: bridge# 使用 Compose 启动
docker-compose up -d
# 查看日志
docker-compose logs -f mysql
# 停止服务
docker-compose down
# 停止并删除数据卷(慎用)
docker-compose down -v性能调优
# ====== 容器资源限制 ======
# 内存限制(MySQL 最重要的资源)
docker run -d --name mysql \
--memory=2g \
--memory-swap=3g \
--cpus=2 \
...
# innodb_buffer_pool_size 建议设为容器内存的 60%-70%
# 例如容器内存 2G,innodb_buffer_pool_size 设为 1.2G
# ====== 查看 MySQL 运行状态 ======
docker exec mysql mysql -uroot -p123456 -e "SHOW GLOBAL STATUS LIKE 'Threads_connected';"
docker exec mysql mysql -uroot -p123456 -e "SHOW GLOBAL STATUS LIKE 'Slow_queries';"
docker exec mysql mysql -uroot -p123456 -e "SHOW GLOBAL STATUS LIKE 'Questions';"
docker exec mysql mysql -uroot -p123456 -e "SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read%';"
# ====== 查看 MySQL 变量 ======
docker exec mysql mysql -uroot -p123456 -e "SHOW VARIABLES LIKE 'max_connections';"
docker exec mysql mysql -uroot -p123456 -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"
# ====== 实时监控 ======
docker exec mysql mysqladmin -uroot -p123456 -i 10 extended-status
docker exec mysql mysqladmin -uroot -p123456 processlist排障指南
# ====== 容器启动失败 ======
# 查看容器日志
docker logs --tail 50 mysql
# 常见启动失败原因:
# 1. 端口被占用:ss -tlnp | grep 3306
# 2. 数据目录权限不正确:chown -R 999:999 /usr/local/docker/mysql/data
# 3. 配置文件错误:docker exec mysql cat /etc/mysql/conf.d/my.cnf
# 4. 内存不足:free -h
# 5. 密码格式不符合策略
# ====== 连接失败 ======
# 1. 检查容器是否运行:docker ps
# 2. 检查端口映射:docker port mysql
# 3. 检查防火墙:firewall-cmd --list-ports
# 4. 检查 MySQL 用户权限
# 5. 检查认证插件是否兼容
# ====== 数据损坏 ======
# 1. 检查错误日志:cat /usr/local/docker/mysql/logs/error.log
# 2. 使用 mysqlcheck 修复
docker exec mysql mysqlcheck -uroot -p123456 --auto-repair --all-databases
# 3. 恢复备份
# ====== 性能问题 ======
# 1. 查看慢查询日志
# 2. 检查容器资源使用:docker stats mysql
# 3. 检查连接数:docker exec mysql mysql -uroot -p123456 -e "SHOW PROCESSLIST;"
# 4. 调整 innodb_buffer_pool_size 等参数升级与迁移
# ====== MySQL 版本升级(5.7 -> 8.0) ======
# 步骤:
# 1. 备份数据
docker exec mysql mysqldump -uroot -p123456 --all-databases --single-transaction --routines --triggers > /backup/full_backup.sql
# 2. 停止旧容器
docker stop mysql
docker rename mysql mysql_old
# 3. 拉取新版本镜像
docker pull mysql:8.0
# 4. 使用新版本启动(注意:不要直接挂载 5.7 的数据目录)
docker run -d --name mysql \
-p 3306:3306 \
-v /usr/local/docker/mysql/conf.d:/etc/mysql/conf.d \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data_new:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--restart=always \
mysql:8.0
# 5. 恢复数据
docker exec -i mysql mysql -uroot -p123456 < /backup/full_backup.sql
# 6. 验证后删除旧容器
docker rm mysql_old
# ====== 数据迁移到另一台服务器 ======
# 方法 1:导出导入
docker exec mysql mysqldump -uroot -p123456 --all-databases | gzip > /tmp/all_db.gz
scp /tmp/all_db.gz user@new-server:/tmp/
# 在新服务器上恢复
gunzip < /tmp/all_db.gz | docker exec -i mysql mysql -uroot -p123456
# 方法 2:直接复制数据目录
docker stop mysql
tar czf /tmp/mysql_data.tar.gz -C /usr/local/docker/mysql/ data
scp /tmp/mysql_data.tar.gz user@new-server:/usr/local/docker/mysql/
# 在新服务器上解压并启动关键知识点
- 部署类主题的核心不是"装成功",而是"稳定运行、可排障、可回滚"。
- 同一个服务通常至少要关注版本、目录、端口、权限、数据、日志和备份。
- Linux 问题经常跨越系统层、网络层、服务层和应用层。
- 部署主题通常要同时看镜像、容器、卷、网络和宿主机资源。
- Docker 中 MySQL 的数据目录权限必须为 999:999(mysql 用户)。
- 配置文件权限必须为 644,否则 MySQL 会忽略该文件。
- 使用 --restart=always 确保容器异常退出后自动重启。
- 生产环境建议固定 MySQL 版本,避免 latest 标签。
项目落地视角
- 把安装步骤补成可重复执行的清单,必要时写成脚本或配置文件。
- 把配置目录、数据目录、日志目录和挂载点明确拆开。
- 上线前检查防火墙、SELinux、时区、磁盘、系统服务和健康检查。
- 固定镜像标签,记录端口、挂载目录、环境变量和自启动策略。
- 建立定期备份策略,并验证备份可恢复性。
- 使用 Docker Compose 管理多容器依赖。
常见误区
- 使用 latest 或未固定版本,导致环境不可复现。
- 只验证启动成功,不验证持久化、开机自启和故障恢复。
- 遇到问题先改配置而不是先看日志和依赖链路。
- 使用 latest 导致结果不可复现。
- 数据目录权限不正确(必须为 999:999)。
- 不配置 MySQL 字符集导致中文乱码。
- 不设置资源限制导致容器占用过多宿主机资源。
- 直接暴露 3306 端口到公网。
进阶路线
- 继续补齐 systemd、性能监控、安全加固和备份恢复。
- 把单机操作升级成 Docker、Kubernetes 或 IaC 方案。
- 建立标准化运维手册,包括巡检、扩容、回滚和灾备演练。
- 继续补齐 Compose 编排、镜像瘦身、安全扫描和镜像仓库治理。
适用场景
- 当你准备把《Docker 安装MySql》真正落到项目里时,最适合先在一个独立模块或最小样例里验证关键路径。
- 适合单机环境初始化、中间件快速搭建、测试环境验证和生产部署前准备。
- 当服务稳定性依赖端口、权限、目录、网络和系统参数时,这类主题会直接影响成败。
落地建议
- 固定版本号与镜像标签,避免"latest"带来的不可预期变化。
- 把配置、数据、日志目录拆开管理,并记录恢复步骤。
- 上线前确认端口、防火墙、SELinux、时区和磁盘空间。
- 使用 Docker Compose 管理服务编排。
- 配置 healthcheck 实现健康检查。
- 建立自动备份和恢复演练机制。
排错清单
- 先查 systemctl、容器日志和应用日志,确认失败发生在哪一层。
- 检查端口占用、目录权限、挂载路径和网络连通性。
- 如果是新环境问题,优先对比与已知正常环境的差异。
- 使用 docker logs 查看容器启动日志。
- 检查 MySQL 错误日志 /usr/local/docker/mysql/logs/error.log。
- 使用 docker stats 检查容器资源使用。
复盘问题
- 如果把《Docker 安装MySql》放进你的当前项目,最先要验证的输入、输出和失败路径分别是什么?
- 《Docker 安装MySql》最容易在什么规模、什么边界条件下暴露问题?你会用什么指标或日志去确认?
- 相比默认实现或替代方案,采用《Docker 安装MySql》最大的收益和代价分别是什么?
