Cloudflare 管流量,Docker 管应用:一文讲透两者区别与实战源码
Cloudflare 和 Docker 的区别|附源码
在现代 Web 开发、云原生部署和运维体系中,Cloudflare 与 Docker 都是非常常见的技术名词。很多初学者第一次接触它们时,容易把二者混在一起:Cloudflare 能加速网站、保护网站,Docker 能部署服务、运行应用,它们好像都和“上线项目”有关。
但实际上,Cloudflare 和 Docker 属于完全不同层面的技术。
简单来说:
Cloudflare 更偏向于网络层、边缘计算、安全防护和流量入口;Docker 更偏向于应用运行环境、容器化部署和服务交付。
如果把一个网站比作一家餐厅,那么:
- Docker 像是餐厅的厨房标准化系统:规定厨具、食材、环境、烹饪流程,让这家餐厅无论搬到哪里都能做出一样的菜。
- Cloudflare 像是餐厅门口的安保、导航、排队系统和外卖中转站:帮助客人更快找到餐厅,挡住恶意闹事者,并把请求分发到最近的服务点。
本文将从概念、功能、使用场景、部署方式、源码示例等多个角度,系统讲清楚 Cloudflare 和 Docker 的区别,并附上可运行的示例代码。
一、Cloudflare 是什么?
Cloudflare 是一家提供全球网络服务的平台,核心能力包括:
- CDN 内容分发网络
- DNS 域名解析
- DDoS 防护
- WAF Web 应用防火墙
- SSL/TLS 证书
- 反向代理
- 零信任访问
- Cloudflare Workers 边缘函数
- Cloudflare Tunnel 内网穿透
- R2 对象存储
- Pages 静态网站部署
从技术定位上看,Cloudflare 更多工作在 网络入口层 和 边缘节点层。
当用户访问你的网站时,流程通常是:
用户浏览器
↓
Cloudflare 全球边缘节点
↓
你的源站服务器
↓
你的应用程序
也就是说,Cloudflare 通常站在用户和服务器之间,负责接收用户请求、缓存静态资源、过滤恶意流量、转发请求到源站。
二、Docker 是什么?
Docker 是一个容器化平台,主要用于打包、分发和运行应用程序。
传统部署项目时,经常会遇到这些问题:
- 本地能运行,服务器不能运行;
- 开发环境 Node.js 是 18,服务器是 16;
- 服务器缺少依赖库;
- 多个项目依赖版本冲突;
- 迁移服务器时部署过程复杂。
Docker 通过容器解决这些问题。你可以把应用程序、运行时、依赖、环境变量等统一打包成一个镜像,然后在任何支持 Docker 的机器上运行。
Docker 的典型工作流程是:
编写代码
↓
编写 Dockerfile
↓
构建 Docker 镜像
↓
运行 Docker 容器
↓
对外提供服务
Docker 更关注的是:应用如何稳定、可重复、标准化地运行。
三、Cloudflare 和 Docker 的核心区别
下面通过表格直观对比二者:
| 对比项 | Cloudflare | Docker |
|---|---|---|
| 技术定位 | 网络服务平台、CDN、安全防护、边缘计算 | 容器化平台、应用运行环境 |
| 主要作用 | 加速访问、防护攻击、管理流量、代理请求 | 打包应用、隔离环境、部署服务 |
| 工作位置 | 用户和服务器之间 | 服务器内部或开发环境中 |
| 关注重点 | 流量、域名、安全、缓存、边缘节点 | 进程、依赖、镜像、容器、运行环境 |
| 是否直接运行后端应用 | 通常不直接运行传统后端,Workers 除外 | 可以直接运行后端、数据库、队列等 |
| 是否需要服务器 | 部分功能不需要,如 Pages、Workers | 通常需要宿主机或云服务器 |
| 典型用户 | 网站管理员、运维、安全工程师、前端开发者 | 后端开发、DevOps、运维、架构师 |
| 常见命令 | 主要通过控制台、API、wrangler、cloudflared | docker、docker compose、docker build、docker run |
| 解决问题 | 用户如何更快更安全访问服务 | 应用如何更稳定更一致运行 |
一句话总结:
Cloudflare 管的是“流量怎么进来”,Docker 管的是“应用怎么跑起来”。
四、二者并不是替代关系,而是协作关系
很多人会问:用了 Docker 还需要 Cloudflare 吗?或者用了 Cloudflare 还需要 Docker 吗?
答案是:它们不是二选一,而是经常一起使用。
例如你有一个 Node.js 后端项目:
- 使用 Docker 将 Node.js 应用打包成容器;
- 在云服务器上运行 Docker 容器;
- 使用 Nginx 或直接暴露端口;
- 域名接入 Cloudflare;
- 开启 Cloudflare CDN、HTTPS、WAF;
- 用户通过 Cloudflare 访问你的 Docker 应用。
整体架构如下:
用户
↓
Cloudflare CDN / WAF / SSL
↓
云服务器公网 IP
↓
Docker 容器中的应用
↓
数据库 / Redis / 对象存储
在这个架构中:
- Docker 负责让应用可靠运行;
- Cloudflare 负责让访问更快、更安全、更稳定。
五、源码示例:使用 Docker 部署一个 Node.js 服务
下面我们编写一个简单的 Node.js HTTP 服务,并使用 Docker 部署。
1. 项目目录结构
demo-app/
├── app.js
├── package.json
├── Dockerfile
└── docker-compose.yml
2. app.js 源码
const http = require("http");
const PORT = process.env.PORT || 3000;
const server = http.createServer((req, res) => {
if (req.url === "/") {
res.writeHead(200, {
"Content-Type": "application/json; charset=utf-8"
});
res.end(JSON.stringify({
message: "Hello Docker and Cloudflare!",
path: req.url,
time: new Date().toISOString()
}));
return;
}
if (req.url === "/health") {
res.writeHead(200, {
"Content-Type": "text/plain; charset=utf-8"
});
res.end("ok");
return;
}
res.writeHead(404, {
"Content-Type": "application/json; charset=utf-8"
});
res.end(JSON.stringify({
error: "Not Found"
}));
});
server.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
3. package.json 源码
{
"name": "docker-cloudflare-demo",
"version": "1.0.0",
"description": "A demo app for Docker and Cloudflare",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"dependencies": {}
}
4. Dockerfile 源码
FROM node:20-alpine
WORKDIR /app
COPY package.json ./
RUN npm install --production
COPY app.js ./
ENV PORT=3000
EXPOSE 3000
CMD ["npm", "start"]
这个 Dockerfile 的含义如下:
FROM node:20-alpine:使用轻量级 Node.js 镜像;WORKDIR /app:设置容器工作目录;COPY package.json ./:复制依赖描述文件;RUN npm install --production:安装生产依赖;COPY app.js ./:复制应用源码;ENV PORT=3000:设置环境变量;EXPOSE 3000:声明容器监听端口;CMD ["npm", "start"]:启动应用。
5. docker-compose.yml 源码
version: "3.8"
services:
web:
build: .
container_name: docker-cloudflare-demo
ports:
- "3000:3000"
environment:
- PORT=3000
restart: unless-stopped
启动服务:
docker compose up -d --build
查看容器状态:
docker ps
访问接口:
curl http://localhost:3000
curl http://localhost:3000/health
如果部署在云服务器上,并开放了 3000 端口,则可以通过:
http://服务器IP:3000
访问该服务。
不过在生产环境中,不建议直接暴露应用端口,通常会使用 Nginx、Caddy 或 Cloudflare Tunnel 等方式做转发和保护。
六、源码示例:使用 Cloudflare Tunnel 暴露本地 Docker 服务
如果你不想直接暴露服务器端口,也可以使用 Cloudflare Tunnel。它可以让你的本地服务或内网服务通过 Cloudflare 安全访问,而不需要开放公网入站端口。
访问链路如下:
用户
↓
Cloudflare
↓
cloudflared 隧道
↓
Docker 容器服务
1. 安装 cloudflared
以 Linux 为例:
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 \
-O cloudflared
chmod +x cloudflared
sudo mv cloudflared /usr/local/bin/
验证安装:
cloudflared version
2. 登录 Cloudflare
cloudflared tunnel login
执行后会打开浏览器,选择你的域名授权。
3. 创建 Tunnel
cloudflared tunnel create docker-demo
创建成功后,会生成一个 tunnel ID,并在本地生成凭证文件。
4. 配置 config.yml
假设你的域名是:
demo.example.com
你的 Docker 服务监听在本机:
http://localhost:3000
创建配置文件:
tunnel: <你的Tunnel-ID>
credentials-file: /root/.cloudflared/<你的Tunnel-ID>.json
ingress:
- hostname: demo.example.com
service: http://localhost:3000
- service: http_status:404
5. 创建 DNS 记录
cloudflared tunnel route dns docker-demo demo.example.com
6. 启动 Tunnel
cloudflared tunnel run docker-demo
此时用户访问:
https://demo.example.com
请求会经过 Cloudflare,再通过 Tunnel 转发到本地的 Docker 服务。
这种方式的优势是:
- 不需要服务器开放 3000 端口;
- 可以自动使用 Cloudflare HTTPS;
- 可以结合 Cloudflare Access 做身份认证;
- 源站真实 IP 不容易暴露;
- 更适合家庭服务器、NAS、开发环境和内网应用。
七、源码示例:Cloudflare Worker 与 Docker 的不同
Cloudflare 也能运行代码,例如使用 Cloudflare Workers。但 Workers 和 Docker 运行应用的方式完全不同。
Docker 是在容器中运行完整应用进程,而 Cloudflare Workers 是在 Cloudflare 的边缘节点运行轻量级 JavaScript/TypeScript 函数。
下面是一个 Worker 示例:
export default {
async fetch(request, env, ctx) {
const url = new URL(request.url);
if (url.pathname === "/") {
return Response.json({
message: "Hello from Cloudflare Workers!",
location: "Cloudflare Edge",
time: new Date().toISOString()
});
}
if (url.pathname === "/api") {
return Response.json({
data: [1, 2, 3],
source: "worker"
});
}
return new Response("Not Found", {
status: 404
});
}
};
使用 Wrangler 创建项目:
npm create cloudflare@latest worker-demo
cd worker-demo
npm run deploy
Worker 的特点是:
- 部署到全球边缘节点;
- 冷启动很快;
- 适合轻量接口、重定向、鉴权、A/B 测试、边缘缓存;
- 不适合长期运行的后台任务;
- 不能像 Docker 那样随意安装系统级依赖;
- 不适合运行传统数据库、复杂后端服务或长连接服务。
因此,虽然 Cloudflare Workers 也能运行代码,但它并不是 Docker 的直接替代品。
八、Cloudflare 更适合做什么?
Cloudflare 适合以下场景:
1. 网站 CDN 加速
对于图片、CSS、JS、字体、静态页面等资源,Cloudflare 可以缓存到全球节点,让用户就近访问,提高加载速度。
2. DNS 管理
Cloudflare 的 DNS 服务稳定、速度快,并且支持代理模式。很多网站会把域名托管到 Cloudflare。
3. HTTPS 和证书管理
Cloudflare 可以为网站提供免费 SSL/TLS 证书,简化 HTTPS 配置。
4. 防御 DDoS 攻击
Cloudflare 的强项之一就是安全防护,可以在边缘节点过滤大量恶意流量。
5. Web 应用防火墙
WAF 可以防御常见攻击,例如 SQL 注入、XSS、恶意爬虫、漏洞扫描等。
6. 内网穿透
通过 Cloudflare Tunnel,可以安全地将内网服务发布到公网。
7. 边缘计算
通过 Workers,可以在离用户更近的地方执行代码,降低延迟。
九、Docker 更适合做什么?
Docker 适合以下场景:
1. 后端服务部署
例如 Node.js、Go、Java、Python、PHP 等后端应用,都可以用 Docker 打包部署。
2. 数据库和中间件运行
开发环境中常用 Docker 启动 MySQL、PostgreSQL、Redis、MongoDB、RabbitMQ 等服务。
示例:
docker run -d \
--name redis-demo \
-p 6379:6379 \
redis:7-alpine
3. 统一开发环境
团队成员只需要安装 Docker,就可以使用同样的依赖环境,减少“我这里能跑”的问题。
4. CI/CD 自动化部署
在持续集成中,Docker 镜像可以作为标准交付物,从测试环境发布到生产环境。
5. 微服务架构
每个服务运行在独立容器中,便于扩缩容、隔离和维护。
6. 本地快速搭建复杂环境
例如一个项目需要 MySQL、Redis、Elasticsearch 和后端服务,可以用 Docker Compose 一键启动。
十、生产环境中的组合方案
一个比较常见的生产架构如下:
用户浏览器
↓
Cloudflare DNS / CDN / WAF / SSL
↓
Nginx 或 Caddy
↓
Docker Compose
├── app 容器
├── redis 容器
└── mysql 容器
对应的 docker-compose.yml 可以这样设计:
version: "3.8"
services:
app:
build: .
container_name: production-app
environment:
- NODE_ENV=production
- PORT=3000
expose:
- "3000"
restart: unless-stopped
nginx:
image: nginx:1.27-alpine
container_name: production-nginx
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
- app
restart: unless-stopped
Nginx 配置示例:
server {
listen 80;
server_name demo.example.com;
location / {
proxy_pass http://app:3000;
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;
}
}
然后在 Cloudflare 中添加 DNS:
类型:A
名称:demo
内容:服务器公网 IP
代理状态:已代理
当代理状态开启后,用户访问域名会先经过 Cloudflare,再转发到服务器。
十一、常见误区
误区一:Cloudflare 可以替代 Docker
不准确。
Cloudflare 可以托管静态页面、运行 Workers,但它不能像 Docker 一样运行完整 Linux 容器,也不能随意部署传统后端服务和数据库。
误区二:Docker 可以替代 Cloudflare
也不准确。
Docker 只负责运行应用,不负责全球 CDN、DNS、防 DDoS、WAF、边缘缓存等网络能力。
误区三:用了 Cloudflare 就一定安全
不一定。
Cloudflare 能增强安全,但源站服务器、应用代码、数据库权限、后台接口仍然需要安全设计。例如:
- 不应暴露数据库端口;
- 后台管理接口需要鉴权;
- 源站防火墙应限制访问;
- API 应做限流;
- 敏感配置不能写死在代码里。
误区四:用了 Docker 就不用关心服务器环境
也不完全正确。
Docker 能隔离应用环境,但宿主机仍然需要维护,包括:
- Linux 系统更新;
- Docker 版本管理;
- 磁盘空间清理;
- 日志轮转;
- 网络安全;
- 镜像漏洞扫描。
十二、如何选择?
如果你的目标是:
- 管理域名;
- 开启 HTTPS;
- 加速网站访问;
- 防御攻击;
- 隐藏源站 IP;
- 做内网穿透;
- 在边缘运行轻量函数;
那么优先考虑 Cloudflare。
如果你的目标是:
- 部署后端应用;
- 打包运行环境;
- 统一开发、测试、生产环境;
- 快速启动数据库或中间件;
- 实现微服务容器化;
- 配合 CI/CD 发布应用;
那么优先考虑 Docker。
如果你要上线一个完整 Web 项目,最推荐的方式通常是:
Docker 部署应用,Cloudflare 管理入口流量。
十三、总结
Cloudflare 和 Docker 的区别,本质上是技术层级和解决问题不同:
- Cloudflare 面向网络入口,解决访问加速、安全防护、DNS、HTTPS、边缘计算等问题;
- Docker 面向应用运行,解决环境一致、部署标准化、依赖隔离、服务编排等问题。
二者并不是竞争关系,而是互补关系。一个优秀的线上系统,往往会同时使用它们:
Cloudflare 负责让用户安全、快速地访问服务;
Docker 负责让服务稳定、一致地运行起来。
如果你是开发者,建议先掌握 Docker,因为它能直接提升本地开发和项目部署效率;如果你负责网站上线、域名、安全和性能优化,则应该学习 Cloudflare。对于全栈开发者和运维人员来说,二者都非常值得深入掌握。