Docker 部署 Nginx:从入门到实践的完整指南
Docker 部署 Nginx:从入门到实践的完整指南
在现代应用部署中,Docker 凭借其“一次构建,到处运行”的特性,极大简化了环境配置与服务迁移流程。而 Nginx 作为高性能的 HTTP 服务器、反向代理和负载均衡器,是企业级应用架构中的核心组件。本文将带你从零开始,一步步掌握用 Docker 部署 Nginx 的完整流程,包括基础部署、配置自定义、数据持久化以及容器管理,即使是 Docker 新手也能轻松上手。
一、部署前的准备:环境与工具
在开始部署前,我们需要确保本地环境已满足基础条件。Docker 本身是跨平台工具,Windows、macOS 和 Linux 系统均支持,只需安装对应版本的 Docker 即可。
1. 检查 Docker 环境
首先验证 Docker 是否已成功安装并正常运行。打开终端(Windows 用 PowerShell 或命令提示符,macOS/Linux 用终端),执行以下命令:
# 检查 Docker 版本
docker --version
# 检查 Docker 服务状态(确保 Docker 守护进程正在运行)
# Linux/macOS
systemctl status docker # Linux
docker info # 通用(若能输出信息,说明服务正常)
# Windows(PowerShell)
Get-Service Docker
若输出类似 Docker version 26.0.0, build 2ae903e 的版本信息,且 docker info 无报错,则说明 Docker 环境已就绪。
2. 核心概念提前了解
为了更好地理解后续操作,先明确两个 Docker 核心概念:
- 镜像(Image):Nginx 的“安装包”,包含运行 Nginx 所需的所有文件(代码、依赖、配置),是只读的模板。我们将直接使用 Docker Hub 上官方维护的
nginx镜像,无需手动构建。 - 容器(Container):镜像的“运行实例”,是可读写的运行环境。我们部署 Nginx 的本质,就是基于
nginx镜像创建并启动一个容器。
二、基础部署:1 分钟启动 Nginx 容器
如果只需快速搭建一个“能访问”的 Nginx 服务,无需自定义配置,仅需 1 条命令即可完成部署。
1. 拉取官方 Nginx 镜像
Docker Hub 是 Docker 官方的镜像仓库,存储了海量官方和第三方镜像。我们先从 Docker Hub 拉取最新版的 Nginx 官方镜像:
# 拉取最新版 Nginx 镜像(:latest 可省略,默认拉取最新版)
docker pull nginx:latest
拉取完成后,用以下命令查看本地已有的镜像,确认 nginx 镜像存在:
docker images
输出会包含类似以下内容,说明镜像拉取成功:
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest 5a4ee0c8ccbe 17 months ago 455MB
nginx latest e784f4560448 17 months ago 188MB
[root@localhost ~]#
2. 启动 Nginx 容器
基于拉取的 nginx 镜像,创建并启动一个 Nginx 容器。执行以下命令:
docker run -d -p 80:80 --name my-nginx nginx
我们来拆解这条命令的每个参数,理解其作用:
-d:后台运行容器(“守护态”模式),避免终端被容器占用。-p 80:80:端口映射,将宿主机的 80 端口与容器内的 80 端口关联。Nginx 默认监听容器内的 80 端口,通过端口映射,我们才能从宿主机(或其他设备)访问 Nginx。--name my-nginx:给容器起一个自定义名称(这里叫my-nginx),后续管理容器(如启动、停止)时更方便,避免用冗长的容器 ID 操作。nginx:指定基于哪个镜像创建容器(即我们刚才拉取的nginx:latest镜像)。
3. 验证部署结果
容器启动后,我们需要确认 Nginx 是否正常运行。
步骤 1:检查容器状态
执行以下命令,查看 my-nginx 容器的运行状态:
docker ps
若输出中 STATUS 列显示 Up About a minute(或类似“正在运行”的状态),说明容器正常启动:
CONTAINER ID NAMES IMAGE STATUS PORTS NAMES
def456ghi789 my-nginx nginx Up 2 minutes 0.0.0.0:80->80/tcp my-nginx
步骤 2:访问 Nginx 首页
打开浏览器,在地址栏输入 http://localhost(若在服务器部署,输入服务器的公网 IP)。若能看到以下 Nginx 官方默认页面,说明部署成功:
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
当前使用的虚拟机,访问地址为虚拟机IP地址,如下:

