【docker测试】在Ubuntu 22.04.3中部署docker

在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 关键注意事项

  1. 密码强度适配

    MySQL5.7默认有密码强度校验,Dockerfile中已添加配置关闭严格校验(validate_password相关参数),否则root/root这种简单密码会初始化失败。

  2. 端口映射逻辑

    • 容器内MySQL始终监听3306,-p 3308:3306是将宿主机3308端口转发到容器内3306;
    • 外部访问时必须用3308端口,容器内Nginx反向代理MySQL需用127.0.0.1:3306
  3. 数据持久化

    运行命令中的-v mysql-data:/var/lib/mysql必须保留,否则容器删除后MySQL数据会丢失;如需修改数据存储路径,可替换为宿主机目录(如-v /opt/mysql-data:/var/lib/mysql)。

  4. 安全提示
    root/root密码仅适合测试环境,生产环境需修改为复杂密码,并限制MySQL的远程访问IP(修改bind-address为指定IP,而非0.0.0.0)。

6 常见问题排查

  1. 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)。
  2. 容器启动后立即退出

    大概率是supervisord配置错误,查看容器日志:docker logs ubuntu-mysql-nginx,检查进程是否正常启动。

相关推荐
周公挚友14 小时前
2026年单服务器 Ubuntu 24.04 无公网离线部署 MongoDB 8.0.17 三节点副本集(主 / 从 / 仲裁)保姆级教程
linux·mongodb·ubuntu
HABuo14 小时前
【linux进程控制(三)】进程程序替换&自己实现一个bash解释器
linux·服务器·c语言·c++·ubuntu·centos·bash
磊磊cpp14 小时前
Ubuntu 22.04 手动安装 XRDP(RDP 远程桌面)教程
linux·运维·ubuntu
等风来不如迎风去14 小时前
【docker】ubuntu空间不够了,删除ragflow
ubuntu·docker·容器
chipsense14 小时前
Ubuntu服务器上为Apache网站安装部署SSL证书详细步骤
linux·ubuntu·ssl
阿绵14 小时前
Adb 基本概念及命令
adb
定偶14 小时前
Ubuntu 20.04 网络与软件源问题
网络·ubuntu·php·系统优化
墨笔之风15 小时前
Linux (Docker环境)GitLab本地部署指南
linux·docker·gitlab
bloglin9999915 小时前
hub.docker.com和docker.com
java·docker·eureka
rustfs15 小时前
使用 podman 容器化安装 RustFS 详细指南
docker·rust·podman