id: b665ed2228b54d13aab4045985c0d946
parent_id: 
item_type: 1
item_id: 3b50008e7026464cbfd4bb53b0418678
item_updated_time: 1764345514484
title_diff: "[{\"diffs\":[[1,\"Docker Compose 保姆级指南：1 个文件搞定多容器，90% 的人都不知道这些！\"]],\"start1\":0,\"start2\":0,\"length1\":0,\"length2\":45}]"
body_diff: "[{\"diffs\":[[1,\"<html>\\\r\\\n<head>\\\r\\\n  <title>Docker Compose 保姆级指南：1 个文件搞定多容器，90% 的人都不知道这些！</title>\\\r\\\n  <basefont face=\\\"微软雅黑\\\" size=\\\"2\\\" />\\\r\\\n  <meta http-equiv=\\\"Content-Type\\\" content=\\\"text/html;charset=utf-8\\\" />\\\r\\\n  <meta name=\\\"exporter-version\\\" content=\\\"YXBJ Windows/608924 (zh-CN, DDL); Windows/10.0.0 (Win64); EDAMVersion=V2;\\\"/>\\\r\\\n  <meta name=\\\"content-class\\\" content=\\\"yinxiang.peso.superNote\\\"/>\\\r\\\n  <meta name=\\\"application-data:yinxiang.noteLayout\\\" content=\\\"{\\\"lineSpace\\\":\\\"recommend\\\",\\\"paragraphSpace\\\":\\\"recommend\\\"}\\\"/>\\\r\\\n  <style>\\\r\\\n\\tbody, td {\\\r\\\n\\t  font-family: 微软雅黑;\\\r\\\n\\t  font-size: 12pt;\\\r\\\n\\t}\\\r\\\n  </style>\\\r\\\n</head>\\\r\\\n<body>\\\r\\\n<a name=\\\"46957\\\"></a>\\\r\\\n<h1>Docker Compose 保姆级指南：1 个文件搞定多容器，90% 的人都不知道这些！</h1>\\\r\\\n\\\r\\\n<div><span><div><br/></div><p><br/></p><div style=\\\"--en-blockquote:true;box-sizing: border-box; padding-left: 19px; padding-top: 6px; padding-bottom: 6px; border-left: 3px solid #b4c0cc; background-position: initial initial; background-repeat: initial initial; margin-top: 6px\\\"><div>原文链接: <a href=\\\"https://mp.weixin.qq.com/s?__biz=MzU1NTg0MjI4Nw==&amp;mid=2247493067&amp;idx=1&amp;sn=d61f09a1e8bc1c76345352274363ed3d&amp;chksm=fac46568d36f012cd810141a12c086cdc781c85a0df5708fc8a07ddda1c9711bd1064151792b&amp;mpshare=1&amp;scene=1&amp;srcid=0820oaPe1leY2XnFFFqYiiEV&amp;sharer_shareinfo=44d60e74ce6dba59375e6baa7c6c422a&amp;sharer_shareinfo_first=44d60e74ce6dba59375e6baa7c6c422a#rd\\\" rev=\\\"en_rl_none\\\">https://mp.weixin.qq.com/s?__biz=MzU1NTg0MjI4Nw==&amp;mid=224749...</a></div></div><p><br/></p><div><br/></div><h1 style=\\\"other-props:eyJibG9ja0lkIjoiZ3c0MlJTMWFvYmwifQ==;\\\"> Docker Compose 保姆级指南：1 个文件搞定多容器，90% 的人都不知道这些！</h1><div>原创浮丶云 AI程序员ck </div><div><br/></div><p style=\\\"color:black;\\\"><span style=\\\"font-size: 16px;\\\"><span style=\\\"font-family: -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Noto Sans SC', 'Source Han Sans SC', 'WenQuanYi Micro Hei', 'Microsoft JhengHei', system-ui, sans-serif, Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, Cambria, Cochin, Georgia, Times, 'Times New Roman', serif;\\\"><span style=\\\"color: black;\\\">想搭个 Web 应用，得先启动数据库容器，再配置后端服务，最后还要调 Nginx 反向代理，每个步骤都要敲一堆命令；好不容易跑起来，换个环境又得重新配置，端口冲突、依赖顺序错了，容器直接 “罢工”……</span></span></span></p><img src=\\\"Docker Compose 保姆级指南：1 个文件搞定多容器，90% 的人都不知道这些！_files/640.jpg\\\" type=\\\"image/jpeg\\\" data-filename=\\\"640.jpg\\\" style=\\\"--en-marks:%7B%22align%22%3A%22center%22%7D;--en-uploadstate:uploaded;\\\"/><p style=\\\"color:black;\\\"><span style=\\\"font-size: 16px;\\\"><span style=\\\"font-family: -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Noto Sans SC', 'Source Han Sans SC', 'WenQuanYi Micro Hei', 'Microsoft JhengHei', system-ui, sans-serif, Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, Cambria, Cochin, Georgia, Times, 'Times New Roman', serif;\\\"><span style=\\\"color: black;\\\">其实，Docker 官方早就给我们准备了 “多容器管理神器”——Docker Compose。今天这篇文章，从基础到进阶，带你彻底吃透它，以后管理多容器应用，一个文件 + 一条命令就够了</span></span></span></p><h5 style=\\\"background-color:rgba(46, 125, 50, 0.1);color:rgb(44, 62, 80);other-props:eyJibG9ja0lkIjoidklxVFFLcFRTMV8ifQ==;\\\"><span style=\\\"font-size: 18px;\\\"><span style=\\\"font-family: -apple-system,BlinkMacSystemFont,'PingFang SC','Hiragino Sans GB','Microsoft YaHei',sans-serif;\\\"><span style=\\\"color: #2C3E50;\\\"><span style=\\\"font-weight: bold;\\\">Docker Compose 到底是什么？一句话讲明白</span></span></span></span></h5><p style=\\\"color:black;\\\"><span style=\\\"font-size: 16px;\\\"><span style=\\\"color: black;\\\">简单说，Docker Compose 是管理多容器 Docker 应用的 “总指挥”。 它允许你用一个 YAML 格式的配置文件（默认叫docker-compose.yml），把 Web 服务、数据库、缓存这些分散的容器，以及它们的端口映射、数据存储、依赖关系全定义好。之后不管是启动、停止还是重启整个应用，只要一条命令就能搞定，不用再逐个操作容器。 打个比方：如果把每个容器比作 “演员”，那docker-compose.yml就是 “剧本”，Docker Compose 就是 “导演”—— 按剧本把演员们的出场顺序、互动规则安排得明明白白，不用你挨个喊 “开机”。</span></span></p><h5 style=\\\"background-color:rgba(46, 125, 50, 0.1);color:rgb(44, 62, 80);other-props:eyJibG9ja0lkIjoicWNzZ1JhREtHcGYifQ==;\\\"><span style=\\\"font-size: 18px;\\\"><span style=\\\"font-family: -apple-system,BlinkMacSystemFont,'PingFang SC','Hiragino Sans GB','Microsoft YaHei',sans-serif;\\\"><span style=\\\"color: #2C3E50;\\\"><span style=\\\"font-weight: bold;\\\">Docker Compose 能做什么？解决 3 大核心痛点</span></span></span></span></h5><p style=\\\"color:black;\\\"><span style=\\\"font-size: 16px;\\\"><span style=\\\"color: black;\\\">很多人觉得 “我只用单个容器，不需要 Compose”，但只要你的应用需要 2 个以上容器配合（比如 Web + 数据库），它的价值立刻凸显，主要解决这 3 个问题：</span></span></p><ol><li><div style=\\\"color:rgb(1, 1, 1);\\\"><span style=\\\"color: rgb(1,1,1);\\\">环境 “复刻” 零成本，再也不用 “我这能跑啊”</span></div></li></ol><ul><li><div style=\\\"color:rgb(1, 1, 1);\\\"><span style=\\\"color: rgb(1,1,1);\\\">以前启动 Web+MySQL+Redis，你得敲 3 条docker run命令，还要记清端口、挂载路径；现在只要写好docker-compose.yml，执行docker compose up -d，3 个容器会自动启动，顺序还不会错。</span></div></li></ul><ol start=\\\"2\\\"><li><div style=\\\"color:rgb(1, 1, 1);\\\"><span style=\\\"color: rgb(1,1,1);\\\">环境 “复刻” 零成本，再也不用 “我这能跑啊”</span></div></li></ol><ul><li><div style=\\\"color:rgb(1, 1, 1);\\\"><span style=\\\"color: rgb(1,1,1);\\\">开发时写好docker-compose.yml，测试、运维拿过去直接用，端口、环境变量、数据卷配置完全一致。不会再出现 “开发环境能跑，测试环境报错” 的尴尬，省去大量调试时间。</span></div></li></ul><ol start=\\\"3\\\"><li><div style=\\\"color:rgb(1, 1, 1);\\\"><span style=\\\"color: rgb(1,1,1);\\\">服务依赖自动管理，容器启动有 “先后顺序”</span></div></li></ol><ul><li><div style=\\\"color:rgb(1, 1, 1);\\\"><span style=\\\"color: rgb(1,1,1);\\\">比如 Web 服务必须等数据库启动后才能连，手动启动很容易搞错顺序；用 Docker Compose 的depends_on配置，它会自动先启数据库，再启 Web 服务，避免 “连接超时” 问题。</span></div></li></ul><h5 style=\\\"background-color:rgba(46, 125, 50, 0.1);color:rgb(44, 62, 80);other-props:eyJibG9ja0lkIjoiU0xOMFM2WVl5YkMifQ==;\\\"><span style=\\\"font-size: 18px;\\\"><span style=\\\"font-family: -apple-system,BlinkMacSystemFont,'PingFang SC','Hiragino Sans GB','Microsoft YaHei',sans-serif;\\\"><span style=\\\"color: #2C3E50;\\\"><span style=\\\"font-weight: bold;\\\">实战案例：5 分钟搭一个 Web+MySQL 应用</span></span></span></span></h5><p style=\\\"color:black;\\\"><span style=\\\"font-size: 16px;\\\"><span style=\\\"color: black;\\\">光说不练假把式，我们用最常见的 “FlaskWeb+MySQL” 组合，带你看 Docker Compose 怎么用。</span></span></p><h5 style=\\\"background-color:rgba(46, 125, 50, 0.1);color:rgb(44, 62, 80);other-props:eyJibG9ja0lkIjoiZl83a1FlUzBTVjEifQ==;\\\"><span style=\\\"font-size: 18px;\\\"><span style=\\\"font-family: -apple-system,BlinkMacSystemFont,'PingFang SC','Hiragino Sans GB','Microsoft YaHei',sans-serif;\\\"><span style=\\\"color: #2C3E50;\\\"><span style=\\\"font-weight: bold;\\\">第一步：准备 2 个核心文件</span></span></span></span></h5><p style=\\\"color:black;\\\"><span style=\\\"font-size: 16px;\\\"><span style=\\\"color: black;\\\">Dockerfile：构建 FlaskWeb 镜像（Web 服务需要自定义）</span></span></p><p style=\\\"color:black;\\\"><span style=\\\"font-size: 16px;\\\"><span style=\\\"color: black;\\\">docker-compose.yml：定义 Web 和 MySQL 服务的关联规则</span></span></p><ol><li><div style=\\\"color:rgb(1, 1, 1);\\\"><span style=\\\"color: rgb(1,1,1);\\\">Dockerfile（构建 Flask 镜像）</span></div></li></ol><div style=\\\"background-color:rgb(40, 44, 52);\\\"><br/></div><div style=\\\"--en-codeblock:true;--en-blockId:-pU3Q2AHQ09;--en-meta:{&quot;title&quot;:&quot;&quot;,&quot;lang&quot;:&quot;Plain Text&quot;,&quot;theme&quot;:&quot;default&quot;,&quot;showLine&quot;:true,&quot;lineWrap&quot;:true};box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial; margin-top: 6px;\\\"><span style=\\\"color: #5c6370;\\\"><i># 基础镜像：Python3.9</i></span>\\\n<span style=\\\"color: #c678dd;\\\">FROM</span> python:<span style=\\\"color: #d19a66;\\\">3.9</span>-slim\\\n<span style=\\\"color: #5c6370;\\\"><i># 工作目录</i></span>\\\n<span style=\\\"color: #c678dd;\\\">WORKDIR</span> /app\\\n<span style=\\\"color: #5c6370;\\\"><i># 复制依赖文件</i></span>\\\n<span style=\\\"color: #c678dd;\\\">COPY</span> requirements.txt .\\\n<span style=\\\"color: #5c6370;\\\"><i># 安装依赖（Flask+MySQL驱动）</i></span>\\\n<span style=\\\"color: #c678dd;\\\">RUN</span> pip install --no-cache-dir flask pymysql\\\n<span style=\\\"color: #5c6370;\\\"><i># 复制Web代码（假设你的Web代码在app.py里）</i></span>\\\n<span style=\\\"color: #c678dd;\\\">COPY</span> app.py .\\\n<span style=\\\"color: #5c6370;\\\"><i># 暴露端口（Flask默认5000）</i></span>\\\n<span style=\\\"color: #c678dd;\\\">EXPOSE</span> <span style=\\\"color: #d19a66;\\\">5000</span>\\\n<span style=\\\"color: #5c6370;\\\"><i># 启动命令</i></span>\\\n<span style=\\\"color: #c678dd;\\\">CMD</span> [<span style=\\\"color: #98c379;\\\">&quot;python&quot;</span>, <span style=\\\"color: #98c379;\\\">&quot;app.py&quot;</span>]\\\n</div><ol start=\\\"2\\\"><li><div style=\\\"color:rgb(1, 1, 1);\\\"><span style=\\\"color: rgb(1,1,1);\\\">docker-compose.yml（核心配置）</span></div></li></ol><div style=\\\"background-color:rgb(40, 44, 52);\\\"><br/></div><div style=\\\"--en-codeblock:true;--en-blockId:4j2iQylBDbA;--en-meta:{&quot;title&quot;:&quot;&quot;,&quot;lang&quot;:&quot;Plain Text&quot;,&quot;theme&quot;:&quot;default&quot;,&quot;showLine&quot;:true,&quot;lineWrap&quot;:true};box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial; margin-top: 6px;\\\"><span style=\\\"color: #5c6370;\\\"><i># Compose版本（3.8是较新且稳定的版本）</i></span>\\\nversion: <span style=\\\"color: #98c379;\\\">'3.8'</span>\\\n\\\n<span style=\\\"color: #5c6370;\\\"><i># 定义所有服务</i></span>\\\nservices:\\\n<span style=\\\"color: #5c6370;\\\"><i># 1. Web服务（名字叫web，可自定义）</i></span>\\\n  web:\\\n    <span style=\\\"color: #5c6370;\\\"><i># 从当前目录的Dockerfile构建镜像</i></span>\\\n    build: .\\\n    <span style=\\\"color: #5c6370;\\\"><i># 端口映射：主机的5000端口→容器的5000端口</i></span>\\\n    ports:\\\n      - <span style=\\\"color: #98c379;\\\">&quot;5000:5000&quot;</span>\\\n    <span style=\\\"color: #5c6370;\\\"><i># 环境变量：给Web服务传数据库连接信息</i></span>\\\n    environment:\\\n      - MYSQL_HOST=db  <span style=\\\"color: #5c6370;\\\"><i># 数据库服务名（和下面的db对应，容器间可直接用服务名通信）</i></span>\\\n      - MYSQL_USER=root\\\n      - MYSQL_PASSWORD=<span style=\\\"color: #d19a66;\\\">123456</span>\\\n      - MYSQL_DB=testdb\\\n    <span style=\\\"color: #5c6370;\\\"><i># 依赖：先启动db服务，再启动web服务</i></span>\\\n    depends_on:\\\n      - db\\\n    <span style=\\\"color: #5c6370;\\\"><i># 自动重启：容器挂了自动重启</i></span>\\\n    restart: always\\\n\\\n<span style=\\\"color: #5c6370;\\\"><i># 2. 数据库服务（名字叫db，可自定义）</i></span>\\\n  db:\\\n    <span style=\\\"color: #5c6370;\\\"><i># 直接用MySQL官方镜像（不用自己构建）</i></span>\\\n    image: mysql:<span style=\\\"color: #d19a66;\\\">8.0</span>\\\n    <span style=\\\"color: #5c6370;\\\"><i># 环境变量：初始化MySQL（用户名、密码、数据库名）</i></span>\\\n    environment:\\\n      - MYSQL_ROOT_PASSWORD=<span style=\\\"color: #d19a66;\\\">123456</span>\\\n      - MYSQL_DATABASE=testdb\\\n    <span style=\\\"color: #5c6370;\\\"><i># 数据卷：持久化MySQL数据（容器删了数据不丢）</i></span>\\\n    volumes:\\\n      - mysql_data:/var/lib/mysql\\\n    <span style=\\\"color: #5c6370;\\\"><i># 暴露端口（可选，这里不对外暴露，Web服务内部能访问）</i></span>\\\n    <span style=\\\"color: #c678dd;\\\">expose</span>:\\\n      - <span style=\\\"color: #98c379;\\\">&quot;3306&quot;</span>\\\n    restart: always\\\n\\\n<span style=\\\"color: #5c6370;\\\"><i># 声明数据卷（持久化MySQL数据）</i></span>\\\nvolumes:\\\n  mysql_data:\\\n</div><h5 style=\\\"background-color:rgba(46, 125, 50, 0.1);color:rgb(44, 62, 80);other-props:eyJibG9ja0lkIjoiaFJqclFXazMzWC0ifQ==;\\\"><span style=\\\"font-size: 18px;\\\"><span style=\\\"font-family: -apple-system,BlinkMacSystemFont,'PingFang SC','Hiragino Sans GB','Microsoft YaHei',sans-serif;\\\"><span style=\\\"color: #2C3E50;\\\"><span style=\\\"font-weight: bold;\\\">第二步：启动应用</span></span></span></span></h5><p style=\\\"color:black;\\\"><span style=\\\"font-size: 16px;\\\"><span style=\\\"color: black;\\\">在项目文件夹下执行 2 条命令：</span></span></p><ol><li><div style=\\\"color:rgb(1, 1, 1);\\\"><span style=\\\"color: rgb(1,1,1);\\\">启动服务（后台运行）：docker compose up -d</span></div></li></ol><div style=\\\"color:rgb(67, 160, 71);\\\"><span style=\\\"font-size: 30px;\\\"><span style=\\\"font-family: Arial;\\\"><span style=\\\"color: #43A047;\\\"><span style=\\\"font-weight: bold;\\\">“</span></span></span></span></div><p style=\\\"color:black;\\\"><span style=\\\"font-size: 16px;\\\"><span style=\\\"color: black;\\\">此时会自动做 3 件事：构建 Flask 镜像→启动 MySQL 容器→启动 Web 容器。</span></span></p><ol start=\\\"2\\\"><li><div style=\\\"color:rgb(1, 1, 1);\\\"><span style=\\\"color: rgb(1,1,1);\\\">查看状态：docker compose ps</span></div></li></ol><div style=\\\"color:rgb(67, 160, 71);\\\"><span style=\\\"font-size: 30px;\\\"><span style=\\\"font-family: Arial;\\\"><span style=\\\"color: #43A047;\\\"><span style=\\\"font-weight: bold;\\\">“</span></span></span></span></div><p style=\\\"color:black;\\\"><span style=\\\"font-size: 16px;\\\"><span style=\\\"color: black;\\\">能看到web和db两个服务都是 “Up” 状态，说明启动成功。</span></span></p><h5 style=\\\"background-color:rgba(46, 125, 50, 0.1);color:rgb(44, 62, 80);other-props:eyJibG9ja0lkIjoibjNMNlJHd3BPdE8ifQ==;\\\"><span style=\\\"font-size: 18px;\\\"><span style=\\\"font-family: -apple-system,BlinkMacSystemFont,'PingFang SC','Hiragino Sans GB','Microsoft YaHei',sans-serif;\\\"><span style=\\\"color: #2C3E50;\\\"><span style=\\\"font-weight: bold;\\\">第三步：验证效果</span></span></span></span></h5><p style=\\\"color:black;\\\"><span style=\\\"font-size: 16px;\\\"><span style=\\\"color: black;\\\">打开浏览器访问http://你的主机IP:5000，如果能看到 Web 页面，且能正常读取 / 写入 MySQL 数据，就说明整个应用跑通了！想停止的话，执行docker compose down，两个容器会一起停止，还能自动清理网络</span></span></p><h5 style=\\\"background-color:rgba(46, 125, 50, 0.1);color:rgb(44, 62, 80);other-props:eyJibG9ja0lkIjoidWxvc1RhR1lCSzkifQ==;\\\"><span style=\\\"font-size: 18px;\\\"><span style=\\\"font-family: -apple-system,BlinkMacSystemFont,'PingFang SC','Hiragino Sans GB','Microsoft YaHei',sans-serif;\\\"><span style=\\\"color: #2C3E50;\\\"><span style=\\\"font-weight: bold;\\\">Docker Compose vs Dockerfile：别再搞混了</span></span></span></span></h5><p style=\\\"color:black;\\\"><span style=\\\"font-size: 16px;\\\"><span style=\\\"color: black;\\\">很多新手会把这两个文件弄混，其实它们分工完全不同，就像 “厨师” 和 “食谱” 的关系：</span></span></p><table style=\\\"--en-fitwindow:false;border-left:1px solid #d9d9d9;border-top:1px solid #d9d9d9;border-collapse:collapse;width:570px;\\\" width=\\\"570px\\\"><colgroup><col style=\\\"width: 190px;\\\"></col><col style=\\\"width: 190px;\\\"></col><col style=\\\"width: 190px;\\\"></col></colgroup><tbody><tr style=\\\"border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-right-style:initial; border-bottom-style:initial; border-left-style:initial; border-right-color:initial; border-bottom-color:initial; border-left-color:initial; border-image-source:initial; border-image-slice:initial; border-image-width:initial; border-image-outset:initial; border-image-repeat:initial; border-top-width:initial; border-top-style:initial; border-top-color:rgb(204, 204, 204);\\\"><th style=\\\"--en-typeInfo:{&quot;type&quot;:&quot;text&quot;,&quot;data&quot;:{}};background-color:rgba(46, 125, 50, 0.8);border-right:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;padding:10px;text-align:left;\\\"><div><span style=\\\"font-size: 16px;\\\"><span style=\\\"color: #FFFFFF;\\\"><span style=\\\"font-weight: bold;\\\">对比维度</span></span></span></div></th><th style=\\\"--en-typeInfo:{&quot;type&quot;:&quot;text&quot;,&quot;data&quot;:{}};background-color:rgba(46, 125, 50, 0.8);border-right:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;padding:10px;text-align:left;\\\"><div><span style=\\\"font-size: 16px;\\\"><span style=\\\"color: #FFFFFF;\\\"><span style=\\\"font-weight: bold;\\\">Dockerfile</span></span></span></div></th><th style=\\\"--en-typeInfo:{&quot;type&quot;:&quot;text&quot;,&quot;data&quot;:{}};background-color:rgba(46, 125, 50, 0.8);border-right:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;padding:10px;text-align:left;\\\"><div><span style=\\\"font-size: 16px;\\\"><span style=\\\"color: #FFFFFF;\\\"><span style=\\\"font-weight: bold;\\\">Docker Compose</span></span></span></div></th></tr><tr style=\\\"border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-right-style:initial; border-bottom-style:initial; border-left-style:initial; border-right-color:initial; border-bottom-color:initial; border-left-color:initial; border-image-source:initial; border-image-slice:initial; border-image-width:initial; border-image-outset:initial; border-image-repeat:initial; border-top-width:initial; border-top-style:initial; border-top-color:rgb(204, 204, 204);\\\"><td style=\\\"--en-typeInfo:{&quot;type&quot;:&quot;text&quot;,&quot;data&quot;:{}};border-right:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;padding:10px;text-align:left;\\\"><div><span style=\\\"font-size: 15px;\\\">核心作用</span></div></td><td style=\\\"--en-typeInfo:{&quot;type&quot;:&quot;text&quot;,&quot;data&quot;:{}};border-right:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;padding:10px;text-align:left;\\\"><div><span style=\\\"font-size: 15px;\\\">构建<span style=\\\"color: black;\\\"><b><span style=\\\"font-weight: bold;\\\">单个镜像</span></b></span>的 “食谱”</span></div></td><td style=\\\"--en-typeInfo:{&quot;type&quot;:&quot;text&quot;,&quot;data&quot;:{}};border-right:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;padding:10px;text-align:left;\\\"><div><span style=\\\"font-size: 15px;\\\">管理<span style=\\\"color: black;\\\"><b><span style=\\\"font-weight: bold;\\\">多个容器</span></b></span>的 “总指挥”</span></div></td></tr><tr style=\\\"border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-right-style:initial; border-bottom-style:initial; border-left-style:initial; border-right-color:initial; border-bottom-color:initial; border-left-color:initial; border-image-source:initial; border-image-slice:initial; border-image-width:initial; border-image-outset:initial; border-image-repeat:initial; border-top-width:initial; border-top-style:initial; border-top-color:rgb(204, 204, 204);\\\"><td style=\\\"--en-typeInfo:{&quot;type&quot;:&quot;text&quot;,&quot;data&quot;:{}};border-right:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;padding:10px;text-align:left;\\\"><div><span style=\\\"font-size: 15px;\\\">操作对象</span></div></td><td style=\\\"--en-typeInfo:{&quot;type&quot;:&quot;text&quot;,&quot;data&quot;:{}};border-right:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;padding:10px;text-align:left;\\\"><div><span style=\\\"font-size: 15px;\\\">镜像（Image）</span></div></td><td style=\\\"--en-typeInfo:{&quot;type&quot;:&quot;text&quot;,&quot;data&quot;:{}};border-right:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;padding:10px;text-align:left;\\\"><div><span style=\\\"font-size: 15px;\\\">容器（Container）</span></div></td></tr><tr style=\\\"border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-right-style:initial; border-bottom-style:initial; border-left-style:initial; border-right-color:initial; border-bottom-color:initial; border-left-color:initial; border-image-source:initial; border-image-slice:initial; border-image-width:initial; border-image-outset:initial; border-image-repeat:initial; border-top-width:initial; border-top-style:initial; border-top-color:rgb(204, 204, 204);\\\"><td style=\\\"--en-typeInfo:{&quot;type&quot;:&quot;text&quot;,&quot;data&quot;:{}};border-right:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;padding:10px;text-align:left;\\\"><div><span style=\\\"font-size: 15px;\\\">配置格式</span></div></td><td style=\\\"--en-typeInfo:{&quot;type&quot;:&quot;text&quot;,&quot;data&quot;:{}};border-right:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;padding:10px;text-align:left;\\\"><div><span style=\\\"font-size: 15px;\\\">专用指令（FROM、RUN、COPY 等）</span></div></td><td style=\\\"--en-typeInfo:{&quot;type&quot;:&quot;text&quot;,&quot;data&quot;:{}};border-right:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;padding:10px;text-align:left;\\\"><div><span style=\\\"font-size: 15px;\\\">YAML 格式（更易读）</span></div></td></tr><tr style=\\\"border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-right-style:initial; border-bottom-style:initial; border-left-style:initial; border-right-color:initial; border-bottom-color:initial; border-left-color:initial; border-image-source:initial; border-image-slice:initial; border-image-width:initial; border-image-outset:initial; border-image-repeat:initial; border-top-width:initial; border-top-style:initial; border-top-color:rgb(204, 204, 204);\\\"><td style=\\\"--en-typeInfo:{&quot;type&quot;:&quot;text&quot;,&quot;data&quot;:{}};border-right:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;padding:10px;text-align:left;\\\"><div><span style=\\\"font-size: 15px;\\\">常用命令</span></div></td><td style=\\\"--en-typeInfo:{&quot;type&quot;:&quot;text&quot;,&quot;data&quot;:{}};border-right:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;padding:10px;text-align:left;\\\"><div><span style=\\\"font-size: 15px;\\\"><code style=\\\"-en-code: true\\\">docker build</code></span></div><div>（构建镜像）</div></td><td style=\\\"--en-typeInfo:{&quot;type&quot;:&quot;text&quot;,&quot;data&quot;:{}};border-right:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;padding:10px;text-align:left;\\\"><div><span style=\\\"font-size: 15px;\\\"><code style=\\\"-en-code: true\\\">docker compose up/down</code></span></div><div>（启停服务）</div></td></tr><tr style=\\\"border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-right-style:initial; border-bottom-style:initial; border-left-style:initial; border-right-color:initial; border-bottom-color:initial; border-left-color:initial; border-image-source:initial; border-image-slice:initial; border-image-width:initial; border-image-outset:initial; border-image-repeat:initial; border-top-width:initial; border-top-style:initial; border-top-color:rgb(204, 204, 204);\\\"><td style=\\\"--en-typeInfo:{&quot;type&quot;:&quot;text&quot;,&quot;data&quot;:{}};border-right:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;padding:10px;text-align:left;\\\"><div><span style=\\\"font-size: 15px;\\\">配合关系</span></div></td><td style=\\\"--en-typeInfo:{&quot;type&quot;:&quot;text&quot;,&quot;data&quot;:{}};border-right:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;padding:10px;text-align:left;\\\"><div><span style=\\\"font-size: 15px;\\\">给 Compose 提供 “原材料”（自定义镜像）</span></div></td><td style=\\\"--en-typeInfo:{&quot;type&quot;:&quot;text&quot;,&quot;data&quot;:{}};border-right:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;padding:10px;text-align:left;\\\"><div><span style=\\\"font-size: 15px;\\\">用 Dockerfile 构建的镜像启动容器</span></div></td></tr></tbody></table><p style=\\\"color:black;\\\"><span style=\\\"font-size: 16px;\\\"><span style=\\\"color: black;\\\">简单记：要做自定义镜像，写 Dockerfile；要管理多容器，写 docker-compose.yml。比如上面的案例，Web 服务需要自定义，所以写了 Dockerfile；MySQL 用官方镜像，就直接在 Compose 里引用。</span></span></p><h6 style=\\\"background-color:rgba(46, 125, 50, 0.1);color:rgb(44, 62, 80);other-props:eyJibG9ja0lkIjoiWk0xRVMtY0NYQ3cifQ==;\\\"><span style=\\\"font-size: 18px;\\\"><span style=\\\"font-family: -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;\\\"><span style=\\\"color: #2C3E50;\\\"><span style=\\\"font-weight: bold;\\\">90% 的人不知道的 Docker Compose 冷知识</span></span></span></span></h6><p style=\\\"color:black;\\\"><span style=\\\"font-size: 16px;\\\"><span style=\\\"color: black;\\\">掌握了基础用法还不够，这些冷门但实用的技巧，能让你用得更顺手：</span></span></p><ol><li><div style=\\\"color:rgb(1, 1, 1);\\\"><span style=\\\"color: rgb(1,1,1);\\\">数据卷不删？用down -v彻底清理</span></div></li></ol><p style=\\\"color:black;\\\"><span style=\\\"font-size: 16px;\\\"><span style=\\\"color: black;\\\">平时执行docker compose down，只会停止容器、删除网络，但数据卷（比如上面的mysql_data）不会删，数据还在。如果想彻底清理（比如测试环境），加个-v参数：docker compose down -v，数据卷也会一起删除。</span></span></p><ol start=\\\"2\\\"><li><div style=\\\"color:rgb(1, 1, 1);\\\"><span style=\\\"color: rgb(1,1,1);\\\">只启动部分服务？指定服务名就行</span></div></li></ol><p style=\\\"color:black;\\\"><span style=\\\"font-size: 16px;\\\"><span style=\\\"color: black;\\\">如果你的 Compose 文件里有 Web、DB、Redis3 个服务，想只启动 DB 和 Redis，不用改配置文件，直接执行：docker compose up -d db redis，只会启动指定的 2 个服务。</span></span></p><ol start=\\\"3\\\"><li><div style=\\\"color:rgb(1, 1, 1);\\\"><span style=\\\"color: rgb(1,1,1);\\\">实时看日志？logs -f追踪服务输出</span></div></li></ol><p style=\\\"color:black;\\\"><span style=\\\"font-size: 16px;\\\"><span style=\\\"color: black;\\\">想查看 Web 服务的实时日志，执行：docker compose logs -f web，-f表示 “跟随” 日志，有新输出会实时显示，排查问题超方便。</span></span></p><ol start=\\\"4\\\"><li><div style=\\\"color:rgb(1, 1, 1);\\\"><span style=\\\"color: rgb(1,1,1);\\\">配置可以 “叠加”？用.env文件存敏感信息</span></div></li></ol><p style=\\\"color:black;\\\"><span style=\\\"font-size: 16px;\\\"><span style=\\\"color: black;\\\">不想把密码、密钥写死在docker-compose.yml里？可以建一个.env文件，把敏感信息存进去：</span></span></p><div style=\\\"background-color:rgb(40, 44, 52);\\\"><br/></div><div style=\\\"--en-codeblock:true;--en-blockId:qZubT2oDu1Y;--en-meta:{&quot;title&quot;:&quot;&quot;,&quot;lang&quot;:&quot;Plain Text&quot;,&quot;theme&quot;:&quot;default&quot;,&quot;showLine&quot;:true,&quot;lineWrap&quot;:true};box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial; margin-top: 6px;\\\"><span style=\\\"color: #5c6370;\\\"><i># .env文件</i></span>\\\nMYSQL_PASSWORD=123456\\\nMYSQL_DB=testdb\\\n</div><p style=\\\"color:black;\\\"><span style=\\\"font-size: 16px;\\\"><span style=\\\"color: black;\\\">然后在docker-compose.yml里引用：</span></span></p><div style=\\\"background-color:rgb(40, 44, 52);\\\"><br/></div><div style=\\\"--en-codeblock:true;--en-blockId:YWePSyRJA_A;--en-meta:{&quot;title&quot;:&quot;&quot;,&quot;lang&quot;:&quot;Plain Text&quot;,&quot;theme&quot;:&quot;default&quot;,&quot;showLine&quot;:true,&quot;lineWrap&quot;:true};box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial; margin-top: 6px;\\\">environment:\\\n  - MYSQL_PASSWORD=<span style=\\\"color: #d19a66;\\\">${MYSQL_PASSWORD}</span>\\\n  - MYSQL_DB=<span style=\\\"color: #d19a66;\\\">${MYSQL_DB}</span>\\\n</div><p style=\\\"color:black;\\\"><span style=\\\"font-size: 16px;\\\"><span style=\\\"color: black;\\\">这样既安全，又方便不同环境修改配置。</span></span></p><p style=\\\"color:black;\\\"><span style=\\\"font-size: 16px;\\\"><span style=\\\"color: black;\\\">最后：谁最该学 Docker Compose？</span></span></p><ul><li><div style=\\\"color:rgb(1, 1, 1);\\\"><span style=\\\"color: rgb(1,1,1);\\\">开发：本地搭环境快 10 倍，不用再手动配多容器；</span></div></li><li><div style=\\\"color:rgb(1, 1, 1);\\\"><span style=\\\"color: rgb(1,1,1);\\\">测试：拿到 Compose 文件直接跑，环境一致不踩坑；</span></div></li><li><div style=\\\"color:rgb(1, 1, 1);\\\"><span style=\\\"color: rgb(1,1,1);\\\">运维：部署多容器应用，一条命令搞定，减少人工操作。</span></div></li></ul><p style=\\\"color:black;\\\"><span style=\\\"font-size: 16px;\\\"><span style=\\\"color: black;\\\">其实 Docker Compose 不难，核心就是 “一个文件定义所有，一条命令管理所有”。今天的案例和技巧，你只要动手试一遍，就能立刻用上。下次再遇到多容器管理的麻烦，记得掏出 Docker Compose 这个神器！</span></span></p></span>\\\n</div></body></html>\\u0000\"]],\"start1\":0,\"start2\":0,\"length1\":0,\"length2\":26504}]"
metadata_diff: {"new":{"id":"3b50008e7026464cbfd4bb53b0418678","parent_id":"061de1401cfc4cfaadf6e74e015970e9","latitude":"0.00000000","longitude":"0.00000000","altitude":"0.0000","author":"","source_url":"","is_todo":0,"todo_due":0,"todo_completed":0,"source":"joplin-desktop","source_application":"net.cozic.joplin-desktop","application_data":"","order":1764345716942,"markup_language":2,"is_shared":0,"share_id":"","conflict_original_id":"","master_key_id":"","user_data":"","deleted_time":0},"deleted":[]}
encryption_cipher_text: 
encryption_applied: 0
updated_time: 2025-11-28T16:12:37.002Z
created_time: 2025-11-28T16:12:37.002Z
type_: 13