惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
News | PayPal Newsroom
云风的 BLOG
云风的 BLOG
GbyAI
GbyAI
Engineering at Meta
Engineering at Meta
B
Blog RSS Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The Register - Security
The Register - Security
L
LangChain Blog
A
About on SuperTechFans
S
Schneier on Security
博客园 - 三生石上(FineUI控件)
Stack Overflow Blog
Stack Overflow Blog
The Hacker News
The Hacker News
AWS News Blog
AWS News Blog
博客园 - 司徒正美
Scott Helme
Scott Helme
K
Kaspersky official blog
Cyberwarzone
Cyberwarzone
T
Tenable Blog
腾讯CDC
Recorded Future
Recorded Future
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
G
GRAHAM CLULEY
Security Latest
Security Latest
S
Securelist
D
Darknet – Hacking Tools, Hacker News & Cyber Security
aimingoo的专栏
aimingoo的专栏
Google DeepMind News
Google DeepMind News
V
Vulnerabilities – Threatpost
雷峰网
雷峰网
T
The Exploit Database - CXSecurity.com
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
V2EX
T
The Blog of Author Tim Ferriss
D
Docker
S
Security Affairs
F
Full Disclosure
Know Your Adversary
Know Your Adversary
N
News and Events Feed by Topic
N
News and Events Feed by Topic
T
Tor Project blog
Hugging Face - Blog
Hugging Face - Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Microsoft Security Blog
Microsoft Security Blog
Simon Willison's Weblog
Simon Willison's Weblog
Recent Announcements
Recent Announcements
博客园_首页
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
S
Security @ Cisco Blogs

BlogFinder

日常漫步 Vol.24 之漫步前山河 - 雅余 周报 #1-聊聊本周的收获 - Edwin's Blog 我的OpenCode必装插件与Skill Write Something 掌中之物未必在掌握之中 · CRIVU PiliNara,一个更顺手的 PiliPlus 分支 「NekoEcho」:做一个必有回响的猫娘主题博客 2026-05 书影音总结 简化博客主题 - 安迪 你要加油呐 我第一次发布 npm 包 拾花小记#45:中考前的二三事 – 小改学习志 黛西花园5月游 #18 枇杷又熟了的五月月报 一些奇奇怪怪的需求?word仿方正书版的几个小操作 - Xiobb's Blog 0419 御温泉之旅 修复了一些bug,网站基本上趋于稳定了 - 新锐博客 又回到四十年前 如何定义成功 迷鹿屋2026已重新上线 科技冰火两重天+一周回顾 ${title} 热度退了,我反而用得更深了-咕咚同学 我到底该不该换个域名? 随身WIFI折腾记 - 安迪 博客撰写体验提升——hexo pro插件 为什么不用相机把屏幕上的接关密码拍下来? 国清寺与天台山 – Ouroboros ★★★★☆《挽救计划》——久违的经济上行感 - Davidの3号基地 删除右键“打开方式”里多余选项 第三周刊_No.53|一切都会被支付两次 安卓APP通话记录与录音上传踩坑记录 - 子舒的博客 天量下跌 inBox 笔记 2.3.8,把工具栏交给了你-咕咚同学 我把小龙虾搬到了微信-咕咚同学 安好 - 响石潭 Compound Engineering Plugin:让每个工程单元都比上一个更容易 MOSS-TTS Family:开源高质量语音与声音生成模型家族深度解析 Crawl4AI:专为 LLM 设计的开源 Web 爬虫与数据抓取工具 Build Your Own X:从零实现你最喜欢的技术——程序员进阶的终极资源清单 Anthropic Skills:用文件夹教 Claude 专业技能的开源框架 1年的去月球(下) - 梅之夏 欢迎回来。 简单讲讲 ASN.1 与 OID DTV - 直播聚合客户端 5.22-5.27 – 不兴江 还没去过鸭川 – 不兴江 张晶晶同学三刷林志颖 关于我 – 不兴江 爱与嫉妒 – 不兴江 港股被持续做空 备案码花了四百块-咕咚同学 一句话生成封面:我给公众号做了4种风格的AI封面生成技能 「官」方認證 再谈费曼学习法 2026-05-28T00:34:11+08:00 2026-05-28T00:28:45+08:00 离谱的英语学习指南:基于AI的英语进阶系统方法论 iii:零集成架构的后端统一运行时 Claude Code Harness:让 Claude Code 工作有迹可循的工程化框架 Heretic:全自动移除大语言模型审查机制的开源工具 MarkItDown:微软开源的万能文档转 Markdown 利器 Harness:让 Claude Code 秒变多智能体协作工厂 这段时间尽折腾AI Agent了,确实极大地提高了效率 近期动态:两个新站点正式上线啦 误判解除!zhouayuan.com 腾讯安全申诉成功 - 周阿源|玩具设计・插画日常・生活随笔 Ralph:让 AI 编码工具自主循环跑完所有 PRD 任务的量产神器 全都违法 – 个人工作记录 关于zhouayuan.com被误判 “含违规信息” 的说明与申诉记录 - 周阿源|玩具设计・插画日常・生活随笔 小米 MiMo v2.5 Pro 白嫖 最大的人间清醒,兜里有钱,但是不花。 夜晚靓歌(12):于文文现场solo - 王志勇的Blog 今日插画:风扬起的倔强 - 周阿源|玩具设计・插画日常・生活随笔 回门习俗 独立网卡 - 忘记了回忆 500亿入股人工智能企业 从命令行到桌面智能体-咕咚同学 第一性原理读书笔记 行者微评论223-加班の守株待兔-博客|政治与时事-风雨行者 ZOZO开源物理接触求解器:GPU加速的可扩展仿真引擎 OpenStock:开源股票市场交易平台技术深度解析 MoneyPrinterTurbo:基于AI的全自动短视频生成工具深度解析 Claude-Mem:为 Claude Code 构建的持久化记忆压缩系统 Twenty:可代码化定制的企业级开源 CRM 平台技术深度解析 2026-05-26T22:59:17+08:00 企业级开源大模型部署平台 GPUStack 实战教程 1年的去月球(上) - 梅之夏 Sevalla - 静态网站托管服务 不用翻墙、不用注册、不用月费,普通人也能用上 Claude Code 装修灯具要注意⚠️ 黄梅天先锋 - 游子微博 公安备案顺利办结,站点备案全部完成 - 周阿源|玩具设计・插画日常・生活随笔 第三次兑换天猫超市卡了宗宗酱-三维狐少儿编程 Don't think, feel. - Rolen's Blog 人这一辈子,到底图个什么 博客迁移 - Edwin's Blog 情感赛道写作模板 再现本轮行情的典型特征 裁员与平常心-咕咚同学 别让“偷懒”,成为隐私泄露的破绽
Docker 和 Docker Compose 最小入门:看懂那些 yml 文件 - Amiya的书桌
Amiya_desi · 2026-06-23 · via BlogFinder

