前言

在现代软件开发与运维体系中,容器化技术已经成为标准化部署、环境一致性保障的核心方案。其中 Docker 作为容器化技术的事实标准,以轻量、高效、可移植的特性,彻底解决了传统部署中「开发环境能跑,生产环境跑不起来」的痛点。

AlmaLinux 作为 CentOS 的官方替代发行版,100% 兼容 RHEL 二进制规范,具备长期稳定支持、安全更新及时、企业级兼容性强的优势,是生产环境和学习测试环境的首选操作系统。

本文将以 AlmaLinux 9 系统为基础,从零开始,完整讲解 Docker 引擎的安装、核心命令详解,以及企业级开发中最常用的 4 大核心组件(MySQL、Redis、Tomcat、Nginx)的容器化部署、配置优化、远程访问、组件协同全流程。本文适合 Docker 初学者、Java 开发工程师、运维工程师学习参考,所有命令均经过实测可直接复制执行,同时整理了大量初学者高频踩坑点与解决方案,帮你少走弯路。

本文环境说明:

  • 操作系统:AlmaLinux 9 64 位(最小化安装)
  • 硬件环境:VMware 虚拟机(2 核 4G 配置,桥接网络模式)
  • 权限要求:全程使用 root 用户操作,非 root 用户需在命令前加 sudo
  • 网络要求:虚拟机可正常访问外网,用于下载 Docker 镜像与软件包

一、环境准备与 Docker 引擎安装

1.1 系统前置配置

在安装 Docker 之前,我们需要先对 AlmaLinux 系统进行基础配置,关闭可能影响容器运行的安全组件,配置防火墙规则。

1.1.1 关闭 SELinux

SELinux 是 Linux 的安全增强模块,默认开启状态下可能会限制 Docker 容器的文件挂载、端口访问等操作,学习环境建议临时关闭并永久禁用:

bash

运行

# 临时关闭SELinux(立即生效,重启后失效)
setenforce 0

# 永久关闭SELinux(修改配置文件,重启后生效)
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

执行完成后,可通过getenforce命令验证,输出Permissive即为临时关闭成功。

1.1.2 防火墙基础配置

AlmaLinux 默认使用 firewalld 作为防火墙管理工具,后续我们需要开放容器对应的端口,这里先确保防火墙处于正常运行状态,同时放行 Docker 相关的流量规则:

bash

运行

# 启动firewalld并设置开机自启
systemctl start firewalld
systemctl enable firewalld

# 放行Docker默认网段,避免容器间通信被拦截
firewall-cmd --permanent --zone=trusted --add-source=172.17.0.0/16
# 重新加载防火墙规则
firewall-cmd --reload
1.1.3 卸载系统旧版本 Docker

AlmaLinux 系统默认可能会自带 podman 等容器运行时,以及旧版本的 docker 组件,需要先卸载干净,避免冲突:

bash

运行

# 卸载旧版本Docker及相关依赖
dnf remove -y docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine \
podman \
runc

1.2 Docker 引擎官方安装

我们采用 Docker 官方 YUM 源进行安装,确保安装的是最新稳定版本,步骤如下:

1.2.1 安装基础依赖包

bash

运行

# 安装dnf配置工具、证书工具等基础依赖
dnf install -y dnf-plugins-core ca-certificates curl gnupg2
1.2.2 添加 Docker 官方 YUM 源

bash

运行

# 配置Docker官方稳定版源
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
1.2.3 安装 Docker 核心组件

bash

运行

# 安装Docker引擎、CLI工具、容器运行时、构建插件等全套组件
dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
1.2.4 启动 Docker 并设置开机自启

bash

运行

# 启动Docker服务
systemctl start docker
# 设置开机自启,避免虚拟机重启后Docker无法自动运行
systemctl enable docker
1.2.5 验证 Docker 安装是否成功

bash

运行

# 查看Docker版本,确认安装成功
docker --version

# 运行hello-world测试容器,验证Docker引擎可正常工作
docker run hello-world

