Docker 部署 Nginx 环境

Docker 部署 Nginx 环境(详细实操教程,新手友好)

前言:Nginx 是目前最流行的高性能 Web 服务器,常用于静态资源托管、反向代理、负载均衡等场景;而 Docker 可以实现环境的隔离与快速部署,避免“本地能跑、服务器跑不起来”的问题。本文将从 0 到 1 讲解,如何在 Linux 服务器(CentOS 7)上,使用 Docker 部署 Nginx 环境,步骤详细、命令可直接复制,新手也能轻松上手。

一、部署前准备(必做)

1.1 环境要求

  • 服务器:CentOS 7(阿里云、腾讯云、华为云等云服务器均可,最低配置 1核2G,满足基础部署需求);

  • 系统状态:确保服务器能正常联网(用于下载 Docker 和 Nginx 镜像);

  • 权限:拥有服务器 root 权限(或 sudo 权限),避免执行命令时出现权限不足问题;

  • 工具:本地电脑安装 Xshell(或 Putty),用于远程连接服务器(也可直接使用云服务器自带的远程终端)。

1.2 提前检查服务器状态

远程连接服务器后,先执行以下命令,检查服务器是否已安装 Docker(避免重复安装),以及系统网络是否正常。

1. 检查网络连通性(能 ping 通百度即正常):

ping baidu.com -c 3

说明:-c 3 表示只 ping 3 次,避免一直 ping 占用终端,出现“64 bytes from xxx”即表示网络正常。

2. 检查是否已安装 Docker:

docker -v

结果说明:

  • 若显示类似 “Docker version 24.0.7, build xxx”,说明已安装 Docker,可直接跳至 第二章 拉取 Nginx 镜像

  • 若显示 “command not found”,说明未安装 Docker,需执行 1.3 安装 Docker 步骤。

1.3 安装 Docker(未安装时执行)

全程使用命令行操作,每一步都需等待执行完成(出现 “Complete!” 或类似成功提示即为完成),命令可直接复制粘贴,避免手动输入出错。

1. 安装 Docker 依赖包(yum 工具自带,直接安装即可):

yum install -y yum-utils device-mapper-persistent-data lvm2

说明:-y 表示自动确认安装,无需手动输入 y 确认,节省操作时间。

2. 设置 Docker 镜像源(使用阿里云镜像源,下载速度更快,避免官方源卡顿):

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3. 安装 Docker CE(社区版,免费且足够日常使用):

yum install -y docker-ce docker-ce-cli containerd.io

注意:若出现 “No match for argument: docker-ce” 错误,可先执行 yum clean all 清理缓存,再重新执行该命令。

4. 启动 Docker 服务,并设置开机自启(避免服务器重启后 Docker 失效):

systemctl start docker  # 启动 Docker
systemctl enable docker # 设置开机自启

5. 验证 Docker 是否安装成功:

docker -v

若显示 Docker 版本信息,即为安装成功;若仍提示 command not found,可重启服务器(reboot)后再检查。

二、拉取 Nginx 镜像(核心步骤)

Docker 部署应用的核心是“镜像”,我们需要先从 Docker Hub(官方镜像仓库)拉取 Nginx 官方镜像,建议拉取 稳定版(本文使用 nginx:1.24 稳定版,兼容性好、bug 少)。

2.1 拉取 Nginx 镜像

docker pull nginx:1.24

执行命令后,会自动下载镜像,下载速度取决于服务器带宽,耐心等待即可。

说明:若不指定版本(直接执行 docker pull nginx),会拉取最新版(latest),但最新版可能存在兼容性问题,新手建议指定稳定版。

2.2 验证镜像是否拉取成功

docker images

若输出结果中包含 “nginx”,且标签为 “1.24”,说明镜像拉取成功,类似如下内容:

REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        1.24      xxxxxxxxxxxx   2 weeks ago    187MB

三、启动 Nginx 容器(部署核心)

镜像拉取完成后,需要通过镜像创建并启动 Nginx 容器(容器是镜像的运行实例,相当于“启动 Nginx 服务”)。为了方便后续修改 Nginx 配置、托管静态资源,我们将 容器内的核心目录映射到服务器本地目录(避免进入容器操作,降低难度)。

3.1 创建本地映射目录

