從入門(mén)到生產(chǎn)級(jí)配置詳解Docker部署Nginx的實(shí)戰(zhàn)指南
1. 引言
Nginx 作為高性能的 HTTP 服務(wù)器和反向代理服務(wù)器,在 Web 架構(gòu)中占據(jù)著核心地位。傳統(tǒng)部署方式需要手動(dòng)安裝、配置環(huán)境、管理進(jìn)程,而 Docker 容器化部署則將這些復(fù)雜性封裝起來(lái),讓我們能夠快速啟動(dòng)、隔離運(yùn)行、輕松遷移。
本文將帶你從零開(kāi)始,掌握 Docker 部署 Nginx 的全流程:
- 快速啟動(dòng) Nginx 容器并驗(yàn)證
- 深入理解 Nginx 配置文件結(jié)構(gòu)
- 掛載自定義配置、靜態(tài)文件、日志
- 配置靜態(tài)站點(diǎn)、反向代理、負(fù)載均衡
- 使用 Docker Compose 編排完整服務(wù)棧
- 生產(chǎn)環(huán)境優(yōu)化與常見(jiàn)問(wèn)題排查
2. 快速部署:第一個(gè) Nginx 容器
2.1 拉取鏡像并運(yùn)行
# 拉取官方最新鏡像 docker pull nginx # 運(yùn)行容器,映射端口 80 docker run -d --name my-nginx -p 80:80 nginx
參數(shù)說(shuō)明:
-d:后臺(tái)運(yùn)行--name my-nginx:指定容器名-p 80:80:將宿主機(jī) 80 端口映射到容器 80 端口
2.2 驗(yàn)證訪問(wèn)
打開(kāi)瀏覽器訪問(wèn) http://localhost,應(yīng)看到 Nginx 歡迎頁(yè)面?;蛘呤褂?curl:
curl http://localhost
3. Nginx 配置文件結(jié)構(gòu)概述
在深入自定義配置之前,先了解 Nginx 的配置文件體系:

核心要點(diǎn):
nginx.conf是主配置文件,定義全局、事件、http 塊。http塊內(nèi)通常包含include conf.d/*.conf;,將具體站點(diǎn)配置分離。- 每個(gè)站點(diǎn)(虛擬主機(jī))對(duì)應(yīng)一個(gè)
server塊,定義監(jiān)聽(tīng)端口、域名、路由規(guī)則。
Docker 官方鏡像的默認(rèn)配置文件位于容器內(nèi) /etc/nginx/nginx.conf,它已經(jīng)包含了 include /etc/nginx/conf.d/*.conf;。因此我們只需在 conf.d 目錄下添加自定義 *.conf 文件即可擴(kuò)展配置。
4. 自定義配置:掛載文件與目錄
Docker 部署的核心思想:將配置和靜態(tài)文件放在宿主機(jī),通過(guò)掛載覆蓋容器內(nèi)的對(duì)應(yīng)路徑。
4.1 準(zhǔn)備宿主機(jī)目錄結(jié)構(gòu)
假設(shè)我們?cè)谒拗鳈C(jī)上創(chuàng)建如下目錄:
~/nginx/
├── conf.d/
│ └── my-site.conf
├── html/
│ └── index.html
├── logs/
└── nginx.conf (可選,一般不覆蓋主配置)
4.2 編寫(xiě)自定義 server 配置
創(chuàng)建 ~/nginx/conf.d/my-site.conf:
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
# 錯(cuò)誤頁(yè)面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
4.3 啟動(dòng)容器并掛載
docker run -d --name my-nginx \ -p 80:80 \ -v ~/nginx/conf.d:/etc/nginx/conf.d \ -v ~/nginx/html:/usr/share/nginx/html \ -v ~/nginx/logs:/var/log/nginx \ nginx
-v ~/nginx/conf.d:/etc/nginx/conf.d:覆蓋默認(rèn)的 conf.d 目錄,里面可以放多個(gè).conf文件。-v ~/nginx/html:/usr/share/nginx/html:掛載靜態(tài)文件目錄。-v ~/nginx/logs:/var/log/nginx:掛載日志目錄,方便查看訪問(wèn)和錯(cuò)誤日志。
4.4 驗(yàn)證自定義頁(yè)面
在 ~/nginx/html/index.html 中寫(xiě)入:
<h1>Hello from Docker Nginx!</h1>
刷新瀏覽器,即可看到自定義內(nèi)容。
5. 進(jìn)階配置:反向代理與負(fù)載均衡
Nginx 最常見(jiàn)的用途是作為反向代理,將請(qǐng)求轉(zhuǎn)發(fā)給后端服務(wù)(如 Spring Boot、Node.js)。
5.1 反向代理配置示例
修改 ~/nginx/conf.d/my-site.conf:
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://host.docker.internal:8080; # 轉(zhuǎn)發(fā)到宿主機(jī) 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;
}
}
注意:在 Linux 容器中訪問(wèn)宿主機(jī)服務(wù),可以使用 host.docker.internal(Docker 18.03+),或者使用宿主機(jī)的實(shí)際 IP。
5.2 負(fù)載均衡配置
使用 upstream 定義后端服務(wù)器組:
upstream backend {
server backend1:8080 weight=3;
server backend2:8080;
server backend3:8080 backup;
}
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
}
}
weight 表示權(quán)重,backup 表示備用服務(wù)器。
6. Docker Compose 一站式部署
當(dāng) Nginx 作為前端網(wǎng)關(guān),需要與后端服務(wù)(如 API、數(shù)據(jù)庫(kù))配合時(shí),使用 Docker Compose 可以一鍵啟動(dòng)整個(gè)棧。
6.1 示例:Nginx + 兩個(gè)后端服務(wù)
創(chuàng)建 docker-compose.yml:
version: '3.8'
services:
nginx:
image: nginx:latest
container_name: nginx
ports:
- "80:80"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/html:/usr/share/nginx/html
- ./nginx/logs:/var/log/nginx
depends_on:
- backend1
- backend2
networks:
- app-network
backend1:
image: your-backend:latest # 替換為實(shí)際后端鏡像
environment:
- PORT=8080
networks:
- app-network
backend2:
image: your-backend:latest
environment:
- PORT=8080
networks:
- app-network
networks:
app-network:
driver: bridge6.2 Nginx 配置文件(使用服務(wù)名)
在 nginx/conf.d/default.conf 中:
upstream backend {
server backend1:8080;
server backend2:8080;
}
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
}
}
關(guān)鍵點(diǎn):Docker Compose 會(huì)自動(dòng)為服務(wù)創(chuàng)建網(wǎng)絡(luò)別名,因此可以直接用服務(wù)名 backend1 作為主機(jī)名。
6.3 啟動(dòng)
docker-compose up -d
7. 生產(chǎn)環(huán)境優(yōu)化與安全
7.1 限制 CPU 和內(nèi)存
docker run -d --name nginx \ --cpus="0.5" \ --memory="512m" \ -p 80:80 \ nginx
或在 Compose 中:
services:
nginx:
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M7.2 配置 HTTPS(SSL)
將證書(shū)文件放在宿主機(jī)目錄,例如 ~/nginx/certs/。
掛載證書(shū)目錄:
-v ~/nginx/certs:/etc/nginx/certs
修改配置文件,添加 SSL 監(jiān)聽(tīng)和證書(shū)路徑:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/certs/example.crt;
ssl_certificate_key /etc/nginx/certs/example.key;
# ... 其他配置
}
7.3 日志輪轉(zhuǎn)
容器內(nèi) Nginx 日志輸出到 /var/log/nginx,掛載到宿主機(jī)后,可以使用宿主機(jī)的 logrotate 進(jìn)行輪轉(zhuǎn)。或者配置 Nginx 直接輸出到 stdout/stderr,由 Docker 日志驅(qū)動(dòng)管理:
access_log /dev/stdout; error_log /dev/stderr;
這樣 docker logs nginx 就能看到日志。
7.4 健康檢查
在 docker-compose.yml 中添加:
services:
nginx:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 38. 常見(jiàn)問(wèn)題排查
| 問(wèn)題 | 原因 | 解決方案 |
|---|---|---|
| 訪問(wèn) Nginx 得到 403 Forbidden | 靜態(tài)文件目錄權(quán)限不足 | 確保宿主機(jī)掛載目錄有讀取權(quán)限,或使用 -u 指定用戶(hù) |
| 修改配置后不生效 | 容器未重載配置 | docker exec nginx nginx -s reload |
| 端口被占用 | 宿主機(jī) 80 端口已被其他進(jìn)程占用 | 更換映射端口,如 -p 8080:80 |
容器內(nèi)無(wú)法解析 host.docker.internal | Docker 版本過(guò)低或未啟用 | 升級(jí) Docker,或在 Linux 下使用 --add-host host.docker.internal:host-gateway |
| 反向代理到后端服務(wù)返回 502 | 后端服務(wù)未啟動(dòng)或網(wǎng)絡(luò)不通 | 檢查后端容器是否運(yùn)行,是否在同一網(wǎng)絡(luò) |
9. 部署流程全景圖

10. 總結(jié)與最佳實(shí)踐
通過(guò) Docker 部署 Nginx,我們獲得了:
- 環(huán)境一致性:開(kāi)發(fā)、測(cè)試、生產(chǎn)使用相同的鏡像和配置。
- 快速擴(kuò)展:通過(guò) Compose 或 Swarm 輕松增加實(shí)例。
- 隔離性:配置和日志掛載到宿主機(jī),方便管理。
最佳實(shí)踐總結(jié):
- 永遠(yuǎn)使用官方鏡像,并指定版本標(biāo)簽(如
nginx:1.26)避免意外升級(jí)。 - 將配置文件分離到
conf.d目錄,保持主配置干凈。 - 靜態(tài)文件、配置、日志均通過(guò)卷掛載,實(shí)現(xiàn)持久化和熱更新。
- 生產(chǎn)環(huán)境啟用 HTTPS 和資源限制。
- 使用
nginx -s reload熱加載配置,無(wú)需重啟容器。 - 配合 Docker Compose 管理多容器依賴(lài),使用服務(wù)名進(jìn)行內(nèi)部通信。
以上就是從入門(mén)到生產(chǎn)級(jí)配置詳解Docker部署Nginx的實(shí)戰(zhàn)指南的詳細(xì)內(nèi)容,更多關(guān)于Docker部署Nginx的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
docker pull鏡像報(bào)錯(cuò):‘invalid checksum digest 
鏡像推送/拉取報(bào)錯(cuò),排查發(fā)現(xiàn)倉(cāng)庫(kù)正常但Docker默認(rèn)連接443端口,配置了安全連接,最終因宿主機(jī)443端口被占用,停掉沖突服務(wù)后問(wèn)題解決2025-08-08
docker離線安裝社區(qū)版(docker-18.06.3-ce)
在一些特定的環(huán)境下,由于網(wǎng)絡(luò)限制或者其他原因,我們可能需要在Linux系統(tǒng)上進(jìn)行離線安裝Docker,本文就來(lái)介紹一下docker離線安裝社區(qū)版,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
docker-compose部署zk+kafka+storm集群的實(shí)現(xiàn)
這篇文章主要介紹了docker-compose部署zk+kafka+storm集群,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
docker+gitlab+gitlab-runner部署詳解
這篇文章主要介紹了docker+gitlab+gitlab-runner部署詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
docker清理大殺器/docker的overlay文件占用磁盤(pán)太大的解決
這篇文章主要介紹了docker清理大殺器/docker的overlay文件占用磁盤(pán)太大的解決操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11
Win10系統(tǒng)使用docker部署ragflow的實(shí)現(xiàn)
本文主要介紹了Win10系統(tǒng)使用docker部署ragflow的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-05-05
harbor切換主機(jī),ip地址改變,需要對(duì)應(yīng)的修改harbor配置實(shí)踐
文章講述了在切換主機(jī)IP地址后,需要修改Harbor配置文件以避免出現(xiàn)連接錯(cuò)誤,錯(cuò)誤的原因是Harbor的IP地址沒(méi)有更新,需要從舊IP(192.168.1.110)改為新IP(192.168.1.111),解決方法是編輯harbor.cfg文件并保存更改2026-03-03
關(guān)于docker中?WSL?配置與修改問(wèn)題
這篇文章主要介紹了docker中?WSL?配置與修改,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12