三、进阶配置:自定义 Nginx 与数据持久化
基础部署仅能使用 Nginx 的默认配置,实际项目中我们需要自定义配置(如虚拟主机、反向代理),并确保网站文件和日志不丢失(即“数据持久化”)。Docker 中通过数据卷(Volume) 或宿主机目录挂载实现数据持久化,这里我们用更直观的“宿主机目录挂载”方案。
1. 原理:为什么需要挂载目录?
默认情况下,容器内的文件(如 Nginx 配置、网站根目录、日志)存储在容器的“可写层”中。一旦容器被删除,这些文件会全部丢失。通过“挂载”,我们将容器内的关键目录与宿主机的目录关联,容器读写这些目录时,实际操作的是宿主机的文件,从而实现数据持久化。
Nginx 容器内的核心目录(需挂载):
| 容器内目录 | 作用说明 | 宿主机建议挂载目录 |
|---|---|---|
/etc/nginx/conf.d | Nginx 子配置目录(虚拟主机、反向代理等) | ./nginx/conf.d |
/usr/share/nginx/html | Nginx 网站根目录(存放 HTML、CSS 等静态文件) | ./nginx/html |
/var/log/nginx | Nginx 日志目录(访问日志、错误日志) | ./nginx/logs |
2. 操作步骤:创建目录并挂载
步骤 1:在宿主机创建挂载目录
我们在当前用户目录(如 ~/docker-nginx)下创建三个子目录,对应容器内的核心目录:
# 1. 创建主目录(可自定义路径)
mkdir -p ~/docker-nginx
# 2. 进入主目录
cd ~/docker-nginx
# 3. 创建三个子目录(conf.d、html、logs)
mkdir conf.d html logs
步骤 2:自定义 Nginx 配置
在 conf.d 目录下创建一个 Nginx 配置文件(如 default.conf),用于定义网站规则。这里以“静态网站”为例,配置内容如下:
# ~/docker-nginx/conf.d/default.conf
server {
listen 80; # 监听容器内 80 端口
server_name localhost; # 域名(本地测试用 localhost,服务器可改为实际域名)
# 网站根目录(容器内路径,已挂载到宿主机的 ./html)
root /usr/share/nginx/html;
index index.html index.htm; # 默认首页
# 访问日志配置(容器内路径,已挂载到宿主机的 ./logs)
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# 404 页面配置
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}
}
若需要配置反向代理(如将请求转发到后端服务),可在 conf.d 中新增配置文件,例如 proxy.conf:
# 反向代理示例:将 /api 请求转发到后端服务(假设后端地址为 http://192.168.1.100:8080)
server {
listen 80;
server_name api.example.com; # 后端服务的域名
location /api {
proxy_pass http://192.168.1.100:8080; # 后端服务地址
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
步骤 3:自定义网站首页
在 html 目录下创建 index.html 文件,替换 Nginx 默认首页,示例:
<!-- ~/docker-nginx/html/index.html -->
<!DOCTYPE html>
<html>
<head>
<title>My Docker Nginx</title>
<style>
body { text-align: center; margin-top: 100px; font-family: Arial; }
h1 { color: #2c3e50; }
</style>
</head>
<body>
<h1>🎉 Docker + Nginx 部署成功!</h1>
<p>这是自定义的静态页面(数据已持久化)</p>
</body>
</html>
步骤 4:启动带挂载的 Nginx 容器
先停止并删除之前的基础容器(若仍在运行),再启动新的带挂载配置的容器:
# 1. 停止旧容器(若存在)
docker stop my-nginx
# 2. 删除旧容器(若存在)
docker rm my-nginx
# 3. 启动新容器(带目录挂载)
docker run -d \
-p 80:80 \
--name my-nginx \
# 挂载配置目录:宿主机 ./conf.d -> 容器 /etc/nginx/conf.d
-v ~/docker-nginx/conf.d:/etc/nginx/conf.d \
# 挂载网站根目录:宿主机 ./html -> 容器 /usr/share/nginx/html
-v ~/docker-nginx/html:/usr/share/nginx/html \
# 挂载日志目录:宿主机 ./logs -> 容器 /var/log/nginx
-v ~/docker-nginx/logs:/var/log/nginx \
# 赋予容器对挂载目录的读写权限(避免权限问题)
--privileged=true \
nginx
参数说明:
-v 宿主机目录:容器内目录:目录挂载,将宿主机的目录与容器内目录关联。--privileged=true:解决 Linux 系统下容器对宿主机目录的权限不足问题(Windows/macOS 可省略,但加上更兼容)。
步骤 5:验证自定义配置
- 访问自定义首页:打开浏览器输入
http://localhost,此时应看到我们刚才编写的index.html内容(而非 Nginx 默认页)。 - 查看日志:访问后,宿主机的
~/docker-nginx/logs目录下会生成access.log(访问日志)和error.log(错误日志),可通过cat ~/docker-nginx/logs/access.log查看访问记录。 - 修改生效测试:直接修改宿主机
~/docker-nginx/html/index.html的内容,刷新浏览器,页面会立即更新(无需重启容器),说明挂载生效。
四、容器管理:启动、停止、重启与日志查看
部署完成后,我们需要掌握基本的容器管理命令,应对日常维护场景。
1. 容器状态管理
| 需求 | 命令 | 说明 |
|---|---|---|
| 启动已停止的容器 | docker start my-nginx | 基于容器名称启动,也可使用容器 ID |
| 停止运行中的容器 | docker stop my-nginx | 优雅停止(等待进程退出),强制停止用 docker kill |
| 重启容器 | docker restart my-nginx | 停止后重新启动,配置修改后需重启生效 |
| 查看容器详细信息 | docker inspect my-nginx | 输出容器的 IP、挂载、网络等详细配置 |
| 删除已停止的容器 | docker rm my-nginx | 若容器正在运行,需先 stop 再 rm;强制删除用 docker rm -f |
2. 查看 Nginx 日志
除了直接查看宿主机挂载目录下的日志文件,还可以通过 Docker 命令实时查看容器内的日志:
# 实时查看 Nginx 访问日志(-f 表示“跟踪”日志输出)
docker logs -f my-nginx -t --tail 100
参数说明:
-f:实时跟踪日志,类似tail -f。-t:显示日志的时间戳。--tail 100:只显示最后 100 行日志,避免输出过多历史内容。
3. 进入容器内部(调试用)
若需要在容器内部操作(如查看 Nginx 配置、测试命令),可通过 exec 命令进入容器的终端:
# 进入 my-nginx 容器,启动 bash 终端(交互式)
docker exec -it my-nginx /bin/bash
-it:-i保持标准输入打开,-t分配伪终端,两者结合实现“交互式终端”。- 进入容器后,可执行
nginx -t检查 Nginx 配置是否正确,或cat /etc/nginx/nginx.conf查看主配置文件。 - 退出容器终端:输入
exit即可,不会影响容器运行。
五、常见问题与解决方案
在部署过程中,可能会遇到一些问题,这里整理了高频场景的解决方案。
1. 端口被占用:bind: address already in use
报错原因:宿主机的 80 端口已被其他服务(如 Apache、IIS 或其他 Nginx 实例)占用。
解决方案:
- 方案 1:停止占用 80 端口的服务(如 Linux 下停止 Apache:
systemctl stop apache2)。 - 方案 2:修改端口映射,用宿主机的其他端口(如 8080)映射到容器的 80 端口,命令改为:
访问时用docker run -d -p 8080:80 --name my-nginx nginxhttp://localhost:8080。
2. 权限不足:Permission denied
报错原因:Linux 系统下,容器对宿主机挂载目录的读写权限不足。
解决方案:
- 启动容器时添加
--privileged=true参数(如进阶部署中的命令)。 - 或修改宿主机挂载目录的权限,例如:
chmod -R 755 ~/docker-nginx
3. 配置修改后不生效
原因:Nginx 配置修改后,需要重启 Nginx 服务或容器才能生效(静态文件修改无需重启)。
解决方案:
- 方案 1:进入容器,重启 Nginx 服务(无需重启容器):
docker exec my-nginx nginx -s reload - 方案 2:重启整个容器:
docker restart my-nginx
六、总结
本文从基础到进阶,完整覆盖了 Docker 部署 Nginx 的核心流程:从环境准备、1 分钟快速部署,到自定义配置与数据持久化,再到日常容器管理与问题排查。通过 Docker 部署 Nginx,不仅避免了传统部署中“环境不一致”的痛点,还能通过目录挂载实现配置与数据的持久化,大幅提升部署效率与可维护性。
如果需要进一步扩展,还可以结合 Docker Compose 管理多容器应用(如 Nginx + 后端服务 + 数据库),或通过 Docker Swarm/Kubernetes 实现容器的集群部署与自动扩缩容。
若有转载,请标明出处:https://blog.csdn.net/CharlesYuangc/article/details/152914041
5458

被折叠的 条评论
为什么被折叠?



