在现代Web架构中,Nginx和Docker的组合已经成为企业开发运维的核心选择。Nginx作为高性能反向代理服务器与负载均衡器,在 Web应用中起着至关重要的作用。而Docker容器技术则极大地简化了应用的部署流程,使得系统具备高度的可移植性与弹性。接下来我们将深入探讨Nginx如何与Docker融合使用,帮助运维人员与开发者构建高性能的微服务架构。
一、为什么要将Nginx与Docker结合?
在传统部署方式中,Nginx需要在物理机或虚拟机上单独配置,运维成本高且不易迁移。而通过Docker部署 Nginx,则可以实现快速构建与部署,使用Dockerfile一键生成带有特定配置的Ngin 镜像。并且隔离性强,每个容器互相独立,可以避免配置冲突。Nginx与Docker的结合并非仅为部署“简化”,更是为构建现代微服务架构打下基础。
二、基础准备:环境与依赖
在开始结合之前,确保环境中Docker引擎版本 ≥ 20.x,安装Docker Compose用于编排多个容器,熟悉基本的Nginx配置语法,配置好DNS域名用于绑定Nginx,若使用Linux环境,请确保开启防火墙端口(如80、443),并具备root或sudo权限。
三、使用Nginx官方镜像构建容器
Nginx官方已在Docker Hub提供镜像,我们可以基于该镜像快速构建服务。
1 创建项目结构
mkdir nginx-docker
cd nginx-docker
mkdir conf html logs
2. 编写 nginx.conf 配置
在 conf/ 目录下创建 nginx.conf:
events {}
http {
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html;
}
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
}
}
3. 创建 index.html
在 html/ 目录中添加简单的网页内容:
<!DOCTYPE html>
<html>
<head><title>Nginx in Docker</title></head>
<body><h1>Welcome to Dockerized Nginx!</h1></body>
</html>
4. 编写 Dockerfile(可选)
如需构建自定义镜像:
FROM nginx:stable
COPY conf/nginx.conf /etc/nginx/nginx.conf
COPY html/ /usr/share/nginx/html/
构建镜像:
docker build -t my-nginx .
也可以直接使用 Nginx 镜像挂载配置和代码:
docker run -d -p 80:80 \
--name nginx-container \
-v $(pwd)/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $(pwd)/html:/usr/share/nginx/html \
-v $(pwd)/logs:/var/log/nginx \
nginx:stable
访问 http://localhost 即可看到页面。
四、Nginx作为反向代理服务其他容器
在微服务架构中,Nginx 常被用作容器间服务的入口。例如,一个后端 API 容器运行在端口 5000,Nginx 将其代理到 /api 路径。
示例:反向代理 Flask 应用容器
1.创建 Flask 服务:
# app.py
from flask import Flask
app = Flask(__name__)
@app.route("/hello")
def hello():
return "Hello from Flask inside Docker!"
2.编写 Flask 的 Dockerfile:
FROM python:3.9
WORKDIR /app
COPY app.py .
RUN pip install flask
CMD ["python", "app.py"]
3.构建并运行:
docker build -t flask-api .
docker run -d --name flask-container -p 5000:5000 flask-api
4.修改 Nginx 配置:
http {
upstream flask_backend {
server host.docker.internal:5000; # Windows/Mac用此,Linux用容器IP
}
server {
listen 80;
server_name localhost;
location /api/ {
proxy_pass http://flask_backend/;
}
}
}
挂载后重新运行 Nginx 容器,即可通过 http://localhost/api/hello 访问 Flask 接口。
五、使用Docker Compose 编排 Nginx 与服务容器
为了统一管理多个容器,可以使用 docker-compose.yml 来协同启动。
1. 编写 docker-compose.yml
version: '3'
services:
web:
build: .
container_name: nginx-server
ports:
- "80:80"
volumes:
- ./conf/nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
api:
build:
context: ./flask
container_name: flask-backend
ports:
- "5000:5000"
注意 flask/ 目录中需有 Flask 的代码和 Dockerfile。
2. 启动服务
docker-compose up -d
Nginx 与 Flask 会同时被启动,且自动联网。在 nginx.conf 中配置:
proxy_pass http://api:5000/;
即可通过容器名通信。
七、常见问题与优化建议
1 容器间网络不通?
请确认容器是否处于同一 Docker 网络中,可使用:
docker network ls
docker network inspect bridge
必要时添加:
networks:
default:
driver: bridge
2. 日志无法查看?
确保挂载了 /var/log/nginx,并在宿主机查看对应日志:
tail -f logs/access.log
3. 如何限制客户端访问速率?
Nginx 支持 limit_req_zone 设置流量限制,适用于防爬虫与 API 限速。