如果输出包含Hello from Docker!字样,说明 Docker 安装完全成功,已经可以正常拉取镜像、运行容器。

1.2.6 配置 Docker 镜像加速

Docker 官方镜像仓库在国外,国内拉取镜像速度较慢,我们配置国内镜像加速源,提升拉取速度:

bash

运行

# 创建Docker配置文件目录
mkdir -p /etc/docker

# 写入镜像加速配置,采用阿里云、网易云、中科大镜像源
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}
EOF

# 重启Docker服务,使配置生效
systemctl daemon-reload
systemctl restart docker

配置完成后,可通过docker info命令查看,末尾的Registry Mirrors部分显示我们配置的加速地址,即为生效。


二、Docker 核心基础与高频命令详解

在部署组件之前,我们必须先掌握 Docker 的核心概念与高频命令,理解每个参数的含义,避免后续部署踩坑。这也是初学者最容易出错的部分,本文会结合之前的踩坑案例逐一讲解。

2.1 Docker 核心概念

  • 镜像(Image):可以理解为容器的「模板」,是一个只读的文件系统,包含了运行应用所需的代码、环境、依赖、配置文件。比如 MySQL 镜像、Tomcat 镜像,就相当于安装包。
  • 容器(Container):是镜像运行后的实例,相当于通过模板创建出来的「虚拟机实例」,每个容器都是独立的、隔离的运行环境,拥有自己的文件系统、网络、进程空间。
  • 仓库(Registry):用于存储和分发 Docker 镜像的服务,最常用的是 Docker Hub,相当于镜像的「应用商店」。

2.2 高频命令全解析

2.2.1 镜像相关命令

表格

命令 作用 示例 注意事项
docker search 镜像名 在 Docker Hub 中搜索镜像 docker search redis 可查看镜像的星级、官方标识,优先选择 OFFICIAL 官方镜像
docker pull 镜像名:标签 拉取(下载)镜像到本地 docker pull redis:5.0 标签(Tag)对应版本号,不写标签默认拉取 latest 最新版,生产环境建议指定固定版本
docker images 查看本地所有镜像 docker images 可查看镜像 ID、创建时间、大小
docker rmi 镜像名/镜像ID 删除本地镜像 docker rmi redis:5.0 必须先删除使用该镜像的容器,才能删除镜像
2.2.2 容器核心运行命令 docker run

docker run是我们最常用的命令,用于创建并启动容器,之前所有的组件部署都基于这个命令,这里拆解每个核心参数的含义,解决初学者的参数困惑:

基础语法

bash

运行

docker run [可选参数] 镜像名:标签 [启动命令]

核心参数详解(结合之前的踩坑案例)

  1. -i/--interactive:保持容器的标准输入打开,即使没有连接到容器,也允许交互操作。
  2. -d/--detach:让容器在后台(守护态)运行,执行后会返回容器 ID,不会占用当前终端。
    • 我们常用的-id就是这两个参数的组合,几乎所有服务类容器都会用这个组合,让服务在后台稳定运行。
  3. --name=容器名:为容器指定一个唯一的名称,后续可以通过名称操作容器,不用记冗长的容器 ID。
    • ❌ 错误写法:--name =u_mysql(等号两边有空格,会导致参数解析失败)
    • ✅ 正确写法:--name=u_mysql--name u_mysql
  4. -p 宿主机端口:容器端口/--publish:端口映射,将宿主机的端口映射到容器的端口,外部机器可以通过「宿主机 IP: 宿主机端口」访问容器内的服务。
    • 示例:-p 3306:3306,将宿主机的 3306 端口映射到 MySQL 容器的 3306 端口(MySQL 默认端口)
    • 注意:宿主机端口必须未被占用,否则容器会启动失败;同时需要在防火墙中开放宿主机端口,外部才能访问。
  5. -v 宿主机路径:容器内路径/--volume:数据卷挂载,将宿主机的目录 / 文件挂载到容器内,实现数据持久化和配置文件同步。
    • 核心作用:容器是无状态的,删除容器后,容器内的所有数据都会丢失。通过挂载,数据会保存在宿主机上,容器删除 / 重建后,数据不会丢失。
    • 高频踩坑点:$PWD的大小写问题
      • $PWD:是 Linux 系统预定义的环境变量,全称Print Working Directory,代表当前工作目录的绝对路径,是系统自动维护的,永远有值。
      • $pwd:只是一个普通的自定义变量名,默认情况下是未定义的,值为空,会导致挂载路径变成/conf:/etc/mysql/conf.d,挂载到根目录,完全不符合预期。
    • 示例:-v $PWD/conf:/etc/mysql/conf.d,将当前目录下的 conf 文件夹,挂载到容器内的 /etc/mysql/conf.d 目录。
  6. -e 环境变量名=值/--env:设置容器内的环境变量,用于给容器内的应用传递配置参数,比如 MySQL 的 root 密码、Redis 的密码等。
    • 示例:-e MYSQL_ROOT_PASSWORD=123456,给 MySQL 容器设置 root 用户的密码为 123456。
