在Ubuntu 22.04.3中部署docker
1 Dockerfile编写(适配root/root密码 + 3308端口)
bash
FROM ubuntu:22.04.3
# 核心调整:MySQL密码改为root,容器内端口固定3306
ENV DEBIAN_FRONTEND=noninteractive \
MYSQL_ROOT_PASSWORD=root \ # 密码改为root
MYSQL_DATABASE=my_db \
MYSQL_PORT=3306 \ # 容器内端口不变,宿主机映射3308
TZ=Asia/Shanghai
# 1. 安装基础依赖+MySQL5.7+Nginx+supervisord
RUN apt-get update && apt-get install -y --no-install-recommends \
wget gnupg2 tzdata locales \
# 安装MySQL5.7(Ubuntu22.04需手动添加官方源)
&& wget https://dev.mysql.com/get/mysql-apt-config_0.8.22-1_all.deb \
&& echo "mysql-apt-config mysql-apt-config/select-server select mysql-5.7" | debconf-set-selections \
&& dpkg -i mysql-apt-config_0.8.22-1_all.deb \
&& apt-get update \
&& apt-get install -y mysql-server=5.7.* \
# 安装Nginx
&& apt-get install -y nginx \
# 安装进程管理工具(管理多进程)
&& apt-get install -y supervisor \
# 清理缓存减小镜像体积
&& apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# 2. 配置时区和字符集
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone \
&& locale-gen zh_CN.UTF-8 && update-locale LC_ALL=zh_CN.UTF-8 LANG=zh_CN.UTF-8
ENV LANG=zh_CN.UTF-8 LANGUAGE=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8
# 3. 配置MySQL(允许远程访问、关闭严格密码策略,适配root/root简单密码)
RUN sed -i 's/^bind-address\s*=.*/bind-address = 0.0.0.0/' /etc/mysql/mysql.conf.d/mysqld.cnf \
&& sed -i 's/^port\s*=.*/port = 3306/' /etc/mysql/mysql.conf.d/mysqld.cnf \
# 关键:关闭密码强度校验,否则root/root会被拒绝
&& echo "[mysqld]" >> /etc/mysql/conf.d/my.cnf \
&& echo "validate_password_policy=LOW" >> /etc/mysql/conf.d/my.cnf \
&& echo "validate_password_length=4" >> /etc/mysql/conf.d/my.cnf \
&& echo "validate_password_number_count=0" >> /etc/mysql/conf.d/my.cnf \
&& echo "validate_password_special_char_count=0" >> /etc/mysql/conf.d/my.cnf
# 4. 初始化MySQL(设置root密码为root,创建数据库)
COPY scripts/init_mysql.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/init_mysql.sh && /usr/local/bin/init_mysql.sh
# 5. 配置Nginx(默认静态页面,可选反向代理MySQL)
COPY conf/nginx.conf /etc/nginx/nginx.conf
COPY conf/default.conf /etc/nginx/conf.d/
COPY html/ /usr/share/nginx/html/
RUN chmod -R 755 /usr/share/nginx/html/ && chown -R www-data:www-data /usr/share/nginx/html/
# 6. 配置supervisord管理MySQL和Nginx进程
COPY conf/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# 7. 暴露端口(容器内3306、80)
EXPOSE 3306 80
# 8. 启动supervisord(前台运行,保证容器不退出)
CMD ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
2 配套文件调整(适配root/root密码)
2.1 scripts/init_mysql.sh(核心:初始化root密码为root)
bash
#!/bin/bash
set -e
# 临时启动MySQL(后台运行)
mysqld_safe --skip-networking &
MYSQL_PID=$!
# 等待MySQL启动完成
until mysqladmin ping -uroot --silent; do
sleep 1
done
# 关键:设置root密码为root,允许所有IP访问
mysql -uroot -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '$MYSQL_ROOT_PASSWORD';"
mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '$MYSQL_ROOT_PASSWORD' WITH GRANT OPTION;"
# 创建默认数据库
mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "CREATE DATABASE IF NOT EXISTS $MYSQL_DATABASE CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# 刷新权限并停止临时MySQL进程
mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "FLUSH PRIVILEGES;"
mysqladmin -uroot -p$MYSQL_ROOT_PASSWORD shutdown
# 等待临时进程退出
wait $MYSQL_PID
exit 0
2.2 其他配套文件(无需修改,沿用之前的)
conf/supervisord.conf(进程管理配置)conf/nginx.conf(Nginx主配置)conf/default.conf(Nginx虚拟主机配置)html/index.html(测试页面)
3 构建&运行命令(3308端口映射)
bash
# 1. 构建镜像
cd ubuntu-mysql-nginx # 进入Dockerfile所在目录
docker build -t ubuntu-mysql-nginx:v1 .
# 2. 运行容器(宿主机3308映射到容器3306)
docker run -d \
--name ubuntu-mysql-nginx \
-p 3308:3306 \ # 宿主机3308 → 容器内3306
-p 80:80 \ # Nginx端口映射
-v mysql-data:/var/lib/mysql \ # 持久化MySQL数据(必加,防止数据丢失)
ubuntu-mysql-nginx:v1
4 验证MySQL登录(root/root)
bash
# 宿主机访问MySQL(用3308端口,密码root)
mysql -h 127.0.0.1 -P 3308 -u root -p
# 输入密码root,回车后即可登录
# 验证登录成功
mysql> show databases; # 能看到my_db数据库即说明初始化成功
5 关键注意事项
-
密码强度适配 :
MySQL5.7默认有密码强度校验,Dockerfile中已添加配置关闭严格校验(
validate_password相关参数),否则root/root这种简单密码会初始化失败。 -
端口映射逻辑:
- 容器内MySQL始终监听3306,
-p 3308:3306是将宿主机3308端口转发到容器内3306; - 外部访问时必须用
3308端口,容器内Nginx反向代理MySQL需用127.0.0.1:3306。
- 容器内MySQL始终监听3306,
-
数据持久化 :
运行命令中的
-v mysql-data:/var/lib/mysql必须保留,否则容器删除后MySQL数据会丢失;如需修改数据存储路径,可替换为宿主机目录(如-v /opt/mysql-data:/var/lib/mysql)。 -
安全提示 :
root/root密码仅适合测试环境,生产环境需修改为复杂密码,并限制MySQL的远程访问IP(修改bind-address为指定IP,而非0.0.0.0)。
6 常见问题排查
-
MySQL登录失败:
- 检查容器是否运行:
docker ps; - 查看MySQL日志:
docker exec -it ubuntu-mysql-nginx cat /var/log/mysql.err; - 确认端口映射:
docker port ubuntu-mysql-nginx(需显示3306/tcp -> 0.0.0.0:3308)。
- 检查容器是否运行:
-
容器启动后立即退出 :
大概率是supervisord配置错误,查看容器日志:
docker logs ubuntu-mysql-nginx,检查进程是否正常启动。