看不懂 Dockerfile 和 nginx.conf,这篇帮你彻底打通.
目录
1 在当前项目的根目录之下创建一个名为Dockerfile文件(没有后缀名)
一 Dockerfile
1 Docker基础概念请看另一篇文章
环境配置到头秃?是时候用 Docker 拯救你的发际线了_docker怎么玩-CSDN博客
常见命令介绍:
- 启动Docker sudo systemctl start docker
- 拉取镜像 docker pull <镜像名:标签版本>
- 查看镜像 docker images
- 强制删除镜像 docker rmi -f <镜像id/名称>
- 启动容器 docker run -d --name <容器名> -p 宿主机端口:容器端口 镜像名
- 查看所有容器 docker ps -a
- 删除容器 docker rm <容器id/名称>
- 查看容器日志 docker logs <容器id/名称>
- 停止容器 docker stop <容器id/名称>
- 推送镜像 docker push <镜像名:标签版本>
- 容器生成镜像 docker commit 参数 docker build 参数
- 镜像保存tar包 docker save 参数
- .tar包构建成本地镜像 docker load 参数
- 开启已经存在的容器 docker start <容器id/名称>
2 Dockerfile
概念:一次编写,到处构建,代替传统的手动打包镜像。
Dockerfile:告诉Docker如何把jar包和运行环境打包成一个镜像。
比如说现在有一个场景:借助Dockerfile以及Docker技术去构建一个SpringBoot的后端服务。
步骤:
1 在当前项目的根目录之下创建一个名为Dockerfile文件(没有后缀名)
2 编写Dockerfile内容:
# 1. 选一个基础环境:我要用Java 17的运行环境(Docker会自动从网上下载这个基础镜像)
FROM openjdk:17-jdk-alpine
# 2. 在容器里创建一个工作目录,所有后续操作都在这里面做
WORKDIR /app
# 3. 把本地target文件夹里的jar包,复制到容器的/app目录下,改名叫app.jar
COPY target/myapp-1.0.0.jar app.jar
# 4. 告诉Docker这个容器会监听8080端口(只是声明,方便别人看)
EXPOSE 8080
# 5. 容器启动时默认执行的命令:就是你平时运行jar包的命令
CMD ["java", "-jar", "app.jar"]
3 借助Dockerfile构建镜像
项目根目录之下借助
docker build -t myapp:1.0 .
Docker会自动寻找当前目录下名为Dockerfile的文件并执行他(最后的.表示在当前的目录下)
# 构建开发环境镜像
docker build -f Dockerfile.dev -t myapp:dev .
# 构建生产环境镜像
docker build -f Dockerfile.prod -t myapp:1.0.0 .
# 构建测试环境镜像
docker build -f Dockerfile.test -t myapp:test .
也可以指定
docker build -f <Dockerfile路径> -t <镜像名:标签> <构建上下文路径>
docker build |
构建镜像的命令 |
-f ./docker/Dockerfile |
指定使用的 Dockerfile 路径(相对于当前目录) |
-t myapp:v1.0 |
给构建出的镜像命名为 myapp,标签为 v1.0 |
. |
构建上下文路径为当前目录(即 /home/user/myapp) |
cd /home/user/myapp
docker build -f ./docker/Dockerfile -t myapp:v1.0 .
Docker会去自动下载基础的镜像,然后复制jar包,执行指令,最后生成一个名为myapp:v1.0的镜像。
4 借助镜像去创建并启动容器
执行命令:
docker run -p 8080:8080 myapp:1.0
总体概括一下整体的流程:
你在本地写完代码 → 用 Maven 打成 jar 包 → 写个 Dockerfile 告诉 Docker 怎么打包镜像 → 执行
docker build生成镜像 → 执行docker run启动容器 → 浏览器访问应用。
二 Nginx
Nginx:一个超高性能的Web后端服务器,并且还具有反向代理,负载均衡的策略。
1 目录结构:
|
目录 / 文件 |
作用说明 |
备注 |
|
|
存放 Nginx 的配置文件 |
核心目录,主要修改 |
|
|
辅助工具脚本 |
一般不用修改 |
|
|
Nginx 官方帮助文档 |
查阅使用 |
|
|
存放前端静态网站 |
Vue 打包后的 |
|
|
日志目录 |
存放访问日志、错误日志,启动后自动生成 |
|
|
临时文件目录 |
自动读写,无需手动管理 |
|
|
Nginx 可执行程序 |
必须在 Nginx 根目录下执行 |
2 Nginx命令
注意:必须在Nginx的根目录之下去执行。
|
命令 |
作用 |
使用场景 |
|
|
启动 Nginx 服务 |
首次启动 |
|
|
缓慢关闭 |
推荐正常停止 |
|
|
强制停止 |
紧急停止 |
|
|
重载配置文件 |
改完配置后执行,不中断服务 |
|
|
校验配置文件语法 |
改完配置先执行,检查是否正确 |
3 nginx.conf
整体的大致结构:
main(全局块,最外层)
├── events 块(网络连接模型)
└── http 块(Web服务总容器)
├── http 全局指令
├── upstream 块(负载均衡组)
└── server 块(虚拟主机,可多个)
├── server 全局指令
└── location 块(路径匹配,可多个)
└── 嵌套 location(极少用)
1 main全局块
对整个Nginx服务全局生效
| 配置项 | 示例值 | 说明 |
|---|---|---|
worker_processes |
1 / auto |
工作进程数量,主进程负责管理,worker 进程真正处理请求; 生产环境建议设为 CPU 核心数或 |
error_log |
logs/error.log warn |
全局错误日志路径与级别,也可在 http/server/location 层单独配置 |
pid |
logs/nginx.pid |
主进程 PID 文件路径 |
user |
nginx nginx |
运行 Nginx 的用户 / 用户组,Windows 下无效 |
worker_rlimit_nofile |
65535 |
单个 worker 进程最大文件句柄数,生产调优时使用,默认一般够用 |
2 events事件块
配置Nginx与客户端的网络连接底层模型。
| 配置项 | 示例值 | 说明 |
|---|---|---|
worker_connections |
1024 |
单个 worker 进程最大并发连接数,核心并发参数。 |
use epoll |
epoll |
指定事件驱动模型,Linux 下默认 epoll 性能最优; Windows 下不支持 epoll,默认使用 select,写了也不生效 |
multi_accept |
on |
是否允许 worker 一次性接收多个新连接,默认 off,一般保持默认 |
accept_mutex |
off |
连接互斥锁;on 时进程轮流接连接,off 时一起抢连接; 高版本 Nginx 默认 off,性能更优 |
3 http块
所有HTTP服务的全局配置,里面可以嵌套多个server虚拟主机,是配置最复杂的一块。
| 配置项 | 示例值 | 说明 |
|---|---|---|
include mime.types |
- | 引入 MIME 类型映射文件,让 Nginx 能识别不同文件类型 |
default_type |
application/octet-stream |
无法识别文件类型时的默认类型,触发浏览器下载 |
sendfile |
on |
开启高效文件传输模式,大幅提升静态文件性能,必开 |
keepalive_timeout |
65 |
长连接超时时间(秒),减少握手开销 |
access_log |
logs/access.log main |
访问日志路径与格式;可在 server/location 层单独关闭或重定义 |
tcp_nopush |
on |
配合 sendfile 使用,优化网络包传输,一般默认开启 |
tcp_nodelay |
on |
关闭 Nagle 算法,降低小报文延迟,高并发场景调优用 |
client_header_timeout |
60s |
读取请求头超时,一般保持默认 |
1 server块
虚拟主机块,位于http内部;每一个server对应着一个虚拟站点。借助listen+server_name区分
| 配置项 | 示例值 | 说明 |
|---|---|---|
listen |
80 / 443 ssl |
监听端口;HTTP 默认 80,HTTPS 需加 |
server_name |
localhost / shturl. |
站点域名 / IP;支持精确匹配、通配符、正则,Nginx 会按优先级匹配 |
root |
html |
站点静态资源根目录;也可写在 location 层,就近生效 |
client_max_body_size |
20m |
客户端请求体最大限制,即上传文件大小上限; 接口上传报错 413 时,优先调大此值 |
error_page |
404 /404.html |
自定义错误页,开发中一般由前端处理,后端场景用得少 |
index |
index.html index.htm |
默认首页文件;通常写在 location / 中更清晰 |
动静分离:就是以/开头的去找前端的静态页面,以/api/开头的就去寻找对应的后端服务。
对于Vue的项目,Nginx会进行路由,会路由到指定的文件夹当中,但是如果没有找到,就会路由到index.html兜底处理,进入Vue页面组件的渲染操作。
1 location /
2 location /api/
2 location块 /
URL匹配规则:处理前端静态资源。去指定的目录下去寻找和Url对应的文件,找到直接将其返回给浏览器,找不到就fallback到index.html当中,路由交给Vue前端自己处理。
| 配置项 | 示例值 | 说明 |
|---|---|---|
| root | D:/xxx/dist | 静态资源根目录,最终文件路径 = root 值 + 请求 URL |
| index | index.html index.htm | 默认首页文件,按顺序优先匹配 |
| try_files | $uri $uri/ /index.html | 按顺序尝试:匹配文件 → 匹配目录首页 → 最终回退到 index.html;单页应用必配 |
# 配置静态资源路径,指向Vue项目构建后的dist目录
location / {
root D:/shixun/javaee/xiangmu/xsglq/dist;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
3 location /api/
反向代理后端接口,匹配所有以/api/开头的请求,把这类请求转发给后端的Java服务。
价值点:浏览器访问的是 Nginx 的同域名同端口,所有
/api/xxx接口都由 Nginx 代为转发,天然解决了跨域问题。
| 配置项 | 示例值 | 说明 |
|---|---|---|
| proxy_pass | http://127.0.0.1:8081 | 后端服务目标地址;末尾斜杠影响路径拼接:带/则剔除/api/前缀转发,不带则完整拼接 |
| proxy_set_header | Host $host | 透传原始请求域名 |
| proxy_set_header | X-Real-IP $remote_addr | 透传客户端真实 IP |
| proxy_set_header | X-Forwarded-For $proxy_add_x_forwarded_for | 全链路 IP 追溯 |
| proxy_set_header | X-Forwarded-Proto $scheme | 透传原始请求协议(http/https) |
| proxy_connect_timeout | 30s | Nginx 与后端建立连接的超时时间 |
| proxy_read_timeout | 30s | Nginx 等待后端响应的超时时间,慢接口场景需调大 |
示例代码:
worker_processes auto;
error_log logs/error.log warn;
pid logs/nginx.pid;
worker_rlimit_nofile 65535;
events {
worker_connections 1024;
use epoll;
accept_mutex off;
multi_accept off;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
access_log logs/access.log combined;
server {
listen 80;
server_name localhost;
client_max_body_size 20m;
location / {
root D:/shixun/javaee/xiangmu/xsglq/dist;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://127.0.0.1:8081/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 30s;
proxy_read_timeout 30s;
}
}
}
示例代码2
# ====================== main 全局块 ======================
# 对整个Nginx服务全局生效,控制核心运行参数
# 工作进程数量:auto 自动匹配CPU核心数,生产环境推荐
# 主进程仅负责管理,worker 进程真正处理用户请求
worker_processes auto;
# 全局错误日志:路径 + 日志级别(warn/error/info/debug)
# 也可在 http/server/location 层单独配置,就近生效
error_log logs/error.log warn;
# 主进程 PID 文件路径,用于进程启停管理
pid logs/nginx.pid;
# 单个 worker 进程最大文件句柄数,生产环境调优参数
# 提升并发下的文件打开能力,默认值一般够用
worker_rlimit_nofile 65535;
# ====================== events 事件块 ======================
# 配置Nginx与客户端的网络连接底层模型,直接影响并发性能
events {
# 单个 worker 进程最大并发连接数,核心并发参数
worker_connections 1024;
# 事件驱动模型:Linux 下 epoll 性能最优
# Windows 不支持 epoll,自动使用 select,写了也不生效
use epoll;
# 连接互斥锁:off 时多个 worker 同时争抢连接
# 高版本 Nginx 默认关闭,性能更优
accept_mutex off;
# 是否允许 worker 一次性接收多个新连接
# 默认关闭,一般保持默认即可
multi_accept off;
}
# ====================== http 服务块 ======================
# 所有HTTP服务的总容器,可嵌套多个 server 虚拟主机
http {
# 引入 MIME 类型映射文件,让Nginx识别不同后缀的文件类型
include mime.types;
# 无法识别文件类型时的默认类型,会触发浏览器下载行为
default_type application/octet-stream;
# 开启高效文件传输模式,大幅提升静态资源响应性能,静态站点必开
sendfile on;
# 配合 sendfile 使用,优化网络包传输,减少网络IO次数
tcp_nopush on;
# 关闭 Nagle 算法,降低小报文传输延迟,高并发低延迟场景推荐开启
tcp_nodelay on;
# 长连接超时时间(秒),复用TCP连接减少握手开销,超时后自动断开
keepalive_timeout 65;
# 访问日志:路径 + 日志格式
# 可在 server/location 层单独关闭或重定义
access_log logs/access.log combined;
# ====================== server 虚拟主机块 ======================
# 一个 server 对应一个虚拟站点,通过 监听端口 + 域名 区分
server {
# 监听端口,HTTP 默认 80;HTTPS 需改为 443 并添加 ssl 关键字
listen 80;
# 站点域名/IP,支持精确匹配、通配符、正则,Nginx 按优先级匹配
server_name localhost;
# 客户端请求体最大限制,即上传文件大小上限
# 文件上传报错 413 时,优先调大此值
client_max_body_size 20m;
# ====================== location / 静态资源块 ======================
# 匹配根路径所有请求,处理 Vue/React 单页应用静态资源
location / {
# 静态资源根目录,最终文件路径 = root 值 + 请求 URL
root D:/shixun/javaee/xiangmu/xsglq/dist;
# 默认首页文件,按顺序查找,找到第一个即返回
index index.html index.htm;
# 按顺序尝试匹配资源:文件 → 目录首页 → 最终回退到 index.html
# 单页应用必配,解决前端路由页面刷新 404 问题
try_files $uri $uri/ /index.html;
}
# ====================== location /api/ 反向代理块 ======================
# 匹配所有以 /api/ 开头的请求,转发至后端 Java 服务
location /api/ {
# 反向代理目标地址;末尾带 / 会剔除 /api/ 前缀再转发
# 若不带 /,则会将 /api/ 完整拼接到目标地址后,是开发高频踩坑点
proxy_pass http://127.0.0.1:8081/;
# 透传原始请求域名,避免后端获取不到正确的站点域名
proxy_set_header Host $host;
# 透传客户端真实 IP,后端可通过此头获取用户真实地址
proxy_set_header X-Real-IP $remote_addr;
# 全链路 IP 追溯,记录请求经过的所有代理节点 IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 透传原始请求协议(http/https),后端可识别用户访问协议
proxy_set_header X-Forwarded-Proto $scheme;
# Nginx 与后端建立连接的超时时间
proxy_connect_timeout 30s;
# Nginx 等待后端响应的超时时间,慢接口场景需适当调大
proxy_read_timeout 30s;
}
}
}
更多推荐




所有评论(0)