如果你看我的其他文章,会发现几乎每个自托管服务都是用 Docker 跑的。

Vaultwarden、ntfy、Gatus、Fast Note Sync,全部都是一个 docker-compose.yml 文件搞定。

这篇不讲 Docker 的底层原理、不讲容器和虚拟机的区别、不讲 namespace 和 cgroup。那些东西以后想学再学。

这篇只讲:拿到服务器以后,怎么装 Docker,怎么看懂 compose 文件,怎么启动、停止、更新、删除容器。够你跑完前面所有服务就行。

Docker 让你用别人打包好的「镜像」直接跑服务,不用自己在系统里一个一个装依赖。

你不需要手动装 Python、装 Go、装 Node、配环境变量、处理版本冲突。镜像里面全有了。

docker-compose.yml 就是一个配置文件,告诉 Docker:

  • 拉哪个镜像
  • 用什么端口
  • 挂载哪些目录
  • 设置哪些环境变量
  • 出错了要不要自动重启

安装#

Ubuntu / Debian 上装 Docker:

curl -fsSL https://get.docker.com | sh

这个一键脚本会装 Docker Engine 和 Docker Compose(现在 compose 是 Docker 的子命令,不需要单独装 docker-compose)。

装完检查:

docker --version

docker compose version

如果你不想用 sudo 跑 Docker:

sudo usermod -aG docker $USER

然后退出重新登录。如果还是不行,重启服务器。

第一个 compose 文件#

我拿一个最简单的例子来看:

services:

whoami:

image: traefik/whoami

container_name: whoami

restart: unless-stopped

ports:

- "127.0.0.1:8080:80"

逐行翻译:

意思
services:下面定义服务列表
whoami:服务名,随便起
image: traefik/whoami用这个镜像
container_name: whoami容器叫 whoami
restart: unless-stopped崩了自动重启,除非你手动停
ports: - "127.0.0.1:8080:80"本机 8080 端口映射到容器的 80 端口

把这段保存成 docker-compose.yml(或者 compose.yml,两个名字都行),然后在同目录运行:

-d 是后台运行。

检查:

curl http://127.0.0.1:8080/

能看到返回信息就说明在跑了。

常用命令#

我把最常用的列在这里:

# 启动(后台)

docker compose up -d

# 查看日志

docker compose logs -f

# 查看日志(只看最后 100 行)

docker compose logs --tail=100

# 停止

docker compose down

# 重启

docker compose restart

# 查看状态

docker compose ps

# 进入容器内部(排查问题时用)

docker compose exec whoami sh

所有命令都要在 docker-compose.yml 所在的目录下执行。

读懂真实的 compose 文件#

拿 Vaultwarden 的来举例:

services:

vaultwarden:

image: vaultwarden/server:latest

container_name: vaultwarden

