[{"data":1,"prerenderedAt":1345},["ShallowReactive",2],{"doc-page:\u002Fdocs\u002Fdocker-compose-recipes":3},{"doc":4,"prev":1305,"next":1312,"resolvedType":8,"readingMinutes":101,"audience":1319,"checklist":1323,"related":1327},{"path":5,"title":6,"description":7,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13,"body":14},"\u002Fdocs\u002Fdocker-compose-recipes","Docker Compose 常用配置","Nginx、MySQL、PostgreSQL、Redis、MinIO 等常用服务的 Docker Compose 配置模板","article",null,"infra-deployment","服务器与部署","2026-02-27","i-carbon-cloud",{"type":15,"value":16,"toc":1280},"minimark",[17,21,30,34,56,65,69,180,183,187,298,301,305,419,422,426,514,517,521,642,645,649,697,700,704,946,949,954,977,980,993,997,1010,1013,1132,1135,1141,1168,1181,1184,1188,1195,1198,1201,1208,1213,1216,1239,1242,1276],[18,19,6],"h1",{"id":20},"docker-compose-常用配置",[22,23,24,25,29],"p",{},"这页更适合当“本地服务编排起步模板”使用。真正难的通常不是写出一个能跑的 ",[26,27,28],"code",{},"compose.yaml","，而是把数据卷、环境变量、端口和服务关系一次性想清楚。",[31,32,33],"h2",{"id":33},"推荐写法原则",[35,36,37,41,47,50,53],"ul",{},[38,39,40],"li",{},"默认给有状态服务加数据卷",[38,42,43,44],{},"密码和密钥放进 ",[26,45,46],{},".env",[38,48,49],{},"对外暴露的端口尽量最少",[38,51,52],{},"服务名保持简单，方便容器间互相访问",[38,54,55],{},"先跑最小栈，再逐步加服务",[22,57,58,59,64],{},"Docker 基础见 ",[60,61,63],"a",{"href":62},"\u002Fdocs\u002Fdocker-setup","Docker Desktop 安装与使用","，本文提供常用服务的 Compose 模板。",[31,66,68],{"id":67},"nginx-反向代理","Nginx 反向代理",[70,71,76],"pre",{"className":72,"code":73,"language":74,"meta":75,"style":75},"language-yaml shiki shiki-themes github-light github-dark","services:\n  nginx:\n    image: nginx:alpine\n    ports:\n      - \"80:80\"\n      - \"443:443\"\n    volumes:\n      - .\u002Fnginx.conf:\u002Fetc\u002Fnginx\u002Fnginx.conf:ro\n      - .\u002Fhtml:\u002Fusr\u002Fshare\u002Fnginx\u002Fhtml\n      - .\u002Fcerts:\u002Fetc\u002Fnginx\u002Fcerts:ro\n    restart: unless-stopped\n","yaml","",[26,77,78,91,99,112,120,129,137,145,153,161,169],{"__ignoreMap":75},[79,80,83,87],"span",{"class":81,"line":82},"line",1,[79,84,86],{"class":85},"s9eBZ","services",[79,88,90],{"class":89},"sVt8B",":\n",[79,92,94,97],{"class":81,"line":93},2,[79,95,96],{"class":85},"  nginx",[79,98,90],{"class":89},[79,100,102,105,108],{"class":81,"line":101},3,[79,103,104],{"class":85},"    image",[79,106,107],{"class":89},": ",[79,109,111],{"class":110},"sZZnC","nginx:alpine\n",[79,113,115,118],{"class":81,"line":114},4,[79,116,117],{"class":85},"    ports",[79,119,90],{"class":89},[79,121,123,126],{"class":81,"line":122},5,[79,124,125],{"class":89},"      - ",[79,127,128],{"class":110},"\"80:80\"\n",[79,130,132,134],{"class":81,"line":131},6,[79,133,125],{"class":89},[79,135,136],{"class":110},"\"443:443\"\n",[79,138,140,143],{"class":81,"line":139},7,[79,141,142],{"class":85},"    volumes",[79,144,90],{"class":89},[79,146,148,150],{"class":81,"line":147},8,[79,149,125],{"class":89},[79,151,152],{"class":110},".\u002Fnginx.conf:\u002Fetc\u002Fnginx\u002Fnginx.conf:ro\n",[79,154,156,158],{"class":81,"line":155},9,[79,157,125],{"class":89},[79,159,160],{"class":110},".\u002Fhtml:\u002Fusr\u002Fshare\u002Fnginx\u002Fhtml\n",[79,162,164,166],{"class":81,"line":163},10,[79,165,125],{"class":89},[79,167,168],{"class":110},".\u002Fcerts:\u002Fetc\u002Fnginx\u002Fcerts:ro\n",[79,170,172,175,177],{"class":81,"line":171},11,[79,173,174],{"class":85},"    restart",[79,176,107],{"class":89},[79,178,179],{"class":110},"unless-stopped\n",[22,181,182],{},"适合做静态文件分发或统一代理入口，但正式使用时建议再补完整配置文件与证书目录管理。",[31,184,186],{"id":185},"mysql","MySQL",[70,188,190],{"className":72,"code":189,"language":74,"meta":75,"style":75},"services:\n  mysql:\n    image: mysql:8\n    environment:\n      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}\n      MYSQL_DATABASE: mydb\n    ports:\n      - \"3306:3306\"\n    volumes:\n      - mysql_data:\u002Fvar\u002Flib\u002Fmysql\n    restart: unless-stopped\n\nvolumes:\n  mysql_data:\n",[26,191,192,198,205,214,221,231,241,247,254,260,267,275,282,290],{"__ignoreMap":75},[79,193,194,196],{"class":81,"line":82},[79,195,86],{"class":85},[79,197,90],{"class":89},[79,199,200,203],{"class":81,"line":93},[79,201,202],{"class":85},"  mysql",[79,204,90],{"class":89},[79,206,207,209,211],{"class":81,"line":101},[79,208,104],{"class":85},[79,210,107],{"class":89},[79,212,213],{"class":110},"mysql:8\n",[79,215,216,219],{"class":81,"line":114},[79,217,218],{"class":85},"    environment",[79,220,90],{"class":89},[79,222,223,226,228],{"class":81,"line":122},[79,224,225],{"class":85},"      MYSQL_ROOT_PASSWORD",[79,227,107],{"class":89},[79,229,230],{"class":110},"${MYSQL_ROOT_PASSWORD}\n",[79,232,233,236,238],{"class":81,"line":131},[79,234,235],{"class":85},"      MYSQL_DATABASE",[79,237,107],{"class":89},[79,239,240],{"class":110},"mydb\n",[79,242,243,245],{"class":81,"line":139},[79,244,117],{"class":85},[79,246,90],{"class":89},[79,248,249,251],{"class":81,"line":147},[79,250,125],{"class":89},[79,252,253],{"class":110},"\"3306:3306\"\n",[79,255,256,258],{"class":81,"line":155},[79,257,142],{"class":85},[79,259,90],{"class":89},[79,261,262,264],{"class":81,"line":163},[79,263,125],{"class":89},[79,265,266],{"class":110},"mysql_data:\u002Fvar\u002Flib\u002Fmysql\n",[79,268,269,271,273],{"class":81,"line":171},[79,270,174],{"class":85},[79,272,107],{"class":89},[79,274,179],{"class":110},[79,276,278],{"class":81,"line":277},12,[79,279,281],{"emptyLinePlaceholder":280},true,"\n",[79,283,285,288],{"class":81,"line":284},13,[79,286,287],{"class":85},"volumes",[79,289,90],{"class":89},[79,291,293,296],{"class":81,"line":292},14,[79,294,295],{"class":85},"  mysql_data",[79,297,90],{"class":89},[22,299,300],{},"MySQL 这类有状态服务最重要的是数据目录持久化，不要只图能跑。",[31,302,304],{"id":303},"postgresql","PostgreSQL",[70,306,308],{"className":72,"code":307,"language":74,"meta":75,"style":75},"services:\n  postgres:\n    image: postgres:16-alpine\n    environment:\n      POSTGRES_USER: ${POSTGRES_USER:-postgres}\n      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}\n      POSTGRES_DB: mydb\n    ports:\n      - \"5432:5432\"\n    volumes:\n      - pg_data:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n    restart: unless-stopped\n\nvolumes:\n  pg_data:\n",[26,309,310,316,323,332,338,348,358,367,373,380,386,393,401,405,411],{"__ignoreMap":75},[79,311,312,314],{"class":81,"line":82},[79,313,86],{"class":85},[79,315,90],{"class":89},[79,317,318,321],{"class":81,"line":93},[79,319,320],{"class":85},"  postgres",[79,322,90],{"class":89},[79,324,325,327,329],{"class":81,"line":101},[79,326,104],{"class":85},[79,328,107],{"class":89},[79,330,331],{"class":110},"postgres:16-alpine\n",[79,333,334,336],{"class":81,"line":114},[79,335,218],{"class":85},[79,337,90],{"class":89},[79,339,340,343,345],{"class":81,"line":122},[79,341,342],{"class":85},"      POSTGRES_USER",[79,344,107],{"class":89},[79,346,347],{"class":110},"${POSTGRES_USER:-postgres}\n",[79,349,350,353,355],{"class":81,"line":131},[79,351,352],{"class":85},"      POSTGRES_PASSWORD",[79,354,107],{"class":89},[79,356,357],{"class":110},"${POSTGRES_PASSWORD}\n",[79,359,360,363,365],{"class":81,"line":139},[79,361,362],{"class":85},"      POSTGRES_DB",[79,364,107],{"class":89},[79,366,240],{"class":110},[79,368,369,371],{"class":81,"line":147},[79,370,117],{"class":85},[79,372,90],{"class":89},[79,374,375,377],{"class":81,"line":155},[79,376,125],{"class":89},[79,378,379],{"class":110},"\"5432:5432\"\n",[79,381,382,384],{"class":81,"line":163},[79,383,142],{"class":85},[79,385,90],{"class":89},[79,387,388,390],{"class":81,"line":171},[79,389,125],{"class":89},[79,391,392],{"class":110},"pg_data:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n",[79,394,395,397,399],{"class":81,"line":277},[79,396,174],{"class":85},[79,398,107],{"class":89},[79,400,179],{"class":110},[79,402,403],{"class":81,"line":284},[79,404,281],{"emptyLinePlaceholder":280},[79,406,407,409],{"class":81,"line":292},[79,408,287],{"class":85},[79,410,90],{"class":89},[79,412,414,417],{"class":81,"line":413},15,[79,415,416],{"class":85},"  pg_data",[79,418,90],{"class":89},[22,420,421],{},"PostgreSQL 在本地开发和测试环境里非常常见，和应用一起放进 Compose 是很自然的用法。",[31,423,425],{"id":424},"redis","Redis",[70,427,429],{"className":72,"code":428,"language":74,"meta":75,"style":75},"services:\n  redis:\n    image: redis:7-alpine\n    ports:\n      - \"6379:6379\"\n    volumes:\n      - redis_data:\u002Fdata\n    command: redis-server --appendonly yes\n    restart: unless-stopped\n\nvolumes:\n  redis_data:\n",[26,430,431,437,444,453,459,466,472,479,489,497,501,507],{"__ignoreMap":75},[79,432,433,435],{"class":81,"line":82},[79,434,86],{"class":85},[79,436,90],{"class":89},[79,438,439,442],{"class":81,"line":93},[79,440,441],{"class":85},"  redis",[79,443,90],{"class":89},[79,445,446,448,450],{"class":81,"line":101},[79,447,104],{"class":85},[79,449,107],{"class":89},[79,451,452],{"class":110},"redis:7-alpine\n",[79,454,455,457],{"class":81,"line":114},[79,456,117],{"class":85},[79,458,90],{"class":89},[79,460,461,463],{"class":81,"line":122},[79,462,125],{"class":89},[79,464,465],{"class":110},"\"6379:6379\"\n",[79,467,468,470],{"class":81,"line":131},[79,469,142],{"class":85},[79,471,90],{"class":89},[79,473,474,476],{"class":81,"line":139},[79,475,125],{"class":89},[79,477,478],{"class":110},"redis_data:\u002Fdata\n",[79,480,481,484,486],{"class":81,"line":147},[79,482,483],{"class":85},"    command",[79,485,107],{"class":89},[79,487,488],{"class":110},"redis-server --appendonly yes\n",[79,490,491,493,495],{"class":81,"line":155},[79,492,174],{"class":85},[79,494,107],{"class":89},[79,496,179],{"class":110},[79,498,499],{"class":81,"line":163},[79,500,281],{"emptyLinePlaceholder":280},[79,502,503,505],{"class":81,"line":171},[79,504,287],{"class":85},[79,506,90],{"class":89},[79,508,509,512],{"class":81,"line":277},[79,510,511],{"class":85},"  redis_data",[79,513,90],{"class":89},[22,515,516],{},"如果 Redis 只是做临时缓存，也可以不持久化；如果承担消息、队列或状态角色，就要认真看持久化策略。",[31,518,520],{"id":519},"minios3-兼容对象存储","MinIO（S3 兼容对象存储）",[70,522,524],{"className":72,"code":523,"language":74,"meta":75,"style":75},"services:\n  minio:\n    image: minio\u002Fminio\n    ports:\n      - \"9000:9000\"\n      - \"9001:9001\"\n    environment:\n      MINIO_ROOT_USER: ${MINIO_USER:-minioadmin}\n      MINIO_ROOT_PASSWORD: ${MINIO_PASSWORD:-minioadmin}\n    volumes:\n      - minio_data:\u002Fdata\n    command: server \u002Fdata --console-address \":9001\"\n    restart: unless-stopped\n\nvolumes:\n  minio_data:\n",[26,525,526,532,539,548,554,561,568,574,584,594,600,607,616,624,628,634],{"__ignoreMap":75},[79,527,528,530],{"class":81,"line":82},[79,529,86],{"class":85},[79,531,90],{"class":89},[79,533,534,537],{"class":81,"line":93},[79,535,536],{"class":85},"  minio",[79,538,90],{"class":89},[79,540,541,543,545],{"class":81,"line":101},[79,542,104],{"class":85},[79,544,107],{"class":89},[79,546,547],{"class":110},"minio\u002Fminio\n",[79,549,550,552],{"class":81,"line":114},[79,551,117],{"class":85},[79,553,90],{"class":89},[79,555,556,558],{"class":81,"line":122},[79,557,125],{"class":89},[79,559,560],{"class":110},"\"9000:9000\"\n",[79,562,563,565],{"class":81,"line":131},[79,564,125],{"class":89},[79,566,567],{"class":110},"\"9001:9001\"\n",[79,569,570,572],{"class":81,"line":139},[79,571,218],{"class":85},[79,573,90],{"class":89},[79,575,576,579,581],{"class":81,"line":147},[79,577,578],{"class":85},"      MINIO_ROOT_USER",[79,580,107],{"class":89},[79,582,583],{"class":110},"${MINIO_USER:-minioadmin}\n",[79,585,586,589,591],{"class":81,"line":155},[79,587,588],{"class":85},"      MINIO_ROOT_PASSWORD",[79,590,107],{"class":89},[79,592,593],{"class":110},"${MINIO_PASSWORD:-minioadmin}\n",[79,595,596,598],{"class":81,"line":163},[79,597,142],{"class":85},[79,599,90],{"class":89},[79,601,602,604],{"class":81,"line":171},[79,603,125],{"class":89},[79,605,606],{"class":110},"minio_data:\u002Fdata\n",[79,608,609,611,613],{"class":81,"line":277},[79,610,483],{"class":85},[79,612,107],{"class":89},[79,614,615],{"class":110},"server \u002Fdata --console-address \":9001\"\n",[79,617,618,620,622],{"class":81,"line":284},[79,619,174],{"class":85},[79,621,107],{"class":89},[79,623,179],{"class":110},[79,625,626],{"class":81,"line":292},[79,627,281],{"emptyLinePlaceholder":280},[79,629,630,632],{"class":81,"line":413},[79,631,287],{"class":85},[79,633,90],{"class":89},[79,635,637,640],{"class":81,"line":636},16,[79,638,639],{"class":85},"  minio_data",[79,641,90],{"class":89},[22,643,644],{},"MinIO 很适合本地模拟 S3，对文件上传、对象存储和测试环境特别有帮助。",[31,646,648],{"id":647},"adminer数据库管理","Adminer（数据库管理）",[70,650,652],{"className":72,"code":651,"language":74,"meta":75,"style":75},"services:\n  adminer:\n    image: adminer\n    ports:\n      - \"8080:8080\"\n    restart: unless-stopped\n",[26,653,654,660,667,676,682,689],{"__ignoreMap":75},[79,655,656,658],{"class":81,"line":82},[79,657,86],{"class":85},[79,659,90],{"class":89},[79,661,662,665],{"class":81,"line":93},[79,663,664],{"class":85},"  adminer",[79,666,90],{"class":89},[79,668,669,671,673],{"class":81,"line":101},[79,670,104],{"class":85},[79,672,107],{"class":89},[79,674,675],{"class":110},"adminer\n",[79,677,678,680],{"class":81,"line":114},[79,679,117],{"class":85},[79,681,90],{"class":89},[79,683,684,686],{"class":81,"line":122},[79,685,125],{"class":89},[79,687,688],{"class":110},"\"8080:8080\"\n",[79,690,691,693,695],{"class":81,"line":131},[79,692,174],{"class":85},[79,694,107],{"class":89},[79,696,179],{"class":110},[22,698,699],{},"数据库管理面板很好用，但不要长期暴露到公网。",[31,701,703],{"id":702},"完整示例web-应用栈","完整示例：Web 应用栈",[70,705,707],{"className":72,"code":706,"language":74,"meta":75,"style":75},"services:\n  app:\n    build: .\n    ports:\n      - \"3000:3000\"\n    environment:\n      DATABASE_URL: postgres:\u002F\u002Fpostgres:secret@postgres:5432\u002Fmydb\n      REDIS_URL: redis:\u002F\u002Fredis:6379\n    depends_on:\n      - postgres\n      - redis\n    restart: unless-stopped\n\n  postgres:\n    image: postgres:16-alpine\n    environment:\n      POSTGRES_PASSWORD: secret\n      POSTGRES_DB: mydb\n    volumes:\n      - pg_data:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n    restart: unless-stopped\n\n  redis:\n    image: redis:7-alpine\n    volumes:\n      - redis_data:\u002Fdata\n    command: redis-server --appendonly yes\n    restart: unless-stopped\n\nvolumes:\n  pg_data:\n  redis_data:\n",[26,708,709,715,722,733,739,746,752,762,772,779,786,793,801,805,811,819,825,835,844,851,858,867,872,879,888,895,902,911,920,925,932,939],{"__ignoreMap":75},[79,710,711,713],{"class":81,"line":82},[79,712,86],{"class":85},[79,714,90],{"class":89},[79,716,717,720],{"class":81,"line":93},[79,718,719],{"class":85},"  app",[79,721,90],{"class":89},[79,723,724,727,729],{"class":81,"line":101},[79,725,726],{"class":85},"    build",[79,728,107],{"class":89},[79,730,732],{"class":731},"sj4cs",".\n",[79,734,735,737],{"class":81,"line":114},[79,736,117],{"class":85},[79,738,90],{"class":89},[79,740,741,743],{"class":81,"line":122},[79,742,125],{"class":89},[79,744,745],{"class":110},"\"3000:3000\"\n",[79,747,748,750],{"class":81,"line":131},[79,749,218],{"class":85},[79,751,90],{"class":89},[79,753,754,757,759],{"class":81,"line":139},[79,755,756],{"class":85},"      DATABASE_URL",[79,758,107],{"class":89},[79,760,761],{"class":110},"postgres:\u002F\u002Fpostgres:secret@postgres:5432\u002Fmydb\n",[79,763,764,767,769],{"class":81,"line":147},[79,765,766],{"class":85},"      REDIS_URL",[79,768,107],{"class":89},[79,770,771],{"class":110},"redis:\u002F\u002Fredis:6379\n",[79,773,774,777],{"class":81,"line":155},[79,775,776],{"class":85},"    depends_on",[79,778,90],{"class":89},[79,780,781,783],{"class":81,"line":163},[79,782,125],{"class":89},[79,784,785],{"class":110},"postgres\n",[79,787,788,790],{"class":81,"line":171},[79,789,125],{"class":89},[79,791,792],{"class":110},"redis\n",[79,794,795,797,799],{"class":81,"line":277},[79,796,174],{"class":85},[79,798,107],{"class":89},[79,800,179],{"class":110},[79,802,803],{"class":81,"line":284},[79,804,281],{"emptyLinePlaceholder":280},[79,806,807,809],{"class":81,"line":292},[79,808,320],{"class":85},[79,810,90],{"class":89},[79,812,813,815,817],{"class":81,"line":413},[79,814,104],{"class":85},[79,816,107],{"class":89},[79,818,331],{"class":110},[79,820,821,823],{"class":81,"line":636},[79,822,218],{"class":85},[79,824,90],{"class":89},[79,826,828,830,832],{"class":81,"line":827},17,[79,829,352],{"class":85},[79,831,107],{"class":89},[79,833,834],{"class":110},"secret\n",[79,836,838,840,842],{"class":81,"line":837},18,[79,839,362],{"class":85},[79,841,107],{"class":89},[79,843,240],{"class":110},[79,845,847,849],{"class":81,"line":846},19,[79,848,142],{"class":85},[79,850,90],{"class":89},[79,852,854,856],{"class":81,"line":853},20,[79,855,125],{"class":89},[79,857,392],{"class":110},[79,859,861,863,865],{"class":81,"line":860},21,[79,862,174],{"class":85},[79,864,107],{"class":89},[79,866,179],{"class":110},[79,868,870],{"class":81,"line":869},22,[79,871,281],{"emptyLinePlaceholder":280},[79,873,875,877],{"class":81,"line":874},23,[79,876,441],{"class":85},[79,878,90],{"class":89},[79,880,882,884,886],{"class":81,"line":881},24,[79,883,104],{"class":85},[79,885,107],{"class":89},[79,887,452],{"class":110},[79,889,891,893],{"class":81,"line":890},25,[79,892,142],{"class":85},[79,894,90],{"class":89},[79,896,898,900],{"class":81,"line":897},26,[79,899,125],{"class":89},[79,901,478],{"class":110},[79,903,905,907,909],{"class":81,"line":904},27,[79,906,483],{"class":85},[79,908,107],{"class":89},[79,910,488],{"class":110},[79,912,914,916,918],{"class":81,"line":913},28,[79,915,174],{"class":85},[79,917,107],{"class":89},[79,919,179],{"class":110},[79,921,923],{"class":81,"line":922},29,[79,924,281],{"emptyLinePlaceholder":280},[79,926,928,930],{"class":81,"line":927},30,[79,929,287],{"class":85},[79,931,90],{"class":89},[79,933,935,937],{"class":81,"line":934},31,[79,936,416],{"class":85},[79,938,90],{"class":89},[79,940,942,944],{"class":81,"line":941},32,[79,943,511],{"class":85},[79,945,90],{"class":89},[31,947,948],{"id":948},"常见组合",[950,951,953],"h3",{"id":952},"web-应用本地开发","Web 应用本地开发",[35,955,956,965,971],{},[38,957,958,961,962],{},[26,959,960],{},"app"," + ",[26,963,964],{},"postgres",[38,966,967,961,969],{},[26,968,960],{},[26,970,424],{},[38,972,973,974],{},"必要时再补 ",[26,975,976],{},"adminer",[950,978,979],{"id":979},"自建服务入口",[35,981,982,987,990],{},[38,983,984],{},[26,985,986],{},"nginx",[38,988,989],{},"后端应用服务",[38,991,992],{},"证书目录 \u002F 静态资源目录",[950,994,996],{"id":995},"文件服务-对象存储","文件服务 \u002F 对象存储",[35,998,999,1004,1007],{},[38,1000,1001],{},[26,1002,1003],{},"minio",[38,1005,1006],{},"业务服务",[38,1008,1009],{},"可选管理面板",[31,1011,1012],{"id":1012},"常用命令",[70,1014,1018],{"className":1015,"code":1016,"language":1017,"meta":75,"style":75},"language-bash shiki shiki-themes github-light github-dark","docker compose up -d              # 后台启动\ndocker compose down               # 停止并删除容器\ndocker compose down -v            # 同时删除数据卷\ndocker compose logs -f app        # 查看指定服务日志\ndocker compose exec postgres psql -U postgres  # 进入数据库\ndocker compose pull               # 更新所有镜像\ndocker compose restart app        # 重启指定服务\n","bash",[26,1019,1020,1039,1051,1065,1083,1106,1118],{"__ignoreMap":75},[79,1021,1022,1026,1029,1032,1035],{"class":81,"line":82},[79,1023,1025],{"class":1024},"sScJk","docker",[79,1027,1028],{"class":110}," compose",[79,1030,1031],{"class":110}," up",[79,1033,1034],{"class":731}," -d",[79,1036,1038],{"class":1037},"sJ8bj","              # 后台启动\n",[79,1040,1041,1043,1045,1048],{"class":81,"line":93},[79,1042,1025],{"class":1024},[79,1044,1028],{"class":110},[79,1046,1047],{"class":110}," down",[79,1049,1050],{"class":1037},"               # 停止并删除容器\n",[79,1052,1053,1055,1057,1059,1062],{"class":81,"line":101},[79,1054,1025],{"class":1024},[79,1056,1028],{"class":110},[79,1058,1047],{"class":110},[79,1060,1061],{"class":731}," -v",[79,1063,1064],{"class":1037},"            # 同时删除数据卷\n",[79,1066,1067,1069,1071,1074,1077,1080],{"class":81,"line":114},[79,1068,1025],{"class":1024},[79,1070,1028],{"class":110},[79,1072,1073],{"class":110}," logs",[79,1075,1076],{"class":731}," -f",[79,1078,1079],{"class":110}," app",[79,1081,1082],{"class":1037},"        # 查看指定服务日志\n",[79,1084,1085,1087,1089,1092,1095,1098,1101,1103],{"class":81,"line":122},[79,1086,1025],{"class":1024},[79,1088,1028],{"class":110},[79,1090,1091],{"class":110}," exec",[79,1093,1094],{"class":110}," postgres",[79,1096,1097],{"class":110}," psql",[79,1099,1100],{"class":731}," -U",[79,1102,1094],{"class":110},[79,1104,1105],{"class":1037},"  # 进入数据库\n",[79,1107,1108,1110,1112,1115],{"class":81,"line":131},[79,1109,1025],{"class":1024},[79,1111,1028],{"class":110},[79,1113,1114],{"class":110}," pull",[79,1116,1117],{"class":1037},"               # 更新所有镜像\n",[79,1119,1120,1122,1124,1127,1129],{"class":81,"line":139},[79,1121,1025],{"class":1024},[79,1123,1028],{"class":110},[79,1125,1126],{"class":110}," restart",[79,1128,1079],{"class":110},[79,1130,1131],{"class":1037},"        # 重启指定服务\n",[31,1133,1134],{"id":1134},"环境变量",[22,1136,1137,1138,1140],{},"创建 ",[26,1139,46],{}," 文件，Compose 会自动读取：",[70,1142,1146],{"className":1143,"code":1144,"language":1145,"meta":75,"style":75},"language-env shiki shiki-themes github-light github-dark","POSTGRES_PASSWORD=your_secure_password\nMYSQL_ROOT_PASSWORD=your_secure_password\nMINIO_USER=admin\nMINIO_PASSWORD=your_secure_password\n","env",[26,1147,1148,1153,1158,1163],{"__ignoreMap":75},[79,1149,1150],{"class":81,"line":82},[79,1151,1152],{},"POSTGRES_PASSWORD=your_secure_password\n",[79,1154,1155],{"class":81,"line":93},[79,1156,1157],{},"MYSQL_ROOT_PASSWORD=your_secure_password\n",[79,1159,1160],{"class":81,"line":101},[79,1161,1162],{},"MINIO_USER=admin\n",[79,1164,1165],{"class":81,"line":114},[79,1166,1167],{},"MINIO_PASSWORD=your_secure_password\n",[1169,1170,1171],"blockquote",{},[22,1172,1173,1174,1176,1177,1180],{},"将 ",[26,1175,46],{}," 加入 ",[26,1178,1179],{},".gitignore","，不要提交到版本控制。",[31,1182,1183],{"id":1183},"常见问题",[950,1185,1187],{"id":1186},"容器起来了但服务互相连不上","容器起来了，但服务互相连不上",[22,1189,1190,1191,1194],{},"优先检查服务名、端口和环境变量。容器内访问数据库时，通常应该写服务名而不是 ",[26,1192,1193],{},"localhost","。",[950,1196,1197],{"id":1197},"一重启数据没了",[22,1199,1200],{},"说明你可能没挂数据卷，或者卷路径写错了。对数据库和对象存储来说，这通常是第一优先级问题。",[950,1202,1204,1207],{"id":1203},"depends_on-写了为什么还是连不上数据库",[26,1205,1206],{},"depends_on"," 写了，为什么还是连不上数据库",[22,1209,1210,1212],{},[26,1211,1206],{}," 只保证启动顺序，不保证服务真正就绪。应用层最好自己处理重试或等待机制。",[31,1214,1215],{"id":1215},"使用建议",[35,1217,1218,1221,1230,1236],{},[38,1219,1220],{},"每个栈单独一个目录",[38,1222,1223,1225,1226,1229],{},[26,1224,28],{}," 和 ",[26,1227,1228],{},".env.example"," 一起维护",[38,1231,1232,1233],{},"重要服务先跑 ",[26,1234,1235],{},"docker compose logs -f",[38,1237,1238],{},"真正长期使用前，补健康检查、备份和升级策略",[31,1240,1241],{"id":1241},"参考链接",[35,1243,1244,1253,1261,1269],{},[38,1245,1246,1252],{},[60,1247,1251],{"href":1248,"rel":1249},"https:\u002F\u002Fdocs.docker.com\u002Fcompose\u002F",[1250],"nofollow","Docker Compose 文档"," — 官方指南",[38,1254,1255,1260],{},[60,1256,1259],{"href":1257,"rel":1258},"https:\u002F\u002Fgithub.com\u002Fdocker\u002Fawesome-compose",[1250],"Awesome Compose"," — 官方示例集合",[38,1262,1263,1268],{},[60,1264,1267],{"href":1265,"rel":1266},"https:\u002F\u002Fhub.docker.com\u002F",[1250],"Docker Hub"," — 镜像仓库",[38,1270,1271,1275],{},[60,1272,1274],{"href":1273},"\u002Fdocs\u002Fnginx-basics","Nginx 基础配置"," — 如果你要把 Compose 里的服务通过反向代理对外提供",[1277,1278,1279],"style",{},"html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":75,"searchDepth":93,"depth":93,"links":1281},[1282,1283,1284,1285,1286,1287,1288,1289,1290,1295,1296,1297,1303,1304],{"id":33,"depth":93,"text":33},{"id":67,"depth":93,"text":68},{"id":185,"depth":93,"text":186},{"id":303,"depth":93,"text":304},{"id":424,"depth":93,"text":425},{"id":519,"depth":93,"text":520},{"id":647,"depth":93,"text":648},{"id":702,"depth":93,"text":703},{"id":948,"depth":93,"text":948,"children":1291},[1292,1293,1294],{"id":952,"depth":101,"text":953},{"id":979,"depth":101,"text":979},{"id":995,"depth":101,"text":996},{"id":1012,"depth":93,"text":1012},{"id":1134,"depth":93,"text":1134},{"id":1183,"depth":93,"text":1183,"children":1298},[1299,1300,1301],{"id":1186,"depth":101,"text":1187},{"id":1197,"depth":101,"text":1197},{"id":1203,"depth":101,"text":1302},"depends_on 写了，为什么还是连不上数据库",{"id":1215,"depth":93,"text":1215},{"id":1241,"depth":93,"text":1241},{"path":1306,"title":1307,"description":1308,"docType":8,"resourceKind":9,"categoryId":1309,"categoryLabel":1310,"updatedAt":12,"publishedAt":12,"icon":1311},"\u002Fdocs\u002Fdns-hosts","DNS 与 Hosts 配置","DNS 服务器推荐、Hosts 文件编辑、DNS 加密与常见问题排查","network-security","网络与安全","i-carbon-network-4",{"path":1313,"title":1314,"description":1315,"docType":8,"resourceKind":9,"categoryId":1316,"categoryLabel":1317,"updatedAt":12,"publishedAt":12,"icon":1318},"\u002Fdocs\u002Fffmpeg-guide","FFmpeg 完整指南","FFmpeg 安装、常用命令、视频转码、音频处理、字幕合并与批量操作","media-creation","媒体与创作","i-carbon-media-library",[1320,1321,1322],"希望把零散经验整理成长期可复用工作流的人","想先建立认知，再决定是否深入实践的人","希望阅读时顺手建立自己的操作清单或收藏体系的人",[1324,1325,1326],"先浏览标题、摘要和目录，带着问题阅读会更高效","顺手记录真正对你有用的命令、链接和注意事项，避免重复搜索","如果页面里提到相关文档，尽量一起打开对照，效果通常更完整",[1328,1333,1337,1341],{"path":1329,"title":1330,"description":1331,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1332,"publishedAt":1332,"icon":13},"\u002Fdocs\u002Fcloudflare-pages-deploy","Cloudflare Pages 部署指南","Cloudflare Pages 项目部署、自定义域名、环境变量、重定向与 Functions","2026-02-28",{"path":1334,"title":1335,"description":1336,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1332,"publishedAt":1332,"icon":13},"\u002Fdocs\u002Fs3-storage","S3 对象存储","S3 兼容存储使用、Cloudflare R2、MinIO 自建、rclone 同步与 SDK 集成",{"path":1338,"title":1339,"description":1340,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13},"\u002Fdocs\u002Fmonitoring-logging","监控与日志","服务器监控工具、日志管理、Uptime 监控与告警配置",{"path":1342,"title":1343,"description":1344,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13},"\u002Fdocs\u002Fcontainer-orchestration","容器编排入门","Docker Swarm 与 Kubernetes 基础概念、常用命令与本地开发环境",1776215712618]