在服务器本地创建 3 个目录,分别映射容器内的 Nginx 配置目录、静态资源目录、日志目录,命令如下(一次性执行):

mkdir -p /home/nginx/conf    # 映射 Nginx 配置文件目录
mkdir -p /home/nginx/html    # 映射 Nginx 静态资源目录(用于放网页文件)
mkdir -p /home/nginx/logs    # 映射 Nginx 日志目录(方便查看访问日志、错误日志)

说明:-p 表示递归创建目录,即使上级目录不存在,也会自动创建,避免手动创建多级目录的麻烦。

3.2 复制容器内的默认配置文件到本地

先临时启动一个 Nginx 容器,将容器内的默认配置文件复制到本地映射目录,后续直接修改本地配置文件即可(无需进入容器):

# 临时启动 Nginx 容器(命名为 temp-nginx,仅用于复制配置文件)
docker run --name temp-nginx -d nginx:1.24

# 复制容器内的 nginx.conf 配置文件到本地 /home/nginx/conf 目录
docker cp temp-nginx:/etc/nginx/nginx.conf /home/nginx/conf/

# 复制容器内的 conf.d 目录(虚拟主机配置)到本地 /home/nginx/conf 目录
docker cp temp-nginx:/etc/nginx/conf.d /home/nginx/conf/

# 停止并删除临时容器(配置文件已复制,临时容器无用)
docker stop temp-nginx
docker rm temp-nginx

每一步执行完成后,可进入本地目录检查是否复制成功,例如:

ls /home/nginx/conf

若显示 “nginx.conf conf.d”,说明配置文件复制成功。

3.3 启动正式 Nginx 容器

执行以下命令,启动 Nginx 容器,同时完成本地目录与容器目录的映射,命令较长,可分多行复制(或直接复制完整命令):

docker run -d \
--name nginx \
-p 80:80 \
-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /home/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /home/nginx/html:/usr/share/nginx/html \
-v /home/nginx/logs:/var/log/nginx \
--restart=always \
nginx:1.24

命令参数详解(新手必看,理解参数含义,避免后续出错):

  • -d:后台运行容器(守护进程模式),避免终端关闭后容器停止;

  • --name nginx:给容器命名为 nginx,后续操作(停止、重启)可直接用名称,无需记容器 ID;

  • -p 80:80:端口映射,将服务器的 80 端口(HTTP 默认端口)映射到容器的 80 端口,外部访问服务器 IP 即可访问 Nginx;

  • -v 本地目录:容器目录:目录映射,共 4 个映射,分别对应配置、虚拟主机、静态资源、日志,后续修改本地文件即可同步到容器;

  • --restart=always:设置容器开机自启,服务器重启后,Nginx 容器会自动启动;

  • nginx:1.24:指定使用的镜像名称和版本。

3.4 验证 Nginx 容器是否启动成功

执行以下命令,查看容器运行状态:

docker ps

若输出结果中,NAME 为 nginx,STATUS 为 “Up X minutes”(X 为运行时间),说明容器启动成功;若 STATUS 为 Exited,说明启动失败,需查看日志排查问题(下文有排查方法)。

补充:查看容器启动日志(排查启动失败问题):

docker logs nginx

常见失败原因:端口 80 被占用(可执行 netstat -tuln | grep 80 查看占用端口的进程,停止该进程或修改映射端口即可)。

四、验证部署结果(关键一步)

Nginx 容器启动成功后,我们需要验证是否能正常访问,有两种验证方式,任选一种即可。

4.1 服务器本地验证

在服务器终端执行以下命令,访问本地 Nginx:

curl http://localhost:80

