上一篇 下一篇 分享链接 返回 返回顶部

Cloudflare 管流量,Docker 管应用:一文讲透两者区别与实战源码

发布人:慈云数据-客服中心 发布时间:3小时前 阅读量:4

Cloudflare 和 Docker 的区别|附源码

在现代 Web 开发、云原生部署和运维体系中,CloudflareDocker 都是非常常见的技术名词。很多初学者第一次接触它们时,容易把二者混在一起: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 后端项目:

  1. 使用 Docker 将 Node.js 应用打包成容器;
  2. 在云服务器上运行 Docker 容器;
  3. 使用 Nginx 或直接暴露端口;
  4. 域名接入 Cloudflare;
  5. 开启 Cloudflare CDN、HTTPS、WAF;
  6. 用户通过 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。对于全栈开发者和运维人员来说,二者都非常值得深入掌握。

目录结构
全文