2.2.3 容器生命周期管理命令

表格

命令 作用 示例 注意事项
docker ps 查看正在运行的容器 docker ps -a参数可以查看所有容器(包括停止的)
docker logs 容器名/容器ID 查看容器的运行日志 docker logs u_mysql 容器启动失败时,用这个命令排查报错原因,加-f参数可以实时查看日志
docker exec -it 容器名/容器ID /bin/bash 进入容器内部,执行交互命令 docker exec -it u_mysql /bin/bash 进入容器后可以修改配置、查看文件、登录数据库等,exit命令退出容器
docker stop 容器名/容器ID 停止正在运行的容器 docker stop u_mysql 正常停止容器,不会丢失数据
docker start 容器名/容器ID 启动已停止的容器 docker start u_mysql 容器停止后,用这个命令重新启动,配置和数据都会保留
docker rm 容器名/容器ID 删除容器 docker rm u_mysql 必须先停止容器,才能删除;删除后容器内未挂载的数据会永久丢失
2.2.4 初学者必备应急命令
  • 中断正在输入的错误命令:按Ctrl + C,直接回到终端提示符,重新输入正确命令,解决之前输入错误命令无法退出的问题。
  • 查看命令帮助:docker 命令 --help,比如docker run --help,可以查看所有参数的详细说明。

三、Docker 核心组件一站式部署实战

本章节将详细讲解企业级开发中最常用的 4 大核心组件的容器化部署,每个组件都包含「组件简介→完整部署步骤→配置详解→访问验证→生产环境优化→避坑指南」,所有命令都经过 AlmaLinux 环境实测,可直接复制执行。

3.1 MySQL 数据库部署

MySQL 是最流行的开源关系型数据库,是 Java 开发的标配组件,容器化部署可以快速搭建数据库环境,避免繁琐的本地安装配置。

3.1.1 部署前准备

先创建挂载目录,用于存放 MySQL 的配置文件、日志、数据,确保数据持久化:

bash

运行

# 进入当前用户的工作目录(可自定义)
cd /root
# 创建MySQL的挂载目录:conf(配置文件)、logs(日志)、data(数据)
mkdir -p mysql/{conf,logs,data}
# 进入mysql目录,后续命令都在这个目录下执行
cd mysql
3.1.2 拉取 MySQL 镜像

这里选择 MySQL 8.0 稳定版,兼容性强,企业使用最广泛:

bash

运行

# 拉取MySQL 8.0镜像
docker pull mysql:8.0
3.1.3 创建并启动 MySQL 容器

bash

运行

docker run -id \
--name=u_mysql \
-p 3306:3306 \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--restart=always \
mysql:8.0

