[{"data":1,"prerenderedAt":1486},["ShallowReactive",2],{"doc-page:\u002Fdocs\u002Fcontainer-orchestration":3},{"doc":4,"prev":1452,"next":1456,"resolvedType":8,"readingMinutes":140,"audience":1463,"checklist":1467,"related":1471},{"path":5,"title":6,"description":7,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13,"body":14},"\u002Fdocs\u002Fcontainer-orchestration","容器编排入门","Docker Swarm 与 Kubernetes 基础概念、常用命令与本地开发环境","article",null,"infra-deployment","服务器与部署","2026-02-27","i-carbon-cloud",{"type":15,"value":16,"toc":1429},"minimark",[17,20,24,28,31,47,55,59,62,66,91,94,253,257,408,461,464,467,484,487,491,494,530,534,802,806,1119,1123,1200,1304,1307,1311,1314,1328,1331,1335,1338,1342,1350,1353,1364,1367,1388,1391,1425],[18,19,6],"h1",{"id":6},[21,22,23],"p",{},"这页适合作为“从单机容器走向多实例部署”的入门入口。容器编排真正要解决的，不只是把多个容器启动起来，而是统一调度、滚动更新、服务发现、配置管理和故障恢复。",[25,26,27],"h2",{"id":27},"什么时候该上编排",[21,29,30],{},"下面这些情况往往值得开始考虑编排：",[32,33,34,38,41,44],"ul",{},[35,36,37],"li",{},"服务实例不止一个",[35,39,40],{},"需要滚动更新和回滚",[35,42,43],{},"需要把配置、密钥和服务发现统一管理",[35,45,46],{},"需要更稳定地扩缩容",[21,48,49,50,54],{},"如果你现在只有一台机器、几项服务，先把 ",[51,52,53],"code",{},"docker compose"," 用顺往往更划算，不必一开始就上 Kubernetes。",[25,56,58],{"id":57},"docker-swarm","Docker Swarm",[21,60,61],{},"Docker 内置的编排工具，适合小规模部署。",[63,64,65],"h3",{"id":65},"初始化",[67,68,73],"pre",{"className":69,"code":70,"language":71,"meta":72,"style":72},"language-bash shiki shiki-themes github-light github-dark","docker swarm init\n","bash","",[51,74,75],{"__ignoreMap":72},[76,77,80,84,88],"span",{"class":78,"line":79},"line",1,[76,81,83],{"class":82},"sScJk","docker",[76,85,87],{"class":86},"sZZnC"," swarm",[76,89,90],{"class":86}," init\n",[63,92,93],{"id":93},"部署服务",[67,95,97],{"className":69,"code":96,"language":71,"meta":72,"style":72},"# 创建服务\ndocker service create --name web --replicas 3 -p 80:80 nginx:alpine\n\n# 查看服务\ndocker service ls\ndocker service ps web\n\n# 扩缩容\ndocker service scale web=5\n\n# 更新镜像\ndocker service update --image nginx:latest web\n\n# 删除服务\ndocker service rm web\n",[51,98,99,105,138,145,151,161,174,179,185,201,206,212,230,235,241],{"__ignoreMap":72},[76,100,101],{"class":78,"line":79},[76,102,104],{"class":103},"sJ8bj","# 创建服务\n",[76,106,108,110,113,116,120,123,126,129,132,135],{"class":78,"line":107},2,[76,109,83],{"class":82},[76,111,112],{"class":86}," service",[76,114,115],{"class":86}," create",[76,117,119],{"class":118},"sj4cs"," --name",[76,121,122],{"class":86}," web",[76,124,125],{"class":118}," --replicas",[76,127,128],{"class":118}," 3",[76,130,131],{"class":118}," -p",[76,133,134],{"class":86}," 80:80",[76,136,137],{"class":86}," nginx:alpine\n",[76,139,141],{"class":78,"line":140},3,[76,142,144],{"emptyLinePlaceholder":143},true,"\n",[76,146,148],{"class":78,"line":147},4,[76,149,150],{"class":103},"# 查看服务\n",[76,152,154,156,158],{"class":78,"line":153},5,[76,155,83],{"class":82},[76,157,112],{"class":86},[76,159,160],{"class":86}," ls\n",[76,162,164,166,168,171],{"class":78,"line":163},6,[76,165,83],{"class":82},[76,167,112],{"class":86},[76,169,170],{"class":86}," ps",[76,172,173],{"class":86}," web\n",[76,175,177],{"class":78,"line":176},7,[76,178,144],{"emptyLinePlaceholder":143},[76,180,182],{"class":78,"line":181},8,[76,183,184],{"class":103},"# 扩缩容\n",[76,186,188,190,192,195,198],{"class":78,"line":187},9,[76,189,83],{"class":82},[76,191,112],{"class":86},[76,193,194],{"class":86}," scale",[76,196,197],{"class":86}," web=",[76,199,200],{"class":118},"5\n",[76,202,204],{"class":78,"line":203},10,[76,205,144],{"emptyLinePlaceholder":143},[76,207,209],{"class":78,"line":208},11,[76,210,211],{"class":103},"# 更新镜像\n",[76,213,215,217,219,222,225,228],{"class":78,"line":214},12,[76,216,83],{"class":82},[76,218,112],{"class":86},[76,220,221],{"class":86}," update",[76,223,224],{"class":118}," --image",[76,226,227],{"class":86}," nginx:latest",[76,229,173],{"class":86},[76,231,233],{"class":78,"line":232},13,[76,234,144],{"emptyLinePlaceholder":143},[76,236,238],{"class":78,"line":237},14,[76,239,240],{"class":103},"# 删除服务\n",[76,242,244,246,248,251],{"class":78,"line":243},15,[76,245,83],{"class":82},[76,247,112],{"class":86},[76,249,250],{"class":86}," rm",[76,252,173],{"class":86},[63,254,256],{"id":255},"stack-部署","Stack 部署",[67,258,262],{"className":259,"code":260,"language":261,"meta":72,"style":72},"language-yaml shiki shiki-themes github-light github-dark","# stack.yml\nversion: \"3.8\"\nservices:\n  web:\n    image: nginx:alpine\n    deploy:\n      replicas: 3\n      restart_policy:\n        condition: on-failure\n    ports:\n      - \"80:80\"\n\n  api:\n    image: myapp:latest\n    deploy:\n      replicas: 2\n    environment:\n      - NODE_ENV=production\n","yaml",[51,263,264,269,282,290,297,307,314,324,331,341,348,356,360,367,376,382,392,400],{"__ignoreMap":72},[76,265,266],{"class":78,"line":79},[76,267,268],{"class":103},"# stack.yml\n",[76,270,271,275,279],{"class":78,"line":107},[76,272,274],{"class":273},"s9eBZ","version",[76,276,278],{"class":277},"sVt8B",": ",[76,280,281],{"class":86},"\"3.8\"\n",[76,283,284,287],{"class":78,"line":140},[76,285,286],{"class":273},"services",[76,288,289],{"class":277},":\n",[76,291,292,295],{"class":78,"line":147},[76,293,294],{"class":273},"  web",[76,296,289],{"class":277},[76,298,299,302,304],{"class":78,"line":153},[76,300,301],{"class":273},"    image",[76,303,278],{"class":277},[76,305,306],{"class":86},"nginx:alpine\n",[76,308,309,312],{"class":78,"line":163},[76,310,311],{"class":273},"    deploy",[76,313,289],{"class":277},[76,315,316,319,321],{"class":78,"line":176},[76,317,318],{"class":273},"      replicas",[76,320,278],{"class":277},[76,322,323],{"class":118},"3\n",[76,325,326,329],{"class":78,"line":181},[76,327,328],{"class":273},"      restart_policy",[76,330,289],{"class":277},[76,332,333,336,338],{"class":78,"line":187},[76,334,335],{"class":273},"        condition",[76,337,278],{"class":277},[76,339,340],{"class":86},"on-failure\n",[76,342,343,346],{"class":78,"line":203},[76,344,345],{"class":273},"    ports",[76,347,289],{"class":277},[76,349,350,353],{"class":78,"line":208},[76,351,352],{"class":277},"      - ",[76,354,355],{"class":86},"\"80:80\"\n",[76,357,358],{"class":78,"line":214},[76,359,144],{"emptyLinePlaceholder":143},[76,361,362,365],{"class":78,"line":232},[76,363,364],{"class":273},"  api",[76,366,289],{"class":277},[76,368,369,371,373],{"class":78,"line":237},[76,370,301],{"class":273},[76,372,278],{"class":277},[76,374,375],{"class":86},"myapp:latest\n",[76,377,378,380],{"class":78,"line":243},[76,379,311],{"class":273},[76,381,289],{"class":277},[76,383,385,387,389],{"class":78,"line":384},16,[76,386,318],{"class":273},[76,388,278],{"class":277},[76,390,391],{"class":118},"2\n",[76,393,395,398],{"class":78,"line":394},17,[76,396,397],{"class":273},"    environment",[76,399,289],{"class":277},[76,401,403,405],{"class":78,"line":402},18,[76,404,352],{"class":277},[76,406,407],{"class":86},"NODE_ENV=production\n",[67,409,411],{"className":69,"code":410,"language":71,"meta":72,"style":72},"docker stack deploy -c stack.yml myapp\ndocker stack ls\ndocker stack services myapp\ndocker stack rm myapp\n",[51,412,413,432,440,451],{"__ignoreMap":72},[76,414,415,417,420,423,426,429],{"class":78,"line":79},[76,416,83],{"class":82},[76,418,419],{"class":86}," stack",[76,421,422],{"class":86}," deploy",[76,424,425],{"class":118}," -c",[76,427,428],{"class":86}," stack.yml",[76,430,431],{"class":86}," myapp\n",[76,433,434,436,438],{"class":78,"line":107},[76,435,83],{"class":82},[76,437,419],{"class":86},[76,439,160],{"class":86},[76,441,442,444,446,449],{"class":78,"line":140},[76,443,83],{"class":82},[76,445,419],{"class":86},[76,447,448],{"class":86}," services",[76,450,431],{"class":86},[76,452,453,455,457,459],{"class":78,"line":147},[76,454,83],{"class":82},[76,456,419],{"class":86},[76,458,250],{"class":86},[76,460,431],{"class":86},[25,462,463],{"id":463},"推荐学习顺序",[21,465,466],{},"建议按这个顺序理解：",[468,469,470,475,478,481],"ol",{},[35,471,472,473],{},"先会用 ",[51,474,53],{},[35,476,477],{},"再理解服务、实例、网络、卷和配置",[35,479,480],{},"再看 Swarm 这类较轻量的编排",[35,482,483],{},"最后再上 Kubernetes 的 Deployment、Service、ConfigMap、Secret",[21,485,486],{},"先把容器基础概念理顺，再学编排会轻松很多。",[25,488,490],{"id":489},"kubernetes-基础","Kubernetes 基础",[63,492,493],{"id":493},"本地环境",[67,495,499],{"className":496,"code":497,"language":498,"meta":72,"style":72},"language-powershell shiki shiki-themes github-light github-dark","# minikube\nscoop install minikube\nminikube start\n\n# 或使用 Docker Desktop 内置 K8s\n# Settings → Kubernetes → Enable\n","powershell",[51,500,501,506,511,516,520,525],{"__ignoreMap":72},[76,502,503],{"class":78,"line":79},[76,504,505],{"class":103},"# minikube\n",[76,507,508],{"class":78,"line":107},[76,509,510],{"class":277},"scoop install minikube\n",[76,512,513],{"class":78,"line":140},[76,514,515],{"class":277},"minikube start\n",[76,517,518],{"class":78,"line":147},[76,519,144],{"emptyLinePlaceholder":143},[76,521,522],{"class":78,"line":153},[76,523,524],{"class":103},"# 或使用 Docker Desktop 内置 K8s\n",[76,526,527],{"class":78,"line":163},[76,528,529],{"class":103},"# Settings → Kubernetes → Enable\n",[63,531,533],{"id":532},"kubectl-常用命令","kubectl 常用命令",[67,535,537],{"className":69,"code":536,"language":71,"meta":72,"style":72},"# 集群信息\nkubectl cluster-info\nkubectl get nodes\n\n# Pod 操作\nkubectl get pods\nkubectl get pods -A                    # 所有命名空间\nkubectl describe pod \u003Cname>\nkubectl logs \u003Cpod-name>\nkubectl logs \u003Cpod-name> -f             # 实时日志\nkubectl exec -it \u003Cpod-name> -- sh      # 进入容器\n\n# 部署\nkubectl apply -f deployment.yaml\nkubectl get deployments\nkubectl rollout status deployment\u002Fweb\nkubectl rollout undo deployment\u002Fweb    # 回滚\n\n# 服务\nkubectl get services\nkubectl expose deployment web --port=80 --type=LoadBalancer\n\n# 删除\nkubectl delete -f deployment.yaml\n",[51,538,539,544,552,562,566,571,580,595,618,634,655,682,686,691,703,712,725,740,744,750,760,779,784,790],{"__ignoreMap":72},[76,540,541],{"class":78,"line":79},[76,542,543],{"class":103},"# 集群信息\n",[76,545,546,549],{"class":78,"line":107},[76,547,548],{"class":82},"kubectl",[76,550,551],{"class":86}," cluster-info\n",[76,553,554,556,559],{"class":78,"line":140},[76,555,548],{"class":82},[76,557,558],{"class":86}," get",[76,560,561],{"class":86}," nodes\n",[76,563,564],{"class":78,"line":147},[76,565,144],{"emptyLinePlaceholder":143},[76,567,568],{"class":78,"line":153},[76,569,570],{"class":103},"# Pod 操作\n",[76,572,573,575,577],{"class":78,"line":163},[76,574,548],{"class":82},[76,576,558],{"class":86},[76,578,579],{"class":86}," pods\n",[76,581,582,584,586,589,592],{"class":78,"line":176},[76,583,548],{"class":82},[76,585,558],{"class":86},[76,587,588],{"class":86}," pods",[76,590,591],{"class":118}," -A",[76,593,594],{"class":103},"                    # 所有命名空间\n",[76,596,597,599,602,605,609,612,615],{"class":78,"line":181},[76,598,548],{"class":82},[76,600,601],{"class":86}," describe",[76,603,604],{"class":86}," pod",[76,606,608],{"class":607},"szBVR"," \u003C",[76,610,611],{"class":86},"nam",[76,613,614],{"class":277},"e",[76,616,617],{"class":607},">\n",[76,619,620,622,625,627,630,632],{"class":78,"line":187},[76,621,548],{"class":82},[76,623,624],{"class":86}," logs",[76,626,608],{"class":607},[76,628,629],{"class":86},"pod-nam",[76,631,614],{"class":277},[76,633,617],{"class":607},[76,635,636,638,640,642,644,646,649,652],{"class":78,"line":203},[76,637,548],{"class":82},[76,639,624],{"class":86},[76,641,608],{"class":607},[76,643,629],{"class":86},[76,645,614],{"class":277},[76,647,648],{"class":607},">",[76,650,651],{"class":118}," -f",[76,653,654],{"class":103},"             # 实时日志\n",[76,656,657,659,662,665,667,669,671,673,676,679],{"class":78,"line":208},[76,658,548],{"class":82},[76,660,661],{"class":86}," exec",[76,663,664],{"class":118}," -it",[76,666,608],{"class":607},[76,668,629],{"class":86},[76,670,614],{"class":277},[76,672,648],{"class":607},[76,674,675],{"class":118}," --",[76,677,678],{"class":86}," sh",[76,680,681],{"class":103},"      # 进入容器\n",[76,683,684],{"class":78,"line":214},[76,685,144],{"emptyLinePlaceholder":143},[76,687,688],{"class":78,"line":232},[76,689,690],{"class":103},"# 部署\n",[76,692,693,695,698,700],{"class":78,"line":237},[76,694,548],{"class":82},[76,696,697],{"class":86}," apply",[76,699,651],{"class":118},[76,701,702],{"class":86}," deployment.yaml\n",[76,704,705,707,709],{"class":78,"line":243},[76,706,548],{"class":82},[76,708,558],{"class":86},[76,710,711],{"class":86}," deployments\n",[76,713,714,716,719,722],{"class":78,"line":384},[76,715,548],{"class":82},[76,717,718],{"class":86}," rollout",[76,720,721],{"class":86}," status",[76,723,724],{"class":86}," deployment\u002Fweb\n",[76,726,727,729,731,734,737],{"class":78,"line":394},[76,728,548],{"class":82},[76,730,718],{"class":86},[76,732,733],{"class":86}," undo",[76,735,736],{"class":86}," deployment\u002Fweb",[76,738,739],{"class":103},"    # 回滚\n",[76,741,742],{"class":78,"line":402},[76,743,144],{"emptyLinePlaceholder":143},[76,745,747],{"class":78,"line":746},19,[76,748,749],{"class":103},"# 服务\n",[76,751,753,755,757],{"class":78,"line":752},20,[76,754,548],{"class":82},[76,756,558],{"class":86},[76,758,759],{"class":86}," services\n",[76,761,763,765,768,771,773,776],{"class":78,"line":762},21,[76,764,548],{"class":82},[76,766,767],{"class":86}," expose",[76,769,770],{"class":86}," deployment",[76,772,122],{"class":86},[76,774,775],{"class":118}," --port=80",[76,777,778],{"class":118}," --type=LoadBalancer\n",[76,780,782],{"class":78,"line":781},22,[76,783,144],{"emptyLinePlaceholder":143},[76,785,787],{"class":78,"line":786},23,[76,788,789],{"class":103},"# 删除\n",[76,791,793,795,798,800],{"class":78,"line":792},24,[76,794,548],{"class":82},[76,796,797],{"class":86}," delete",[76,799,651],{"class":118},[76,801,702],{"class":86},[63,803,805],{"id":804},"deployment-示例","Deployment 示例",[67,807,809],{"className":259,"code":808,"language":261,"meta":72,"style":72},"# deployment.yaml\napiVersion: apps\u002Fv1\nkind: Deployment\nmetadata:\n  name: web\nspec:\n  replicas: 3\n  selector:\n    matchLabels:\n      app: web\n  template:\n    metadata:\n      labels:\n        app: web\n    spec:\n      containers:\n        - name: web\n          image: nginx:alpine\n          ports:\n            - containerPort: 80\n          resources:\n            limits:\n              memory: \"128Mi\"\n              cpu: \"250m\"\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: web\nspec:\n  selector:\n    app: web\n  ports:\n    - port: 80\n      targetPort: 80\n  type: ClusterIP\n",[51,810,811,816,826,836,843,853,860,869,876,883,892,899,906,913,922,929,936,948,957,964,977,984,991,1001,1011,1017,1027,1037,1044,1053,1060,1067,1077,1085,1098,1108],{"__ignoreMap":72},[76,812,813],{"class":78,"line":79},[76,814,815],{"class":103},"# deployment.yaml\n",[76,817,818,821,823],{"class":78,"line":107},[76,819,820],{"class":273},"apiVersion",[76,822,278],{"class":277},[76,824,825],{"class":86},"apps\u002Fv1\n",[76,827,828,831,833],{"class":78,"line":140},[76,829,830],{"class":273},"kind",[76,832,278],{"class":277},[76,834,835],{"class":86},"Deployment\n",[76,837,838,841],{"class":78,"line":147},[76,839,840],{"class":273},"metadata",[76,842,289],{"class":277},[76,844,845,848,850],{"class":78,"line":153},[76,846,847],{"class":273},"  name",[76,849,278],{"class":277},[76,851,852],{"class":86},"web\n",[76,854,855,858],{"class":78,"line":163},[76,856,857],{"class":273},"spec",[76,859,289],{"class":277},[76,861,862,865,867],{"class":78,"line":176},[76,863,864],{"class":273},"  replicas",[76,866,278],{"class":277},[76,868,323],{"class":118},[76,870,871,874],{"class":78,"line":181},[76,872,873],{"class":273},"  selector",[76,875,289],{"class":277},[76,877,878,881],{"class":78,"line":187},[76,879,880],{"class":273},"    matchLabels",[76,882,289],{"class":277},[76,884,885,888,890],{"class":78,"line":203},[76,886,887],{"class":273},"      app",[76,889,278],{"class":277},[76,891,852],{"class":86},[76,893,894,897],{"class":78,"line":208},[76,895,896],{"class":273},"  template",[76,898,289],{"class":277},[76,900,901,904],{"class":78,"line":214},[76,902,903],{"class":273},"    metadata",[76,905,289],{"class":277},[76,907,908,911],{"class":78,"line":232},[76,909,910],{"class":273},"      labels",[76,912,289],{"class":277},[76,914,915,918,920],{"class":78,"line":237},[76,916,917],{"class":273},"        app",[76,919,278],{"class":277},[76,921,852],{"class":86},[76,923,924,927],{"class":78,"line":243},[76,925,926],{"class":273},"    spec",[76,928,289],{"class":277},[76,930,931,934],{"class":78,"line":384},[76,932,933],{"class":273},"      containers",[76,935,289],{"class":277},[76,937,938,941,944,946],{"class":78,"line":394},[76,939,940],{"class":277},"        - ",[76,942,943],{"class":273},"name",[76,945,278],{"class":277},[76,947,852],{"class":86},[76,949,950,953,955],{"class":78,"line":402},[76,951,952],{"class":273},"          image",[76,954,278],{"class":277},[76,956,306],{"class":86},[76,958,959,962],{"class":78,"line":746},[76,960,961],{"class":273},"          ports",[76,963,289],{"class":277},[76,965,966,969,972,974],{"class":78,"line":752},[76,967,968],{"class":277},"            - ",[76,970,971],{"class":273},"containerPort",[76,973,278],{"class":277},[76,975,976],{"class":118},"80\n",[76,978,979,982],{"class":78,"line":762},[76,980,981],{"class":273},"          resources",[76,983,289],{"class":277},[76,985,986,989],{"class":78,"line":781},[76,987,988],{"class":273},"            limits",[76,990,289],{"class":277},[76,992,993,996,998],{"class":78,"line":786},[76,994,995],{"class":273},"              memory",[76,997,278],{"class":277},[76,999,1000],{"class":86},"\"128Mi\"\n",[76,1002,1003,1006,1008],{"class":78,"line":792},[76,1004,1005],{"class":273},"              cpu",[76,1007,278],{"class":277},[76,1009,1010],{"class":86},"\"250m\"\n",[76,1012,1014],{"class":78,"line":1013},25,[76,1015,1016],{"class":82},"---\n",[76,1018,1020,1022,1024],{"class":78,"line":1019},26,[76,1021,820],{"class":273},[76,1023,278],{"class":277},[76,1025,1026],{"class":86},"v1\n",[76,1028,1030,1032,1034],{"class":78,"line":1029},27,[76,1031,830],{"class":273},[76,1033,278],{"class":277},[76,1035,1036],{"class":86},"Service\n",[76,1038,1040,1042],{"class":78,"line":1039},28,[76,1041,840],{"class":273},[76,1043,289],{"class":277},[76,1045,1047,1049,1051],{"class":78,"line":1046},29,[76,1048,847],{"class":273},[76,1050,278],{"class":277},[76,1052,852],{"class":86},[76,1054,1056,1058],{"class":78,"line":1055},30,[76,1057,857],{"class":273},[76,1059,289],{"class":277},[76,1061,1063,1065],{"class":78,"line":1062},31,[76,1064,873],{"class":273},[76,1066,289],{"class":277},[76,1068,1070,1073,1075],{"class":78,"line":1069},32,[76,1071,1072],{"class":273},"    app",[76,1074,278],{"class":277},[76,1076,852],{"class":86},[76,1078,1080,1083],{"class":78,"line":1079},33,[76,1081,1082],{"class":273},"  ports",[76,1084,289],{"class":277},[76,1086,1088,1091,1094,1096],{"class":78,"line":1087},34,[76,1089,1090],{"class":277},"    - ",[76,1092,1093],{"class":273},"port",[76,1095,278],{"class":277},[76,1097,976],{"class":118},[76,1099,1101,1104,1106],{"class":78,"line":1100},35,[76,1102,1103],{"class":273},"      targetPort",[76,1105,278],{"class":277},[76,1107,976],{"class":118},[76,1109,1111,1114,1116],{"class":78,"line":1110},36,[76,1112,1113],{"class":273},"  type",[76,1115,278],{"class":277},[76,1117,1118],{"class":86},"ClusterIP\n",[63,1120,1122],{"id":1121},"configmap-与-secret","ConfigMap 与 Secret",[67,1124,1126],{"className":69,"code":1125,"language":71,"meta":72,"style":72},"# ConfigMap\nkubectl create configmap app-config --from-literal=ENV=production\nkubectl create configmap app-config --from-file=config.yaml\n\n# Secret\nkubectl create secret generic db-creds \\\n  --from-literal=username=admin \\\n  --from-literal=password=secret\n",[51,1127,1128,1133,1148,1161,1165,1170,1188,1195],{"__ignoreMap":72},[76,1129,1130],{"class":78,"line":79},[76,1131,1132],{"class":103},"# ConfigMap\n",[76,1134,1135,1137,1139,1142,1145],{"class":78,"line":107},[76,1136,548],{"class":82},[76,1138,115],{"class":86},[76,1140,1141],{"class":86}," configmap",[76,1143,1144],{"class":86}," app-config",[76,1146,1147],{"class":118}," --from-literal=ENV=production\n",[76,1149,1150,1152,1154,1156,1158],{"class":78,"line":140},[76,1151,548],{"class":82},[76,1153,115],{"class":86},[76,1155,1141],{"class":86},[76,1157,1144],{"class":86},[76,1159,1160],{"class":118}," --from-file=config.yaml\n",[76,1162,1163],{"class":78,"line":147},[76,1164,144],{"emptyLinePlaceholder":143},[76,1166,1167],{"class":78,"line":153},[76,1168,1169],{"class":103},"# Secret\n",[76,1171,1172,1174,1176,1179,1182,1185],{"class":78,"line":163},[76,1173,548],{"class":82},[76,1175,115],{"class":86},[76,1177,1178],{"class":86}," secret",[76,1180,1181],{"class":86}," generic",[76,1183,1184],{"class":86}," db-creds",[76,1186,1187],{"class":118}," \\\n",[76,1189,1190,1193],{"class":78,"line":176},[76,1191,1192],{"class":118},"  --from-literal=username=admin",[76,1194,1187],{"class":118},[76,1196,1197],{"class":78,"line":181},[76,1198,1199],{"class":118},"  --from-literal=password=secret\n",[67,1201,1203],{"className":259,"code":1202,"language":261,"meta":72,"style":72},"# 在 Pod 中使用\nenv:\n  - name: ENV\n    valueFrom:\n      configMapKeyRef:\n        name: app-config\n        key: ENV\n  - name: DB_PASSWORD\n    valueFrom:\n      secretKeyRef:\n        name: db-creds\n        key: password\n",[51,1204,1205,1210,1217,1229,1236,1243,1253,1262,1273,1279,1286,1295],{"__ignoreMap":72},[76,1206,1207],{"class":78,"line":79},[76,1208,1209],{"class":103},"# 在 Pod 中使用\n",[76,1211,1212,1215],{"class":78,"line":107},[76,1213,1214],{"class":273},"env",[76,1216,289],{"class":277},[76,1218,1219,1222,1224,1226],{"class":78,"line":140},[76,1220,1221],{"class":277},"  - ",[76,1223,943],{"class":273},[76,1225,278],{"class":277},[76,1227,1228],{"class":86},"ENV\n",[76,1230,1231,1234],{"class":78,"line":147},[76,1232,1233],{"class":273},"    valueFrom",[76,1235,289],{"class":277},[76,1237,1238,1241],{"class":78,"line":153},[76,1239,1240],{"class":273},"      configMapKeyRef",[76,1242,289],{"class":277},[76,1244,1245,1248,1250],{"class":78,"line":163},[76,1246,1247],{"class":273},"        name",[76,1249,278],{"class":277},[76,1251,1252],{"class":86},"app-config\n",[76,1254,1255,1258,1260],{"class":78,"line":176},[76,1256,1257],{"class":273},"        key",[76,1259,278],{"class":277},[76,1261,1228],{"class":86},[76,1263,1264,1266,1268,1270],{"class":78,"line":181},[76,1265,1221],{"class":277},[76,1267,943],{"class":273},[76,1269,278],{"class":277},[76,1271,1272],{"class":86},"DB_PASSWORD\n",[76,1274,1275,1277],{"class":78,"line":187},[76,1276,1233],{"class":273},[76,1278,289],{"class":277},[76,1280,1281,1284],{"class":78,"line":203},[76,1282,1283],{"class":273},"      secretKeyRef",[76,1285,289],{"class":277},[76,1287,1288,1290,1292],{"class":78,"line":208},[76,1289,1247],{"class":273},[76,1291,278],{"class":277},[76,1293,1294],{"class":86},"db-creds\n",[76,1296,1297,1299,1301],{"class":78,"line":214},[76,1298,1257],{"class":273},[76,1300,278],{"class":277},[76,1302,1303],{"class":86},"password\n",[25,1305,1306],{"id":1306},"常见问题",[63,1308,1310],{"id":1309},"docker-compose-用得好好的为什么还要上编排","Docker Compose 用得好好的，为什么还要上编排",[21,1312,1313],{},"当你开始需要：",[32,1315,1316,1319,1322,1325],{},[35,1317,1318],{},"多副本",[35,1320,1321],{},"滚动更新",[35,1323,1324],{},"自动恢复",[35,1326,1327],{},"更清晰的集群资源管理",[21,1329,1330],{},"编排的价值就会越来越明显。",[63,1332,1334],{"id":1333},"kubernetes-太复杂值不值得学","Kubernetes 太复杂，值不值得学",[21,1336,1337],{},"如果你会长期接触云原生、团队交付或多服务系统，值得；如果只是个人项目和小型部署，先掌握 Compose 和基础容器运维更实用。",[63,1339,1341],{"id":1340},"一开始该选-swarm-还是-kubernetes","一开始该选 Swarm 还是 Kubernetes",[32,1343,1344,1347],{},[35,1345,1346],{},"小规模、学习成本优先：Swarm",[35,1348,1349],{},"生态、通用性、长期能力优先：Kubernetes",[25,1351,1352],{"id":1352},"风险提醒",[32,1354,1355,1358,1361],{},[35,1356,1357],{},"不要为了“技术先进”强行上复杂编排",[35,1359,1360],{},"配置和 Secret 进入集群前要先规划权限边界",[35,1362,1363],{},"集群问题通常比单机问题更隐蔽，监控和日志必须跟上",[25,1365,1366],{"id":1366},"延伸阅读",[32,1368,1369,1376,1382],{},[35,1370,1371],{},[1372,1373,1375],"a",{"href":1374},"\u002Fdocs\u002Fdocker-compose-recipes","Docker Compose 实战片段",[35,1377,1378],{},[1372,1379,1381],{"href":1380},"\u002Fdocs\u002Fdocker-setup","Docker Desktop 安装与使用",[35,1383,1384],{},[1372,1385,1387],{"href":1386},"\u002Fdocs\u002Fvps-init","VPS 初始化配置",[25,1389,1390],{"id":1390},"参考链接",[32,1392,1393,1402,1410,1417],{},[35,1394,1395,1401],{},[1372,1396,1400],{"href":1397,"rel":1398},"https:\u002F\u002Fkubernetes.io\u002Fzh-cn\u002Fdocs\u002F",[1399],"nofollow","Kubernetes 文档"," — 官方中文文档",[35,1403,1404,1409],{},[1372,1405,1408],{"href":1406,"rel":1407},"https:\u002F\u002Fminikube.sigs.k8s.io\u002F",[1399],"minikube"," — 本地 K8s",[35,1411,1412,1416],{},[1372,1413,58],{"href":1414,"rel":1415},"https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Fswarm\u002F",[1399]," — 官方文档",[35,1418,1419,1424],{},[1372,1420,1423],{"href":1421,"rel":1422},"https:\u002F\u002Fk9scli.io\u002F",[1399],"K9s"," — 终端 K8s 管理工具",[1426,1427,1428],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}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 .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":72,"searchDepth":107,"depth":107,"links":1430},[1431,1432,1437,1438,1444,1449,1450,1451],{"id":27,"depth":107,"text":27},{"id":57,"depth":107,"text":58,"children":1433},[1434,1435,1436],{"id":65,"depth":140,"text":65},{"id":93,"depth":140,"text":93},{"id":255,"depth":140,"text":256},{"id":463,"depth":107,"text":463},{"id":489,"depth":107,"text":490,"children":1439},[1440,1441,1442,1443],{"id":493,"depth":140,"text":493},{"id":532,"depth":140,"text":533},{"id":804,"depth":140,"text":805},{"id":1121,"depth":140,"text":1122},{"id":1306,"depth":107,"text":1306,"children":1445},[1446,1447,1448],{"id":1309,"depth":140,"text":1310},{"id":1333,"depth":140,"text":1334},{"id":1340,"depth":140,"text":1341},{"id":1352,"depth":107,"text":1352},{"id":1366,"depth":107,"text":1366},{"id":1390,"depth":107,"text":1390},{"path":1453,"title":1454,"description":1455,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13},"\u002Fdocs\u002Fmonitoring-logging","监控与日志","服务器监控工具、日志管理、Uptime 监控与告警配置",{"path":1457,"title":1458,"description":1459,"docType":8,"resourceKind":9,"categoryId":1460,"categoryLabel":1461,"updatedAt":12,"publishedAt":12,"icon":1462},"\u002Fdocs\u002Fdata-recovery","数据恢复与磁盘工具","磁盘分区、数据恢复、硬盘检测与文件系统修复工具","windows-system","Windows 系统","i-mdi-microsoft-windows",[1464,1465,1466],"希望把零散经验整理成长期可复用工作流的人","想先建立认知，再决定是否深入实践的人","希望阅读时顺手建立自己的操作清单或收藏体系的人",[1468,1469,1470],"先浏览标题、摘要和目录，带着问题阅读会更高效","顺手记录真正对你有用的命令、链接和注意事项，避免重复搜索","如果页面里提到相关文档，尽量一起打开对照，效果通常更完整",[1472,1477,1481,1482],{"path":1473,"title":1474,"description":1475,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1476,"publishedAt":1476,"icon":13},"\u002Fdocs\u002Fcloudflare-pages-deploy","Cloudflare Pages 部署指南","Cloudflare Pages 项目部署、自定义域名、环境变量、重定向与 Functions","2026-02-28",{"path":1478,"title":1479,"description":1480,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1476,"publishedAt":1476,"icon":13},"\u002Fdocs\u002Fs3-storage","S3 对象存储","S3 兼容存储使用、Cloudflare R2、MinIO 自建、rclone 同步与 SDK 集成",{"path":1453,"title":1454,"description":1455,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13},{"path":1483,"title":1484,"description":1485,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13},"\u002Fdocs\u002Fci-cd-guide","CI\u002FCD 实践指南","持续集成与部署概念、GitHub Actions 进阶、自动化测试与部署策略",1776215712463]