restart: unless-stopped

environment:

DOMAIN: "https://vault.example.com"

SIGNUPS_ALLOWED: "false"

volumes:

- ./vw-data:/data

ports:

- "127.0.0.1:8080:80"

新出现的东西:

字段意思
environment:环境变量,相当于配置项
volumes: - ./vw-data:/data把当前目录下的 vw-data 文件夹挂载到容器里的 /data

environment#

环境变量是大多数 Docker 服务的配置方式。

不同的服务认不同的变量。比如 Vaultwarden 认 DOMAINSIGNUPS_ALLOWED,ntfy 认 NTFY_BASE_URLNTFY_AUTH_DEFAULT_ACCESS

去看每个项目的文档就能知道它支持哪些变量。

volumes#

volumes 是数据持久化的关键。

容器删掉以后,容器内部的文件会消失。但 volumes 挂载的目录在宿主机上,不会跟着容器一起消失。

./vw-data:/data

↑ ↑

宿主机目录 容器内路径

这意味着:

  • 容器里 /data 下的文件,实际上存在宿主机的 ./vw-data 里。
  • 删掉容器再重建,数据还在。
  • 备份只需要备份宿主机的 ./vw-data

ports#

"127.0.0.1:8080:80"

↑ ↑ ↑

监听地址 宿主端口 容器端口

127.0.0.1 意味着只有本机能访问。外面连不进来。

如果你写 "0.0.0.0:8080:80" 或者 "8080:80",那就是公网也能直接访问。

对于密码库、管理面板这类东西,永远先 127.0.0.1,再用反代或 Tunnel 暴露 HTTPS。

用 .env 文件放敏感信息#

不要把密码、Token、域名直接写在 docker-compose.yml 里然后推到 GitHub。

在同目录下建一个 .env 文件:

VAULTWARDEN_DOMAIN=https://vault.example.com

ADMIN_TOKEN=一个很长很复杂的随机字符串

然后在 compose 里引用:

environment:

DOMAIN: "${VAULTWARDEN_DOMAIN}"

ADMIN_TOKEN: "${ADMIN_TOKEN}"

.env 文件加到 .gitignore 里,不要进仓库。

更新服务#

更新一个服务:

cd /srv/stacks/vaultwarden

# 先备份数据

tar -czf backup-$(date +%F).tar.gz vw-data

# 拉新镜像

docker compose pull

# 用新镜像重启

docker compose up -d

# 看日志确认正常

docker compose logs --tail=50

先备份再更新。出问题了还能回滚。

删除服务#

如果你不想要某个服务了:

# 停止并删除容器

docker compose down

# 如果确认不要数据了,删目录

rm -rf /srv/stacks/那个服务

docker compose down 只删容器,不删 volumes 数据。

如果你想彻底清理包括 volume:

但这会删数据。确认不需要了再用。

清理磁盘#

Docker 用久了会积累很多旧镜像。2C2G 的磁盘不大,偶尔清理一下:

# 看 Docker 占了多少空间

docker system df

# 清理不用的镜像、容器、网络

docker system prune

# 连不用的 volume 也清(小心,会删孤立 volume 的数据)

docker system prune --volumes

prune 只清理没在用的东西,在跑的服务不受影响。但 --volumes 要想清楚再用。

我的目录结构#

我习惯这样放:

/srv/stacks/

├── vaultwarden/

│ ├── docker-compose.yml

│ ├── .env

│ └── vw-data/

├── ntfy/

│ ├── docker-compose.yml

│ ├── .env

│ ├── cache/

│ ├── data/

│ └── etc/

├── gatus/

│ ├── docker-compose.yml

│ └── config/

└── fast-note-sync/

├── docker-compose.yml

├── .env

└── storage/

每个服务一个目录。进目录就能 docker compose up -d。数据和配置都在自己目录里,备份也好做。

常见坑#

端口冲突

两个服务不能用同一个宿主机端口。如果 Vaultwarden 用了 8080,ntfy 就得换一个,比如 8090。

权限问题

有些镜像容器内用非 root 用户运行,挂载的目录权限不对会导致写不进去。这时候检查一下宿主机目录的所有者和权限。

忘记 -d

docker compose up 不加 -d 的话,关掉终端服务就停了。记得加 -d

compose v1 vs v2

老教程里写的 docker-compose up(带横杠)是 v1。现在用 docker compose up(空格)是 v2。新装的系统都是 v2。如果你看到老教程带横杠,换成空格就行。

够用了#

到这里你已经能:

  • 装 Docker
  • 读懂 compose 文件
  • 启动、停止、更新、删除服务
  • 管理数据和配置
  • 清理磁盘

后面每篇自托管服务的文章,都只需要给你一个 docker-compose.yml,你就能跑起来。

不用一开始就理解 Docker 的所有概念。先能用,用多了自然会想知道更多。


这篇之后可以接着看#