参数详解

  • --name=u_mysql:容器命名为 u_mysql
  • -p 3306:3306:宿主机 3306 端口映射到容器 3306 端口(MySQL 默认端口)
  • 三个-v挂载:分别挂载配置目录、日志目录、数据目录,实现数据持久化
  • -e MYSQL_ROOT_PASSWORD=123456:设置 root 用户的登录密码,必须设置,否则容器无法启动
  • --restart=always:设置容器开机自启,虚拟机重启后,MySQL 容器会自动启动
  • mysql:8.0:使用我们拉取的 8.0 版本镜像
3.1.4 验证容器是否正常运行

bash

运行

# 查看容器是否处于Up状态
docker ps

# 查看容器运行日志,无报错即为正常启动
docker logs u_mysql
3.1.5 配置远程访问(本地 SSMS/Navicat 连接)

默认情况下,MySQL 的 root 用户只允许容器内本地访问,我们需要授权远程访问,才能在本地的 SSMS、Navicat 等工具连接:

bash

运行

# 进入MySQL容器内部
docker exec -it u_mysql /bin/bash

# 登录MySQL,输入刚才设置的密码123456aq@
mysql -u root -p

# 执行授权命令,允许root用户从任意主机远程访问
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456aq@';
# 刷新权限,使配置生效
FLUSH PRIVILEGES;

# 退出MySQL和容器
exit
exit
3.1.6 防火墙开放端口

bash

运行

# 开放宿主机3306端口
firewall-cmd --permanent --add-port=3306/tcp
# 重新加载防火墙规则
firewall-cmd --reload
3.1.7 本地 SSMS 连接验证
  1. 打开 SSMS,服务器类型选择「MySQL」(需提前安装 MySQL 驱动)
  2. 服务器名称填写:你的AlmaLinux虚拟机IP,3306(比如 192.168.149.135,3306)
  3. 身份验证选择「SQL Server 身份验证」,用户名 root,密码 123456aq@
  4. 点击连接,即可成功连接到容器内的 MySQL 数据库。
3.1.8 避坑指南与优化
  1. 必须配置数据卷挂载,否则删除容器后,所有数据库数据都会永久丢失。
  2. 密码不要设置过于简单,生产环境建议使用大小写 + 数字 + 特殊符号的强密码。
  3. 生产环境不要直接授权 root 用户从任意主机访问,应该创建专用用户,限制访问 IP。
  4. 容器启动失败时,优先用docker logs u_mysql查看报错,90% 的问题是端口占用、挂载目录权限错误、密码未设置。

3.2 Redis 缓存数据库部署

Redis 是一款高性能的开源内存键值数据库,核心用于缓存热点数据、提升系统并发能力、降低 MySQL 数据库压力,是高并发系统的必备组件。

3.2.1 部署前准备

创建挂载目录,用于存放 Redis 的配置文件和持久化数据:

bash

运行

# 回到root目录
cd /root
# 创建Redis的挂载目录
mkdir -p redis/{conf,data}
# 进入redis目录
cd redis
3.2.2 拉取 Redis 镜像

这里选择 Redis 5.0 稳定版,兼容性强,适合学习和生产使用:

bash

运行

docker pull redis:5.0
3.2.3 创建并启动 Redis 容器

bash

运行

docker run -id \
--name=c_redis \
-p 6379:6379 \
-v $PWD/data:/data \
--restart=always \
redis:5.0 \
redis-server --appendonly yes --requirepass 123456

参数详解

  • --name=c_redis:容器命名为 c_redis
  • -p 6379:6379:宿主机 6379 端口映射到容器 6379 端口(Redis 默认端口)
  • -v $PWD/data:/data:挂载数据目录,Redis 的持久化数据会保存在宿主机上
  • --restart=always:开机自启
  • redis-server --appendonly yes:启动 Redis 服务,并开启 AOF 持久化,避免容器重启数据丢失
  • --requirepass 123456:设置 Redis 的访问密码为 123456,提升安全性
3.2.4 验证容器运行状态

bash

运行

# 查看容器是否正常运行
docker ps

# 进入Redis容器内部
docker exec -it c_redis /bin/bash

# 登录Redis客户端
redis-cli

# 输入密码验证
auth 123456

