基于 AlmaLinux 的 Docker 常用组件一站式部署实战指南
前言
在现代软件开发与运维体系中,容器化技术已经成为标准化部署、环境一致性保障的核心方案。其中 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 [可选参数] 镜像名:标签 [启动命令]
核心参数详解(结合之前的踩坑案例):
-i/--interactive:保持容器的标准输入打开,即使没有连接到容器,也允许交互操作。-d/--detach:让容器在后台(守护态)运行,执行后会返回容器 ID,不会占用当前终端。- 我们常用的
-id就是这两个参数的组合,几乎所有服务类容器都会用这个组合,让服务在后台稳定运行。
- 我们常用的
--name=容器名:为容器指定一个唯一的名称,后续可以通过名称操作容器,不用记冗长的容器 ID。- ❌ 错误写法:
--name =u_mysql(等号两边有空格,会导致参数解析失败) - ✅ 正确写法:
--name=u_mysql或--name u_mysql
- ❌ 错误写法:
-p 宿主机端口:容器端口/--publish:端口映射,将宿主机的端口映射到容器的端口,外部机器可以通过「宿主机 IP: 宿主机端口」访问容器内的服务。- 示例:
-p 3306:3306,将宿主机的 3306 端口映射到 MySQL 容器的 3306 端口(MySQL 默认端口) - 注意:宿主机端口必须未被占用,否则容器会启动失败;同时需要在防火墙中开放宿主机端口,外部才能访问。
- 示例:
-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 目录。
-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 连接验证
- 打开 SSMS,服务器类型选择「MySQL」(需提前安装 MySQL 驱动)
- 服务器名称填写:
你的AlmaLinux虚拟机IP,3306(比如 192.168.149.135,3306) - 身份验证选择「SQL Server 身份验证」,用户名 root,密码 123456aq@
- 点击连接,即可成功连接到容器内的 MySQL 数据库。
3.1.8 避坑指南与优化
- 必须配置数据卷挂载,否则删除容器后,所有数据库数据都会永久丢失。
- 密码不要设置过于简单,生产环境建议使用大小写 + 数字 + 特殊符号的强密码。
- 生产环境不要直接授权 root 用户从任意主机访问,应该创建专用用户,限制访问 IP。
- 容器启动失败时,优先用
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 避坑指南与优化
- 生产环境必须设置密码,否则会有严重的安全风险,极易被恶意攻击。
- 必须开启持久化,否则容器重启后,内存中的所有数据都会丢失。
- 不要将 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 验证访问
- 先开放防火墙端口:
bash
运行
firewall-cmd --permanent --add-port=8080/tcp firewall-cmd --reload - 在本地浏览器访问:
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 避坑指南与优化
- 注意
$PWD的大小写,不要写成$pwd,否则会导致挂载路径错误,项目无法部署。 - 生产环境建议挂载 Tomcat 的日志目录、配置文件目录,方便查看日志和修改配置。
- 项目部署前,建议先在本地测试通过,避免项目本身的问题导致部署失败。
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 验证访问
- 开放防火墙端口:
bash
运行
firewall-cmd --permanent --add-port=80/tcp firewall-cmd --permanent --add-port=443/tcp firewall-cmd --reload - 在本地浏览器访问:
http://你的虚拟机IP,如果能看到 Nginx 的默认欢迎页,说明部署成功。
3.4.6 核心实战:Nginx 反向代理 Tomcat
这是企业最常用的场景,Nginx 作为入口,接收用户的请求,动态请求转发给后端的 Tomcat 处理,静态资源由 Nginx 直接返回,实现动静分离,提升性能。
- 修改 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; } } - 重启 Nginx 容器,使配置生效:
bash
运行
docker restart c_nginx - 验证:直接访问
http://虚拟机IP,即可看到 Tomcat 的首页,所有请求都经过 Nginx 转发到 Tomcat。
3.4.7 避坑指南与优化
- 配置文件修改后,必须重启 Nginx 容器,或者在容器内执行
nginx -s reload才能生效。 - 修改配置前,建议先执行
docker exec -it c_nginx nginx -t检查配置文件语法是否正确,避免配置错误导致容器启动失败。 - 生产环境建议配置 HTTPS,在 Nginx 上部署 SSL 证书,提升网站安全性。
四、组件间协同实战:完整 Web 请求流程
通过前面的部署,我们已经搭建了 4 个核心组件,它们在实际项目中是协同工作的,完整的用户请求流程如下:
- 用户在浏览器发起请求,首先到达 Nginx(80 端口),Nginx 作为网关入口;
- Nginx 判断请求类型:
- 如果是图片、CSS、JS 等静态资源请求,Nginx 直接从自己的 html 目录读取文件,返回给用户,速度极快;
- 如果是登录、查询数据等动态业务请求,Nginx 将请求转发给后端的 Tomcat(8080 端口);
- Tomcat 接收到请求后,运行 Java 业务代码,处理业务逻辑:
- 如果是需要查询缓存的请求(比如商品详情),Tomcat 会先连接 Redis(6379 端口),从缓存中读取数据,直接返回,速度极快;
- 如果缓存中没有数据,或者需要操作数据库的请求(比如用户登录、下单),Tomcat 会连接 MySQL(3306 端口),执行数据库操作,然后将结果返回给 Nginx;
- Nginx 将最终的处理结果返回给用户的浏览器,完成一次完整的请求。
通过这样的架构,我们实现了动静分离、缓存加速,大幅提升了系统的并发能力和响应速度,这也是目前企业级 Java Web 项目的标准架构。
五、常见问题排查与避坑指南
这里整理了初学者在 Docker 部署过程中 90% 的高频问题,以及对应的解决方案,帮你快速定位问题,少走弯路。
5.1 容器启动失败,执行 docker ps 看不到容器
- 原因 1:端口被占用,宿主机的端口已经被其他服务占用。
- 解决方案:执行
netstat -tulpn | grep 端口号查看占用端口的进程,停止对应进程,或者更换映射的宿主机端口。
- 解决方案:执行
- 原因 2:挂载目录权限错误,或者挂载的文件不存在。
- 解决方案:检查挂载的目录是否存在,权限是否正确,MySQL 的 data 目录建议设置权限
chmod 777 mysql/data。
- 解决方案:检查挂载的目录是否存在,权限是否正确,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 开发环境
更多推荐




所有评论(0)