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.dNginx 子配置目录(虚拟主机、反向代理等)./nginx/conf.d
/usr/share/nginx/htmlNginx 网站根目录(存放 HTML、CSS 等静态文件)./nginx/html
/var/log/nginxNginx 日志目录(访问日志、错误日志)./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:验证自定义配置
  1. 访问自定义首页:打开浏览器输入 http://localhost,此时应看到我们刚才编写的 index.html 内容(而非 Nginx 默认页)。
  2. 查看日志:访问后,宿主机的 ~/docker-nginx/logs 目录下会生成 access.log(访问日志)和 error.log(错误日志),可通过 cat ~/docker-nginx/logs/access.log 查看访问记录。
  3. 修改生效测试:直接修改宿主机 ~/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若容器正在运行,需先 stoprm;强制删除用 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 nginx
    
    访问时用 http://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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

君九@DBA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值