# 测试写入和读取数据
set test_key hello_redis
get test_key

如果能正常写入和读取数据,说明 Redis 部署完全成功。

3.2.5 防火墙开放端口

bash

运行

# 开放6379端口
firewall-cmd --permanent --add-port=6379/tcp
firewall-cmd --reload
3.2.6 外部机器连接验证

在本地 Windows 机器上,下载 Redis 的 Windows 客户端,执行以下命令连接:

bash

运行

# 连接Redis,替换为你的虚拟机IP
./redis-cli.exe -h 192.168.149.135 -p 6379
# 输入密码
auth 123456
# 测试读取数据
get test_key
3.2.7 避坑指南与优化
  1. 生产环境必须设置密码,否则会有严重的安全风险,极易被恶意攻击。
  2. 必须开启持久化,否则容器重启后,内存中的所有数据都会丢失。
  3. 不要将 Redis 直接暴露在公网,生产环境建议限制访问 IP,只允许业务服务器访问。

3.3 Tomcat Web 服务器部署

Tomcat 是 Apache 基金会开源的 Java Web 应用服务器,是运行 Java Web 项目的核心容器,支持 Servlet、JSP 等 Java Web 规范,是 Java 开发的标配组件。

3.3.1 部署前准备

创建挂载目录,用于存放 Web 应用项目,实现项目文件和容器的解耦:

bash

运行

# 回到root目录
cd /root
# 创建Tomcat的挂载目录
mkdir -p tomcat/webapps
# 进入tomcat目录
cd tomcat
3.3.2 拉取 Tomcat 镜像

这里选择 Tomcat 9 稳定版,兼容 JDK 8,是企业使用最广泛的版本:

bash

运行

docker pull tomcat:9-jdk8
3.3.3 创建并启动 Tomcat 容器

bash

运行

docker run -id \
--name=c_tomcat \
-p 8080:8080 \
-v $PWD/webapps:/usr/local/tomcat/webapps \
--restart=always \
tomcat:9-jdk8

参数详解

  • --name=c_tomcat:容器命名为 c_tomcat
  • -p 8080:8080:宿主机 8080 端口映射到容器 8080 端口(Tomcat 默认端口)
  • -v $PWD/webapps:/usr/local/tomcat/webapps:挂载 webapps 目录,我们只需要把 Java Web 项目(war 包)放到宿主机的 webapps 目录下,Tomcat 容器就会自动部署,不用进入容器操作。
  • --restart=always:开机自启
3.3.4 验证访问
  1. 先开放防火墙端口:

    bash

    运行

    firewall-cmd --permanent --add-port=8080/tcp
    firewall-cmd --reload
    
  2. 在本地浏览器访问:http://你的虚拟机IP:8080,如果能看到 Tomcat 的默认首页,说明部署成功。

注意:如果访问出现 404,是因为 Tomcat 9 的默认首页文件在 webapps.dist 目录下,我们可以进入容器,把 webapps.dist 里的文件复制到 webapps 目录:

bash

运行

