【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,检查进程是否正常启动。

相关推荐
方也_arkling2 小时前
【Docker】Docker的安装和使用
docker·容器·github
小雪_Snow2 小时前
Ubuntu 25 第一次启动配置
ubuntu
linux修理工2 小时前
ubuntu 2204 tsinghua
linux·运维·ubuntu
oMcLin2 小时前
Ubuntu 22.04 无法安装依赖包:解决 apt‑get 错误“Could not resolve”
linux·运维·ubuntu
❀͜͡傀儡师2 小时前
docker安装spug运维管理平台
运维·docker·容器
Damon小智2 小时前
Windows系统安装Docker容器搭建Linux环境
linux·运维·windows·docker·子系统
qq_317620313 小时前
03:Docker数据管理与网络
docker·数据持久化·端口映射·网络模式·volume数据卷
vb2008113 小时前
Ubuntu 系统下 AMQP 协议 RabbitMQ服务器部署
服务器·ubuntu·rabbitmq
Irene19913 小时前
使用 Docker 的 Node.js(附:三种 Node.js 环境详细对比)
docker·容器·node.js