从开发到分享:Docker + GitHub 完整部署指南(以 Domain Checker 为例)
详细讲解如何开发一个 Docker 应用,推送到 Docker Hub,上传到 GitHub,以及别人如何快速使用你的项目。包含完整的代码示例和最佳实践。
前言
你开发了一个很棒的应用,现在想让别人也能用。但怎么分享呢?
- 直接给代码?别人还要自己配置环境、安装依赖
- 打包成可执行文件?跨平台兼容性差
- 上传到 Docker Hub?别人一条命令就能用
这篇文章就是教你怎么做最后一种——用 Docker + GitHub 让你的应用可以被全世界使用。
我们以 Domain Checker(批量域名查询工具)为例,从零开始讲解整个流程。
第一部分:准备工作
你需要什么
- Docker — 已安装
- Docker Hub 账户 — 免费注册:https://hub.docker.com
- GitHub 账户 — 免费注册:https://github.com
- Git — 已安装
- 一个可以工作的应用 — 我们用 Domain Checker 作例子
项目结构
一个标准的可分享项目应该是这样的:
domain-checker/├── docker-compose.yml # Docker Compose 配置├── .env.example # 环境变量模板(给别人参考)├── .env # 真实环境变量(本地用,不上传)├── .gitignore # Git 忽略规则├── README.md # 项目说明├── Dockerfile # Docker 镜像定义├── requirements.txt # Python 依赖└── main.py # 应用代码第二部分:本地开发与测试
1. 创建项目目录
mkdir domain-checkercd domain-checker2. 编写应用代码
创建 main.py(这里用一个简单的 FastAPI 应用作例子):
from fastapi import FastAPIimport os
app = FastAPI(title="Domain Checker")
FASTLY_TOKEN = os.getenv("FASTLY_TOKEN", "")MAX_CONCURRENCY = int(os.getenv("MAX_CONCURRENCY", "5"))
@app.get("/")async def index(): return { "message": "Domain Checker API", "token_configured": bool(FASTLY_TOKEN), "max_concurrency": MAX_CONCURRENCY }
@app.get("/health")async def health(): return {"status": "ok"}3. 创建 requirements.txt
fastapi==0.104.1uvicorn==0.24.0httpx==0.25.2pytz==2024.1python-multipart==0.0.64. 创建 Dockerfile
FROM python:3.12-slim
ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1
WORKDIR /app
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates && rm -rf /var/lib/apt/lists/*
COPY requirements.txt .RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]5. 创建 docker-compose.yml
version: '3.8'services: domain-checker: image: myhywo/domain-checker:latest container_name: domain-checker restart: unless-stopped ports: - "22332:8000" volumes: - ./data:/app/data - ./wordlists:/app/wordlists environment: - MAX_CONCURRENCY=5 - HTTP_TIMEOUT_SECONDS=10 - CACHE_TTL_SECONDS=86400 - FASTLY_TOKEN=your_fastly_api_token_here - FASTLY_ENDPOINT=https://api.fastly.com/domain-management/v1/tools/status - RESET_DAY=18 - RESET_TIMEZONE=Asia/Shanghainetworks: default: name: domain-checker-net6. 创建 .env.example
这个文件告诉别人需要配置什么环境变量:
# Fastly API ConfigurationFASTLY_TOKEN=your_fastly_api_token_hereFASTLY_ENDPOINT=https://api.fastly.com/domain-management/v1/tools/status
# Application SettingsMAX_CONCURRENCY=5HTTP_TIMEOUT_SECONDS=10CACHE_TTL_SECONDS=86400
# Reset ConfigurationRESET_DAY=18RESET_TIMEZONE=Asia/Shanghai7. 创建 .env(本地用)
这个文件放你的真实配置,不要上传到 GitHub:
FASTLY_TOKEN=your_real_token_hereFASTLY_ENDPOINT=https://api.fastly.com/domain-management/v1/tools/statusMAX_CONCURRENCY=5HTTP_TIMEOUT_SECONDS=10CACHE_TTL_SECONDS=86400RESET_DAY=18RESET_TIMEZONE=Asia/Shanghai8. 创建 .gitignore
.env.env.local*.logapp/__pycache__/app/*.pycdata/.DS_Store9. 本地测试
# 构建镜像docker compose build
# 启动容器docker compose up -d
# 测试应用curl http://localhost:22332/
# 查看日志docker compose logs -f
# 停止容器docker compose down第三部分:推送到 Docker Hub
1. 登录 Docker Hub
docker login输入你的 Docker Hub 用户名和密码。
2. 给镜像打 tag
假设你的 Docker Hub 用户名是 myhywo:
docker tag domain-checker-domain-checker myhywo/domain-checker:latest3. 推送到 Docker Hub
docker push myhywo/domain-checker:latest等待上传完成。你可以在 https://hub.docker.com/r/myhywo/domain-checker 看到你的镜像。
重要: 推送前确保 docker-compose.yml 里的 FASTLY_TOKEN 是占位符(your_fastly_api_token_here),不是真实的 Token。真实的 Token 应该在本地的 .env 文件里。
第四部分:上传到 GitHub
1. 在 GitHub 创建新仓库
访问 https://github.com/new,创建一个新仓库,名字叫 domain-checker。
2. 初始化本地 Git 仓库
cd domain-checkergit initgit add .git commit -m "Initial commit: domain-checker with docker-compose"3. 添加远程仓库
git remote add origin https://github.com/myhywo/domain-checker.gitgit branch -M maingit push -u origin main输入你的 GitHub 用户名和 Personal Access Token(或用 SSH 密钥)。
4. 提交并推送到 GitHub
git add README.mdgit commit -m "Initial commit: domain-checker with docker-compose"git push -u origin main第五部分:别人如何使用你的项目
方式 1:从 GitHub Clone(推荐)
# Clone 项目git clone https://github.com/myhywo/domain-checker.gitcd domain-checker
# 复制环境变量模板cp .env.example .env
# 编辑 .env,填入自己的 Fastly Tokennano .env
# 启动容器docker compose up -d
# 访问应用curl http://localhost:22332/方式 2:直接用 Docker 镜像(不需要 Clone)
docker run -d \ -p 22332:8000 \ -e FASTLY_TOKEN=their_token_here \ -e FASTLY_ENDPOINT=https://api.fastly.com/domain-management/v1/tools/status \ myhywo/domain-checker:latest方式 3:用 Docker Compose(不需要 Clone)
创建一个 docker-compose.yml:
services: domain-checker: image: myhywo/domain-checker:latest container_name: domain-checker restart: unless-stopped ports: - "22332:8000" volumes: - ./app:/app environment: - MAX_CONCURRENCY=5 - HTTP_TIMEOUT_SECONDS=10 - CACHE_TTL_SECONDS=86400 - FASTLY_TOKEN=their_token_here - FASTLY_ENDPOINT=https://api.fastly.com/domain-management/v1/tools/status - RESET_DAY=18 - RESET_TIMEZONE=Asia/Shanghai然后运行:
docker compose up -d第六部分:最佳实践
1. 版本管理
每次发布新版本时,给镜像打多个 tag:
# 构建镜像docker compose build
# 打 tagdocker tag domain-checker-domain-checker myhywo/domain-checker:latestdocker tag domain-checker-domain-checker myhywo/domain-checker:v1.0.0
# 推送docker push myhywo/domain-checker:latestdocker push myhywo/domain-checker:v1.0.0在 docker-compose.yml 里,别人可以选择用 latest 或指定版本:
image: myhywo/domain-checker:v1.0.0 # 指定版本# 或image: myhywo/domain-checker:latest # 最新版本2. 敏感信息管理
永远不要在代码里硬编码 Token 或密钥。
✅ 正确做法:
environment: - FASTLY_TOKEN=${FASTLY_TOKEN} # 从 .env 读取❌ 错误做法:
environment: - FASTLY_TOKEN=abc123xyz # 硬编码,会泄露!3. 健康检查
在 docker-compose.yml 里配置健康检查,Docker 会自动监控应用状态:
healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s4. 日志管理
配置日志驱动,防止日志文件无限增长:
logging: driver: "json-file" options: max-size: "10m" max-file: "3"5. 资源限制
为容器设置 CPU 和内存限制,防止占用过多资源:
deploy: resources: limits: cpus: '1' memory: 512M reservations: cpus: '0.5' memory: 256M6. 卷挂载
- 代码卷 — 用于开发时热重载:
./app:/app - 数据卷 — 用于持久化数据:
./data:/app/data
volumes: - ./app:/app # 代码(开发时热重载) - ./data:/app/data # 数据(持久化)第七部分:更新和维护
更新代码后的流程
# 1. 修改代码nano main.py
# 2. 测试docker compose restartcurl http://localhost:22332/
# 3. 重新构建镜像docker compose build
# 4. 推送到 Docker Hubdocker tag domain-checker-domain-checker myhywo/domain-checker:latestdocker push myhywo/domain-checker:latest
# 5. 提交到 GitHubgit add .git commit -m "Fix: improve performance"git push
# 6. 创建 Release(可选)# 在 GitHub 上创建一个新的 Release,标记版本号自动化推送(可选)
如果你想自动化这个流程,可以用 GitHub Actions:
name: Build and Push Docker Image
on: push: branches: - main
jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2
- name: Set up Docker Buildx uses: docker/setup-buildx-action@v1
- name: Login to Docker Hub uses: docker/login-action@v1 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push uses: docker/build-push-action@v2 with: context: . push: true tags: myhywo/domain-checker:latest常见问题
Q: 别人用我的镜像时,需要修改代码吗?
A: 不需要。所有配置都通过环境变量传入,别人只需要修改 .env 文件或 docker-compose.yml 里的环境变量即可。
Q: 我的 Token 会泄露吗?
A: 不会。只要你:
- 在
docker-compose.yml里用占位符 - 在
.env里放真实 Token - 在
.gitignore里排除.env
就不会泄露。
Q: 别人能看到我的 Token 吗?
A: 不能。Token 只存在于别人的本地 .env 文件里,不会上传到 GitHub 或 Docker Hub。
Q: 如何回滚到旧版本?
A: 在 docker-compose.yml 里改镜像标签:
image: myhywo/domain-checker:v1.0.0 # 改成旧版本然后重启:
docker compose downdocker compose up -dQ: 如何在多台服务器上部署?
A: 在每台服务器上都运行同样的命令:
git clone https://github.com/myhywo/domain-checker.gitcd domain-checkercp .env.example .env# 编辑 .envdocker compose up -d总结
| 步骤 | 命令 | 说明 |
|---|---|---|
| 1. 本地开发 | docker compose up -d | 在本地测试应用 |
| 2. 推送到 Docker Hub | docker push myhywo/domain-checker:latest | 上传镜像 |
| 3. 上传到 GitHub | git push | 上传代码 |
| 4. 别人使用 | docker compose up -d | 一条命令启动 |
现在你的应用已经可以被全世界使用了。每次更新代码时,只需要重复步骤 1-3 即可。
参考资源
- Docker 官方文档: https://docs.docker.com/
- Docker Hub: https://hub.docker.com/
- GitHub: https://github.com/
- Docker Compose: https://docs.docker.com/compose/
- 最佳实践: https://docs.docker.com/develop/dev-best-practices/
觉得这篇文章怎么样?
点个赞,让更多人看到!
相关文章
OpenClaw 怎么安装和更新?curl脚本、npm、Docker 全对比
一文讲清 OpenClaw 的 4 种安装方式:官方脚本、npm 全局、源码、容器;并给出对应更新、回滚与排障策略。
在 OpenClaw 服务器上安装并使用 Playwright + Chromium(含 Xvfb)
在无桌面 Linux 服务器上部署 Playwright + Chromium,用于访问、点击、输入与截图,并总结与 OpenClaw 的集成方式与常见坑。
纯 IPv6 服务器获得 IPv4 出站能力:NAT64 DNS + Cloudflare WARP 完整指南
为纯 IPv6 服务器配置 IPv4 出站能力的实战教程。先用 NAT64 DNS 临时应急,再用 Cloudflare WARP 获得长期稳定的解决方案。
进化!我在用 OpenClaw 智脑写博客
告别繁琐的 Git 操作,通过 Telegram 与 OpenClaw 智脑对话,实现全自动化的博文撰写与发布流程。

评论区