# 进入Tomcat容器
docker exec -it c_tomcat /bin/bash
# 复制首页文件
cp -r webapps.dist/* webapps/
# 退出容器
exit

刷新浏览器即可看到 Tomcat 默认首页。

3.3.5 项目部署方法

只需要将你的 Java Web 项目打包成 war 包,放到宿主机的/root/tomcat/webapps目录下,Tomcat 会自动解压部署,直接通过http://虚拟机IP:8080/项目名即可访问。

3.3.6 避坑指南与优化
  1. 注意$PWD的大小写,不要写成$pwd,否则会导致挂载路径错误,项目无法部署。
  2. 生产环境建议挂载 Tomcat 的日志目录、配置文件目录,方便查看日志和修改配置。
  3. 项目部署前,建议先在本地测试通过,避免项目本身的问题导致部署失败。

3.4 Nginx 反向代理服务器部署

Nginx 是一款高性能的开源 HTTP 和反向代理服务器,以高并发、低资源消耗、稳定性强著称,是 Web 服务的「入口网关」,核心用于静态资源服务、反向代理、负载均衡。

3.4.1 部署前准备

创建挂载目录,用于存放 Nginx 的配置文件、静态资源、日志:

bash

运行

# 回到root目录
cd /root
# 创建Nginx的挂载目录
mkdir -p nginx/{conf,html,logs}
# 进入nginx目录
cd nginx
3.4.2 拉取 Nginx 镜像

选择最新稳定版 Nginx:

bash

运行

docker pull nginx:latest
3.4.3 先创建临时容器,复制默认配置文件

为了避免挂载后配置文件为空导致容器启动失败,我们先创建一个临时容器,把默认的配置文件复制到宿主机:

bash

运行

# 创建临时容器
docker run -id --name=nginx_temp nginx:latest
# 复制容器内的默认配置文件到宿主机
docker cp nginx_temp:/etc/nginx/nginx.conf $PWD/conf/
docker cp nginx_temp:/etc/nginx/conf.d $PWD/conf/
# 停止并删除临时容器
docker stop nginx_temp
docker rm nginx_temp
3.4.4 创建并启动 Nginx 容器

bash

运行

docker run -id \
--name=c_nginx \
-p 80:80 \
-p 443:443 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/conf/conf.d:/etc/nginx/conf.d \
-v $PWD/html:/usr/share/nginx/html \
-v $PWD/logs:/var/log/nginx \
--restart=always \
nginx:latest

参数详解

  • --name=c_nginx:容器命名为 c_nginx
  • -p 80:80:映射 HTTP 默认 80 端口,-p 443:443映射 HTTPS 默认 443 端口
  • 四个-v挂载:分别挂载主配置文件、子配置目录、静态资源目录、日志目录,所有配置都可以在宿主机修改,不用进入容器。
  • --restart=always:开机自启
3.4.5 验证访问
  1. 开放防火墙端口:

    bash

    运行

    firewall-cmd --permanent --add-port=80/tcp
    firewall-cmd --permanent --add-port=443/tcp
    firewall-cmd --reload
    
  2. 在本地浏览器访问:http://你的虚拟机IP,如果能看到 Nginx 的默认欢迎页,说明部署成功。
3.4.6 核心实战:Nginx 反向代理 Tomcat

这是企业最常用的场景,Nginx 作为入口,接收用户的请求,动态请求转发给后端的 Tomcat 处理,静态资源由 Nginx 直接返回,实现动静分离,提升性能。

  1. 修改 Nginx 配置文件,在/root/nginx/conf/conf.d/default.conf中添加以下配置:

    nginx

    server {
        listen       80;
        server_name  localhost;
    
        # 静态资源请求,Nginx直接处理
        location /static/ {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }
    
        # 动态请求,转发给Tomcat容器
        location / {
            proxy_pass http://你的虚拟机IP:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
    
  2. 重启 Nginx 容器,使配置生效:

    bash

    运行

    docker restart c_nginx
    
  3. 验证:直接访问http://虚拟机IP,即可看到 Tomcat 的首页,所有请求都经过 Nginx 转发到 Tomcat。
3.4.7 避坑指南与优化
  1. 配置文件修改后,必须重启 Nginx 容器,或者在容器内执行nginx -s reload才能生效。
  2. 修改配置前,建议先执行docker exec -it c_nginx nginx -t检查配置文件语法是否正确,避免配置错误导致容器启动失败。
  3. 生产环境建议配置 HTTPS,在 Nginx 上部署 SSL 证书,提升网站安全性。

四、组件间协同实战:完整 Web 请求流程

通过前面的部署,我们已经搭建了 4 个核心组件,它们在实际项目中是协同工作的,完整的用户请求流程如下:

  1. 用户在浏览器发起请求,首先到达 Nginx(80 端口),Nginx 作为网关入口;
  2. Nginx 判断请求类型:
    • 如果是图片、CSS、JS 等静态资源请求,Nginx 直接从自己的 html 目录读取文件,返回给用户,速度极快;
    • 如果是登录、查询数据等动态业务请求,Nginx 将请求转发给后端的 Tomcat(8080 端口);
  3. Tomcat 接收到请求后,运行 Java 业务代码,处理业务逻辑:
    • 如果是需要查询缓存的请求(比如商品详情),Tomcat 会先连接 Redis(6379 端口),从缓存中读取数据,直接返回,速度极快;
    • 如果缓存中没有数据,或者需要操作数据库的请求(比如用户登录、下单),Tomcat 会连接 MySQL(3306 端口),执行数据库操作,然后将结果返回给 Nginx;
  4. Nginx 将最终的处理结果返回给用户的浏览器,完成一次完整的请求。

通过这样的架构,我们实现了动静分离、缓存加速,大幅提升了系统的并发能力和响应速度,这也是目前企业级 Java Web 项目的标准架构。


五、常见问题排查与避坑指南

这里整理了初学者在 Docker 部署过程中 90% 的高频问题,以及对应的解决方案,帮你快速定位问题,少走弯路。

5.1 容器启动失败,执行 docker ps 看不到容器

  • 原因 1:端口被占用,宿主机的端口已经被其他服务占用。
    • 解决方案:执行netstat -tulpn | grep 端口号查看占用端口的进程,停止对应进程,或者更换映射的宿主机端口。
  • 原因 2:挂载目录权限错误,或者挂载的文件不存在。
    • 解决方案:检查挂载的目录是否存在,权限是否正确,MySQL 的 data 目录建议设置权限chmod 777 mysql/data
  • 原因 3:参数格式错误,比如--name的等号两边有空格,$PWD写成了$pwd
    • 解决方案:检查命令参数格式,修正错误的参数。
  • 排查方法:执行docker logs 容器名查看容器的启动日志,日志里会明确显示报错原因,这是最有效的排查手段。

5.2 容器正常运行,但本地无法访问

  • 原因 1:防火墙未开放端口,AlmaLinux 的 firewalld 拦截了端口访问。
    • 解决方案:执行firewall-cmd --list-ports查看已开放的端口,确认端口已经开放,未开放则执行开放端口的命令。
  • 原因 2:虚拟机网络模式问题,NAT 模式没有配置端口转发。
    • 解决方案:如果虚拟机是 NAT 模式,需要在 VMware/VirtualBox 中配置端口转发,将宿主机的端口转发到虚拟机的对应端口;或者直接切换为桥接模式,虚拟机和本地电脑在同一个局域网,直接用虚拟机 IP 访问。
  • 原因 3:云服务器的安全组未开放端口,如果是云服务器,需要在控制台的安全组中开放对应端口。

5.3 容器重启后,数据全部丢失

  • 原因:没有配置数据卷挂载,数据保存在容器内部,容器删除 / 重启后,数据会随着容器一起销毁。
    • 解决方案:部署时必须通过-v参数挂载数据目录,将数据保存在宿主机上,确保容器重建后数据不丢失。

5.4 MySQL 远程连接失败

  • 原因 1:root 用户没有授权远程访问,默认只允许本地访问。
    • 解决方案:进入容器,执行授权命令,允许 root 用户远程访问。
  • 原因 2:密码错误,或者加密方式不兼容。
    • 解决方案:MySQL 8.0 默认使用 caching_sha2_password 加密方式,部分客户端不支持,需要修改为 mysql_native_password 加密方式。
  • 原因 3:端口映射错误,宿主机端口和容器端口映射反了。
    • 解决方案:正确的格式是-p 宿主机端口:容器端口,不要写反。

六、总结与拓展

本文基于 AlmaLinux 系统,从零开始,完整讲解了 Docker 引擎的安装、核心命令详解,以及 MySQL、Redis、Tomcat、Nginx 四大核心组件的容器化部署全流程,同时讲解了组件间的协同架构、常见问题排查方案。通过本文的学习,你可以快速掌握 Docker 容器化部署的核心技能,搭建一套完整的 Java Web 开发环境

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