若输出类似以下内容(Nginx 默认欢迎页面的 HTML 代码),说明本地访问正常:

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body { width: 95%; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
</body>
</html>

4.2 外部访问验证(最直观)

在本地电脑的浏览器中,输入 http://服务器公网IP(无需加端口 80,因为 80 是 HTTP 默认端口),若能看到 Nginx 默认欢迎页面(白色背景,黑色文字 “Welcome to nginx!”),说明部署成功!

注意:若无法访问,大概率是服务器防火墙未开放 80 端口,执行以下命令开放 80 端口(CentOS 7 防火墙命令):

firewall-cmd --permanent --add-port=80/tcp  # 永久开放 80 端口
firewall-cmd --reload  # 重新加载防火墙配置,使端口开放生效

若使用的是云服务器(阿里云、腾讯云等),还需在云控制台的“安全组”中,开放 80 端口(入方向),否则外部无法访问。

五、后续常用操作(必记)

部署完成后,后续可能需要重启 Nginx、修改配置、查看日志等,以下是最常用的命令,建议收藏。

5.1 Nginx 容器常用命令

# 停止 Nginx 容器
docker stop nginx

# 启动 Nginx 容器(已停止时)
docker start nginx

# 重启 Nginx 容器(修改配置后需执行,使配置生效)
docker restart nginx

# 查看 Nginx 运行日志(实时查看,按 Ctrl+C 退出)
docker logs -f nginx

# 进入 Nginx 容器内部(特殊情况需操作容器时,一般无需进入)
docker exec -it nginx /bin/bash

5.2 修改 Nginx 配置(最常用)

后续若需修改 Nginx 配置(如托管自己的网页、配置反向代理),直接修改本地映射目录的配置文件即可,步骤如下:

  1. 编辑 Nginx 主配置文件(一般无需修改,主要修改虚拟主机配置): vim /home/nginx/conf/nginx.conf

  2. 编辑虚拟主机配置(最常用,比如配置自己的网站): vim /home/nginx/conf/conf.d/default.conf

  3. 修改完成后,重启 Nginx 容器,使配置生效: docker restart nginx

示例:替换 Nginx 默认首页(托管自己的静态网页):

# 编辑本地静态资源目录下的 index.html 文件
vim /home/nginx/html/index.html

# 输入自己的网页内容(示例),按 Esc 后输入 :wq 保存退出
<!DOCTYPE html>
<html>
<head><title>我的博客</title></head>
<body><h1>Docker + Nginx 部署成功!</h1></body>
</html>

# 重启 Nginx 容器
docker restart nginx

此时再访问服务器公网 IP,就能看到自己修改的网页内容了。

5.3 查看 Nginx 访问日志

日志映射在本地 /home/nginx/logs 目录,常用命令:

# 查看访问日志(记录所有访问请求)
cat /home/nginx/logs/access.log

# 实时查看访问日志(按 Ctrl+C 退出)
tail -f /home/nginx/logs/access.log

# 查看错误日志(排查访问失败、配置错误等问题)
cat /home/nginx/logs/error.log

六、常见问题排查(新手必看)

问题1:Docker 启动失败,提示 “Job for docker.service failed because the control process exited with error code”

解决方法:执行 systemctl status docker 查看错误原因,最常见的是“端口被占用”或“镜像损坏”,可尝试重启 Docker 服务:systemctl restart docker,若仍失败,卸载 Docker 后重新安装。

问题2:Nginx 容器启动成功,但外部无法访问

解决步骤:

  1. 检查服务器防火墙是否开放 80 端口(执行 firewall-cmd --list-ports,若没有 80/tcp,重新执行开放端口命令);

  2. 检查云服务器安全组是否开放 80 端口(登录云控制台,找到安全组,添加入方向规则,端口 80,允许所有 IP 访问);

  3. 检查容器端口映射是否正确(执行 docker ps,查看 PORTS 列是否为 0.0.0.0:80->80/tcp);

  4. 检查 Nginx 是否正常运行(执行 docker logs nginx,查看是否有错误日志)。

问题3:修改 Nginx 配置后,重启容器仍不生效

解决方法:

  • 检查配置文件是否修改正确(避免语法错误,比如少写分号、括号不匹配);

  • 检查本地配置文件是否映射正确(确保修改的是 /home/nginx/conf 目录下的文件,而非容器内的文件);

  • 重启容器后,执行 docker exec nginx nginx -t,检查 Nginx 配置语法是否正确,若有错误,根据提示修改。

七、总结

本文通过 Docker 部署 Nginx 环境,全程采用“命令复制+步骤拆解”的方式,覆盖了从环境准备、Docker 安装、镜像拉取、容器启动,到验证部署、常用操作、问题排查的全流程,新手只需跟着步骤一步步执行,就能完成部署。

后续可基于此环境,实现静态博客托管、反向代理(如代理后端接口)、负载均衡等功能,后续会继续更新相关实操教程,关注我的博客,获取更多干货~