[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"knowledge-\u002Fapi\u002Fknowledge\u002Fbooklet\u002Fuphold\u002Fdocker\u002Fdocker-runtime":3,"knowledge-related-\u002Fknowledge\u002Fbooklet\u002Fuphold\u002Fdocker\u002Fdocker-runtime":2396,"knowledge-series-\u002Fknowledge\u002Fbooklet\u002Fuphold\u002Fdocker\u002Fdocker-runtime":2418},{"source":4,"connector":5,"page":6},"sqlite","better-sqlite3",{"path":7,"title":8,"description":9,"category":10,"tags":11,"date":16,"pinned":17,"draft":17,"body":18,"seo":2392,"stem":2393,"id":2394,"extension":2395},"\u002Fknowledge\u002Fbooklet\u002Fuphold\u002Fdocker\u002Fdocker-runtime","容器、数据与网络","容器是镜像的运行实例，掌握容器的创建、管理、日志查看，配合数据卷持久化与自定义网络通信，是使用 Docker 的日常核心，也是生产部署前必须掌握的三大基础能力。","技能小册",[12,13,14,15],"docker","container","volume","network","2026-07-23",false,{"type":19,"value":20,"toc":2360},"minimark",[21,25,44,49,54,62,109,115,260,264,316,340,344,426,430,549,568,572,653,657,698,702,746,754,758,825,828,921,924,928,931,951,955,962,967,987,994,999,1069,1074,1085,1089,1100,1105,1177,1182,1238,1244,1356,1360,1371,1375,1382,1387,1408,1412,1443,1447,1458,1462,1575,1582,1593,1598,1636,1641,1661,1666,1686,1689,1709,1713,1726,1730,1745,1748,1756,1780,1784,1800,1822,1826,1934,1952,1956,2002,2007,2011,2014,2139,2152,2156,2248,2252,2285,2292,2295,2356],[22,23,8],"h1",{"id":24},"容器数据与网络",[26,27,28,29,37,38,43],"p",{},"容器是镜像的运行实例。掌握容器的创建、管理、进入、日志查看等命令是使用 Docker 的日常核心；再结合",[30,31,32,33,36],"strong",{},"数据卷（持久化）",[30,34,35],{},"与","网络（通信）","，才能搭建出可用于生产的容器化服务。镜像基础见 ",[39,40,42],"a",{"href":41},"\u002Fknowledge\u002Fbooklet\u002Fuphold\u002Fdocker\u002Fdocker-images","镜像与 Dockerfile","。",[45,46,48],"h2",{"id":47},"一容器基础操作","一、容器基础操作",[50,51,53],"h3",{"id":52},"_1-创建并运行容器","1. 创建并运行容器",[26,55,56,57,61],{},"最常用的命令是 ",[58,59,60],"code",{},"docker run","，它先拉取镜像（如果本地没有），然后创建并启动容器。",[63,64,69],"pre",{"className":65,"code":66,"language":67,"meta":68,"style":68},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","# 运行一个 nginx 容器，后台运行，命名为 my-nginx，将宿主机的 8080 端口映射到容器的 80 端口\ndocker run -d --name my-nginx -p 8080:80 nginx\n","bash","",[58,70,71,80],{"__ignoreMap":68},[72,73,76],"span",{"class":74,"line":75},"line",1,[72,77,79],{"class":78},"sutJx","# 运行一个 nginx 容器，后台运行，命名为 my-nginx，将宿主机的 8080 端口映射到容器的 80 端口\n",[72,81,83,86,90,94,97,100,103,106],{"class":74,"line":82},2,[72,84,12],{"class":85},"sbgvK",[72,87,89],{"class":88},"s_sjI"," run",[72,91,93],{"class":92},"stzsN"," -d",[72,95,96],{"class":92}," --name",[72,98,99],{"class":88}," my-nginx",[72,101,102],{"class":92}," -p",[72,104,105],{"class":88}," 8080:80",[72,107,108],{"class":88}," nginx\n",[26,110,111,114],{},[30,112,113],{},"常用参数","：",[116,117,118,131],"table",{},[119,120,121],"thead",{},[122,123,124,128],"tr",{},[125,126,127],"th",{},"参数",[125,129,130],{},"说明",[132,133,134,145,155,169,182,192,202,215,236,246],"tbody",{},[122,135,136,142],{},[137,138,139],"td",{},[58,140,141],{},"-d",[137,143,144],{},"后台运行（detach），容器在后台运行，不占用当前终端",[122,146,147,152],{},[137,148,149],{},[58,150,151],{},"--name",[137,153,154],{},"为容器指定一个名字，方便后续管理",[122,156,157,162],{},[137,158,159],{},[58,160,161],{},"-p",[137,163,164,165,168],{},"端口映射，格式 ",[58,166,167],{},"宿主机端口:容器端口","，可多次使用",[122,170,171,176],{},[137,172,173],{},[58,174,175],{},"-it",[137,177,178,179,181],{},"交互式运行（例如进入容器执行 shell 时需要 ",[58,180,175],{},"）",[122,183,184,189],{},[137,185,186],{},[58,187,188],{},"--rm",[137,190,191],{},"容器退出后自动删除（常用于临时任务）",[122,193,194,199],{},[137,195,196],{},[58,197,198],{},"-v",[137,200,201],{},"挂载数据卷（宿主机目录:容器目录），见下文数据管理",[122,203,204,209],{},[137,205,206],{},[58,207,208],{},"-e",[137,210,211,212],{},"设置环境变量，如 ",[58,213,214],{},"-e MY_VAR=value",[122,216,217,222],{},[137,218,219],{},[58,220,221],{},"--restart",[137,223,224,225,228,229,232,233],{},"重启策略，如 ",[58,226,227],{},"--restart unless-stopped","（生产环境常用）、",[58,230,231],{},"always","、",[58,234,235],{},"on-failure:3",[122,237,238,243],{},[137,239,240],{},[58,241,242],{},"--network",[137,244,245],{},"指定加入的网络，见下文网络部分",[122,247,248,257],{},[137,249,250,253,254],{},[58,251,252],{},"--memory"," \u002F ",[58,255,256],{},"--cpus",[137,258,259],{},"限制内存、CPU 资源，防止单容器耗尽宿主机资源",[50,261,263],{"id":262},"_2-进入运行中的容器交互式-shell","2. 进入运行中的容器（交互式 shell）",[63,265,267],{"className":65,"code":266,"language":67,"meta":68,"style":68},"# 进入正在运行的容器，执行 \u002Fbin\u002Fbash（若容器内没有 bash 可用 \u002Fbin\u002Fsh）\ndocker exec -it my-nginx \u002Fbin\u002Fbash\n\n# 对于 alpine 系统（如 nginx:alpine），使用 \u002Fbin\u002Fsh\ndocker exec -it my-nginx \u002Fbin\u002Fsh\n",[58,268,269,274,289,296,302],{"__ignoreMap":68},[72,270,271],{"class":74,"line":75},[72,272,273],{"class":78},"# 进入正在运行的容器，执行 \u002Fbin\u002Fbash（若容器内没有 bash 可用 \u002Fbin\u002Fsh）\n",[72,275,276,278,281,284,286],{"class":74,"line":82},[72,277,12],{"class":85},[72,279,280],{"class":88}," exec",[72,282,283],{"class":92}," -it",[72,285,99],{"class":88},[72,287,288],{"class":88}," \u002Fbin\u002Fbash\n",[72,290,292],{"class":74,"line":291},3,[72,293,295],{"emptyLinePlaceholder":294},true,"\n",[72,297,299],{"class":74,"line":298},4,[72,300,301],{"class":78},"# 对于 alpine 系统（如 nginx:alpine），使用 \u002Fbin\u002Fsh\n",[72,303,305,307,309,311,313],{"class":74,"line":304},5,[72,306,12],{"class":85},[72,308,280],{"class":88},[72,310,283],{"class":92},[72,312,99],{"class":88},[72,314,315],{"class":88}," \u002Fbin\u002Fsh\n",[317,318,319,325],"ul",{},[320,321,322,324],"li",{},[58,323,175],{}," 分配伪终端并保持 STDIN 打开，这样才能交互。",[320,326,327,328,331,332,335,336,339],{},"退出容器：输入 ",[58,329,330],{},"exit"," 或按 ",[58,333,334],{},"Ctrl+D","（不会影响容器本身的运行，因为 ",[58,337,338],{},"exec"," 只是附加了一个新进程）。",[50,341,343],{"id":342},"_3-查看容器","3. 查看容器",[63,345,347],{"className":65,"code":346,"language":67,"meta":68,"style":68},"# 查看正在运行的容器\ndocker ps\n\n# 查看所有容器（包括已停止的）\ndocker ps -a\n\n# 查看最后创建的 5 个容器\ndocker ps -n 5\n\n# 只显示容器 ID\ndocker ps -q\n",[58,348,349,354,361,365,370,380,385,391,405,410,416],{"__ignoreMap":68},[72,350,351],{"class":74,"line":75},[72,352,353],{"class":78},"# 查看正在运行的容器\n",[72,355,356,358],{"class":74,"line":82},[72,357,12],{"class":85},[72,359,360],{"class":88}," ps\n",[72,362,363],{"class":74,"line":291},[72,364,295],{"emptyLinePlaceholder":294},[72,366,367],{"class":74,"line":298},[72,368,369],{"class":78},"# 查看所有容器（包括已停止的）\n",[72,371,372,374,377],{"class":74,"line":304},[72,373,12],{"class":85},[72,375,376],{"class":88}," ps",[72,378,379],{"class":92}," -a\n",[72,381,383],{"class":74,"line":382},6,[72,384,295],{"emptyLinePlaceholder":294},[72,386,388],{"class":74,"line":387},7,[72,389,390],{"class":78},"# 查看最后创建的 5 个容器\n",[72,392,394,396,398,401],{"class":74,"line":393},8,[72,395,12],{"class":85},[72,397,376],{"class":88},[72,399,400],{"class":92}," -n",[72,402,404],{"class":403},"srdBf"," 5\n",[72,406,408],{"class":74,"line":407},9,[72,409,295],{"emptyLinePlaceholder":294},[72,411,413],{"class":74,"line":412},10,[72,414,415],{"class":78},"# 只显示容器 ID\n",[72,417,419,421,423],{"class":74,"line":418},11,[72,420,12],{"class":85},[72,422,376],{"class":88},[72,424,425],{"class":92}," -q\n",[50,427,429],{"id":428},"_4-停止启动重启删除容器","4. 停止、启动、重启、删除容器",[63,431,433],{"className":65,"code":432,"language":67,"meta":68,"style":68},"# 停止容器（发送 SIGTERM，超时后 SIGKILL）\ndocker stop my-nginx\n\n# 启动已停止的容器\ndocker start my-nginx\n\n# 重启容器\ndocker restart my-nginx\n\n# 删除已停止的容器\ndocker rm my-nginx\n\n# 强制删除正在运行的容器（会先停止再删除）\ndocker rm -f my-nginx\n\n# 删除所有已停止的容器\ndocker container prune\n",[58,434,435,440,450,454,459,468,472,477,486,490,495,504,509,515,527,532,538],{"__ignoreMap":68},[72,436,437],{"class":74,"line":75},[72,438,439],{"class":78},"# 停止容器（发送 SIGTERM，超时后 SIGKILL）\n",[72,441,442,444,447],{"class":74,"line":82},[72,443,12],{"class":85},[72,445,446],{"class":88}," stop",[72,448,449],{"class":88}," my-nginx\n",[72,451,452],{"class":74,"line":291},[72,453,295],{"emptyLinePlaceholder":294},[72,455,456],{"class":74,"line":298},[72,457,458],{"class":78},"# 启动已停止的容器\n",[72,460,461,463,466],{"class":74,"line":304},[72,462,12],{"class":85},[72,464,465],{"class":88}," start",[72,467,449],{"class":88},[72,469,470],{"class":74,"line":382},[72,471,295],{"emptyLinePlaceholder":294},[72,473,474],{"class":74,"line":387},[72,475,476],{"class":78},"# 重启容器\n",[72,478,479,481,484],{"class":74,"line":393},[72,480,12],{"class":85},[72,482,483],{"class":88}," restart",[72,485,449],{"class":88},[72,487,488],{"class":74,"line":407},[72,489,295],{"emptyLinePlaceholder":294},[72,491,492],{"class":74,"line":412},[72,493,494],{"class":78},"# 删除已停止的容器\n",[72,496,497,499,502],{"class":74,"line":418},[72,498,12],{"class":85},[72,500,501],{"class":88}," rm",[72,503,449],{"class":88},[72,505,507],{"class":74,"line":506},12,[72,508,295],{"emptyLinePlaceholder":294},[72,510,512],{"class":74,"line":511},13,[72,513,514],{"class":78},"# 强制删除正在运行的容器（会先停止再删除）\n",[72,516,518,520,522,525],{"class":74,"line":517},14,[72,519,12],{"class":85},[72,521,501],{"class":88},[72,523,524],{"class":92}," -f",[72,526,449],{"class":88},[72,528,530],{"class":74,"line":529},15,[72,531,295],{"emptyLinePlaceholder":294},[72,533,535],{"class":74,"line":534},16,[72,536,537],{"class":78},"# 删除所有已停止的容器\n",[72,539,541,543,546],{"class":74,"line":540},17,[72,542,12],{"class":85},[72,544,545],{"class":88}," container",[72,547,548],{"class":88}," prune\n",[550,551,552],"blockquote",{},[26,553,554,114,557,560,561,564,565,43],{},[30,555,556],{},"提示",[58,558,559],{},"docker rm"," 时如果容器正在运行，需要先 ",[58,562,563],{},"stop"," 或使用 ",[58,566,567],{},"-f",[50,569,571],{"id":570},"_5-查看容器日志","5. 查看容器日志",[63,573,575],{"className":65,"code":574,"language":67,"meta":68,"style":68},"# 输出全部日志\ndocker logs my-nginx\n\n# 实时跟踪日志（类似 tail -f）\ndocker logs -f my-nginx\n\n# 只看最后 100 行\ndocker logs --tail 100 my-nginx\n\n# 并加上时间戳\ndocker logs -t my-nginx\n",[58,576,577,582,591,595,600,610,614,619,633,637,642],{"__ignoreMap":68},[72,578,579],{"class":74,"line":75},[72,580,581],{"class":78},"# 输出全部日志\n",[72,583,584,586,589],{"class":74,"line":82},[72,585,12],{"class":85},[72,587,588],{"class":88}," logs",[72,590,449],{"class":88},[72,592,593],{"class":74,"line":291},[72,594,295],{"emptyLinePlaceholder":294},[72,596,597],{"class":74,"line":298},[72,598,599],{"class":78},"# 实时跟踪日志（类似 tail -f）\n",[72,601,602,604,606,608],{"class":74,"line":304},[72,603,12],{"class":85},[72,605,588],{"class":88},[72,607,524],{"class":92},[72,609,449],{"class":88},[72,611,612],{"class":74,"line":382},[72,613,295],{"emptyLinePlaceholder":294},[72,615,616],{"class":74,"line":387},[72,617,618],{"class":78},"# 只看最后 100 行\n",[72,620,621,623,625,628,631],{"class":74,"line":393},[72,622,12],{"class":85},[72,624,588],{"class":88},[72,626,627],{"class":92}," --tail",[72,629,630],{"class":403}," 100",[72,632,449],{"class":88},[72,634,635],{"class":74,"line":407},[72,636,295],{"emptyLinePlaceholder":294},[72,638,639],{"class":74,"line":412},[72,640,641],{"class":78},"# 并加上时间戳\n",[72,643,644,646,648,651],{"class":74,"line":418},[72,645,12],{"class":85},[72,647,588],{"class":88},[72,649,650],{"class":92}," -t",[72,652,449],{"class":88},[50,654,656],{"id":655},"_6-查看容器内进程与资源","6. 查看容器内进程与资源",[63,658,660],{"className":65,"code":659,"language":67,"meta":68,"style":68},"docker top my-nginx      # 类似 ps aux，显示容器内运行的进程\ndocker stats my-nginx    # 实时查看 CPU、内存、网络、I\u002FO 使用情况\ndocker inspect my-nginx  # 查看详细配置信息（IP、挂载、网络、环境变量等）\n",[58,661,662,674,686],{"__ignoreMap":68},[72,663,664,666,669,671],{"class":74,"line":75},[72,665,12],{"class":85},[72,667,668],{"class":88}," top",[72,670,99],{"class":88},[72,672,673],{"class":78},"      # 类似 ps aux，显示容器内运行的进程\n",[72,675,676,678,681,683],{"class":74,"line":82},[72,677,12],{"class":85},[72,679,680],{"class":88}," stats",[72,682,99],{"class":88},[72,684,685],{"class":78},"    # 实时查看 CPU、内存、网络、I\u002FO 使用情况\n",[72,687,688,690,693,695],{"class":74,"line":291},[72,689,12],{"class":85},[72,691,692],{"class":88}," inspect",[72,694,99],{"class":88},[72,696,697],{"class":78},"  # 查看详细配置信息（IP、挂载、网络、环境变量等）\n",[50,699,701],{"id":700},"_7-在宿主机和容器之间复制文件","7. 在宿主机和容器之间复制文件",[63,703,705],{"className":65,"code":704,"language":67,"meta":68,"style":68},"# 将宿主机文件复制到容器的指定路径\ndocker cp .\u002Findex.html my-nginx:\u002Fusr\u002Fshare\u002Fnginx\u002Fhtml\u002F\n\n# 从容器的路径复制到宿主机\ndocker cp my-nginx:\u002Fetc\u002Fnginx\u002Fnginx.conf .\u002Fnginx.conf\n",[58,706,707,712,725,729,734],{"__ignoreMap":68},[72,708,709],{"class":74,"line":75},[72,710,711],{"class":78},"# 将宿主机文件复制到容器的指定路径\n",[72,713,714,716,719,722],{"class":74,"line":82},[72,715,12],{"class":85},[72,717,718],{"class":88}," cp",[72,720,721],{"class":88}," .\u002Findex.html",[72,723,724],{"class":88}," my-nginx:\u002Fusr\u002Fshare\u002Fnginx\u002Fhtml\u002F\n",[72,726,727],{"class":74,"line":291},[72,728,295],{"emptyLinePlaceholder":294},[72,730,731],{"class":74,"line":298},[72,732,733],{"class":78},"# 从容器的路径复制到宿主机\n",[72,735,736,738,740,743],{"class":74,"line":304},[72,737,12],{"class":85},[72,739,718],{"class":88},[72,741,742],{"class":88}," my-nginx:\u002Fetc\u002Fnginx\u002Fnginx.conf",[72,744,745],{"class":88}," .\u002Fnginx.conf\n",[317,747,748,751],{},[320,749,750],{},"路径可以是绝对路径或相对于当前目录。",[320,752,753],{},"对运行中或已停止的容器都有效。",[50,755,757],{"id":756},"_8-其他常用容器操作","8. 其他常用容器操作",[116,759,760,769],{},[119,761,762],{},[122,763,764,767],{},[125,765,766],{},"命令",[125,768,130],{},[132,770,771,781,791,801,811],{},[122,772,773,778],{},[137,774,775],{},[58,776,777],{},"docker logs -f my-nginx | grep \"error\"",[137,779,780],{},"过滤日志中的错误信息",[122,782,783,788],{},[137,784,785],{},[58,786,787],{},"docker rename old-name new-name",[137,789,790],{},"重命名容器",[122,792,793,798],{},[137,794,795],{},[58,796,797],{},"docker wait my-nginx",[137,799,800],{},"阻塞等待容器停止，返回退出码",[122,802,803,808],{},[137,804,805],{},[58,806,807],{},"docker update --restart always my-nginx",[137,809,810],{},"运行时修改重启策略等配置",[122,812,813,818],{},[137,814,815],{},[58,816,817],{},"docker container inspect --format '{{.State.Health.Status}}' my-nginx",[137,819,820,821,824],{},"查看 ",[58,822,823],{},"HEALTHCHECK"," 健康状态",[50,826,827],{"id":827},"容器操作总结表",[116,829,830,839],{},[119,831,832],{},[122,833,834,837],{},[125,835,836],{},"操作",[125,838,766],{},[132,840,841,851,861,871,881,891,901,911],{},[122,842,843,846],{},[137,844,845],{},"创建并后台运行",[137,847,848],{},[58,849,850],{},"docker run -d --name \u003Cname> \u003Cimage>",[122,852,853,856],{},[137,854,855],{},"端口映射",[137,857,858],{},[58,859,860],{},"-p 8080:80",[122,862,863,866],{},[137,864,865],{},"进入容器",[137,867,868],{},[58,869,870],{},"docker exec -it \u003Ccontainer> \u002Fbin\u002Fbash",[122,872,873,876],{},[137,874,875],{},"查看运行容器",[137,877,878],{},[58,879,880],{},"docker ps",[122,882,883,886],{},[137,884,885],{},"停止\u002F启动\u002F重启",[137,887,888],{},[58,889,890],{},"docker stop\u002Fstart\u002Frestart \u003Ccontainer>",[122,892,893,896],{},[137,894,895],{},"删除容器",[137,897,898],{},[58,899,900],{},"docker rm \u003Ccontainer>",[122,902,903,906],{},[137,904,905],{},"查看日志",[137,907,908],{},[58,909,910],{},"docker logs -f \u003Ccontainer>",[122,912,913,916],{},[137,914,915],{},"文件复制",[137,917,918],{},[58,919,920],{},"docker cp \u003Csrc> \u003Cdest>",[26,922,923],{},"掌握这些基础命令，即可在开发或测试环境中灵活管理 Docker 容器。对于生产环境，还需结合下面的数据卷、网络等高级特性。",[45,925,927],{"id":926},"二数据管理卷与挂载","二、数据管理（卷与挂载）",[26,929,930],{},"默认情况下，容器内的数据是临时的：当容器被删除，其中产生的数据也会丢失。为了持久化数据或在多个容器之间共享数据，Docker 提供了三种挂载方式：",[317,932,933,939,945],{},[320,934,935,938],{},[30,936,937],{},"绑定挂载（Bind Mount）","：将宿主机上的任意目录或文件挂载到容器内。",[320,940,941,944],{},[30,942,943],{},"卷（Volume）","：由 Docker 管理的数据存储区域，独立于容器生命周期。",[320,946,947,950],{},[30,948,949],{},"临时文件（tmpfs）","：存储在宿主机内存中，不会写入磁盘，容器停止后即丢失。",[50,952,954],{"id":953},"_1-绑定挂载bind-mount","1. 绑定挂载（Bind Mount）",[26,956,957,958,961],{},"将宿主机上的特定目录或文件映射到容器内。",[30,959,960],{},"适合开发环境","，因为可以直接在宿主机修改代码，容器内立即生效。",[26,963,964,114],{},[30,965,966],{},"基本语法",[63,968,970],{"className":65,"code":969,"language":67,"meta":68,"style":68},"docker run -v \u002F宿主机\u002F绝对路径:\u002F容器内路径:选项 镜像名\n",[58,971,972],{"__ignoreMap":68},[72,973,974,976,978,981,984],{"class":74,"line":75},[72,975,12],{"class":85},[72,977,89],{"class":88},[72,979,980],{"class":92}," -v",[72,982,983],{"class":88}," \u002F宿主机\u002F绝对路径:\u002F容器内路径:选项",[72,985,986],{"class":88}," 镜像名\n",[26,988,989,990,993],{},"或使用新版 ",[58,991,992],{},"--mount"," 语法（更明确）。",[26,995,996,114],{},[30,997,998],{},"示例",[63,1000,1002],{"className":65,"code":1001,"language":67,"meta":68,"style":68},"# 将宿主机的当前目录下的 html 文件夹挂载到容器的 \u002Fusr\u002Fshare\u002Fnginx\u002Fhtml\ndocker run -d -p 8080:80 -v $(pwd)\u002Fhtml:\u002Fusr\u002Fshare\u002Fnginx\u002Fhtml nginx\n\n# 只读挂载，容器内无法修改（追加 :ro）\ndocker run -d -v $(pwd)\u002Fhtml:\u002Fusr\u002Fshare\u002Fnginx\u002Fhtml:ro nginx\n",[58,1003,1004,1009,1039,1043,1048],{"__ignoreMap":68},[72,1005,1006],{"class":74,"line":75},[72,1007,1008],{"class":78},"# 将宿主机的当前目录下的 html 文件夹挂载到容器的 \u002Fusr\u002Fshare\u002Fnginx\u002Fhtml\n",[72,1010,1011,1013,1015,1017,1019,1021,1023,1027,1031,1034,1037],{"class":74,"line":82},[72,1012,12],{"class":85},[72,1014,89],{"class":88},[72,1016,93],{"class":92},[72,1018,102],{"class":92},[72,1020,105],{"class":88},[72,1022,980],{"class":92},[72,1024,1026],{"class":1025},"sP7_E"," $(",[72,1028,1030],{"class":1029},"sptTA","pwd",[72,1032,1033],{"class":1025},")",[72,1035,1036],{"class":88},"\u002Fhtml:\u002Fusr\u002Fshare\u002Fnginx\u002Fhtml",[72,1038,108],{"class":88},[72,1040,1041],{"class":74,"line":291},[72,1042,295],{"emptyLinePlaceholder":294},[72,1044,1045],{"class":74,"line":298},[72,1046,1047],{"class":78},"# 只读挂载，容器内无法修改（追加 :ro）\n",[72,1049,1050,1052,1054,1056,1058,1060,1062,1064,1067],{"class":74,"line":304},[72,1051,12],{"class":85},[72,1053,89],{"class":88},[72,1055,93],{"class":92},[72,1057,980],{"class":92},[72,1059,1026],{"class":1025},[72,1061,1030],{"class":1029},[72,1063,1033],{"class":1025},[72,1065,1066],{"class":88},"\u002Fhtml:\u002Fusr\u002Fshare\u002Fnginx\u002Fhtml:ro",[72,1068,108],{"class":88},[26,1070,1071,114],{},[30,1072,1073],{},"特点",[317,1075,1076,1079,1082],{},[320,1077,1078],{},"依赖宿主机的目录结构，可移植性较差。",[320,1080,1081],{},"容器可以直接读写宿主机文件（权限可能受限，Linux 下注意宿主机与容器内用户 UID 是否一致）。",[320,1083,1084],{},"可用于配置注入、代码热加载等。",[50,1086,1088],{"id":1087},"_2-卷volume","2. 卷（Volume）",[26,1090,1091,1092,1095,1096,1099],{},"完全由 Docker 管理，存放在 Docker 存储目录下（Linux 为 ",[58,1093,1094],{},"\u002Fvar\u002Flib\u002Fdocker\u002Fvolumes\u002F","）。",[30,1097,1098],{},"适合生产环境","，数据独立于容器，且便于备份和迁移。",[26,1101,1102,114],{},[30,1103,1104],{},"创建和使用卷",[63,1106,1108],{"className":65,"code":1107,"language":67,"meta":68,"style":68},"# 创建卷\ndocker volume create mydata\n\n# 使用卷运行容器（-v 卷名:容器内路径）\ndocker run -d -v mydata:\u002Fapp\u002Fdata alpine\n\n# 也可以不预先创建，在 run 时隐式创建\ndocker run -d -v mydata2:\u002Fapp\u002Fdata alpine\n",[58,1109,1110,1115,1128,1132,1137,1153,1157,1162],{"__ignoreMap":68},[72,1111,1112],{"class":74,"line":75},[72,1113,1114],{"class":78},"# 创建卷\n",[72,1116,1117,1119,1122,1125],{"class":74,"line":82},[72,1118,12],{"class":85},[72,1120,1121],{"class":88}," volume",[72,1123,1124],{"class":88}," create",[72,1126,1127],{"class":88}," mydata\n",[72,1129,1130],{"class":74,"line":291},[72,1131,295],{"emptyLinePlaceholder":294},[72,1133,1134],{"class":74,"line":298},[72,1135,1136],{"class":78},"# 使用卷运行容器（-v 卷名:容器内路径）\n",[72,1138,1139,1141,1143,1145,1147,1150],{"class":74,"line":304},[72,1140,12],{"class":85},[72,1142,89],{"class":88},[72,1144,93],{"class":92},[72,1146,980],{"class":92},[72,1148,1149],{"class":88}," mydata:\u002Fapp\u002Fdata",[72,1151,1152],{"class":88}," alpine\n",[72,1154,1155],{"class":74,"line":382},[72,1156,295],{"emptyLinePlaceholder":294},[72,1158,1159],{"class":74,"line":387},[72,1160,1161],{"class":78},"# 也可以不预先创建，在 run 时隐式创建\n",[72,1163,1164,1166,1168,1170,1172,1175],{"class":74,"line":393},[72,1165,12],{"class":85},[72,1167,89],{"class":88},[72,1169,93],{"class":92},[72,1171,980],{"class":92},[72,1173,1174],{"class":88}," mydata2:\u002Fapp\u002Fdata",[72,1176,1152],{"class":88},[26,1178,1179,114],{},[30,1180,1181],{},"管理卷",[63,1183,1185],{"className":65,"code":1184,"language":67,"meta":68,"style":68},"docker volume ls               # 列出所有卷\ndocker volume inspect mydata   # 查看卷详细信息（包括挂载点）\ndocker volume rm mydata        # 删除指定卷\ndocker volume prune            # 删除所有未被任何容器使用的卷\n",[58,1186,1187,1199,1213,1226],{"__ignoreMap":68},[72,1188,1189,1191,1193,1196],{"class":74,"line":75},[72,1190,12],{"class":85},[72,1192,1121],{"class":88},[72,1194,1195],{"class":88}," ls",[72,1197,1198],{"class":78},"               # 列出所有卷\n",[72,1200,1201,1203,1205,1207,1210],{"class":74,"line":82},[72,1202,12],{"class":85},[72,1204,1121],{"class":88},[72,1206,692],{"class":88},[72,1208,1209],{"class":88}," mydata",[72,1211,1212],{"class":78},"   # 查看卷详细信息（包括挂载点）\n",[72,1214,1215,1217,1219,1221,1223],{"class":74,"line":291},[72,1216,12],{"class":85},[72,1218,1121],{"class":88},[72,1220,501],{"class":88},[72,1222,1209],{"class":88},[72,1224,1225],{"class":78},"        # 删除指定卷\n",[72,1227,1228,1230,1232,1235],{"class":74,"line":298},[72,1229,12],{"class":85},[72,1231,1121],{"class":88},[72,1233,1234],{"class":88}," prune",[72,1236,1237],{"class":78},"            # 删除所有未被任何容器使用的卷\n",[26,1239,1240,1243],{},[30,1241,1242],{},"备份与恢复示例","（借助临时容器打包卷内容）：",[63,1245,1247],{"className":65,"code":1246,"language":67,"meta":68,"style":68},"# 备份：将 mydata 卷内容打包为宿主机当前目录下的 backup.tar.gz\ndocker run --rm -v mydata:\u002Fdata -v $(pwd):\u002Fbackup alpine \\\n  tar czf \u002Fbackup\u002Fbackup.tar.gz -C \u002Fdata .\n\n# 恢复：将 backup.tar.gz 解压回一个新卷\ndocker run --rm -v mydata_restored:\u002Fdata -v $(pwd):\u002Fbackup alpine \\\n  tar xzf \u002Fbackup\u002Fbackup.tar.gz -C \u002Fdata\n",[58,1248,1249,1254,1286,1306,1310,1315,1342],{"__ignoreMap":68},[72,1250,1251],{"class":74,"line":75},[72,1252,1253],{"class":78},"# 备份：将 mydata 卷内容打包为宿主机当前目录下的 backup.tar.gz\n",[72,1255,1256,1258,1260,1263,1265,1268,1270,1272,1274,1276,1279,1282],{"class":74,"line":82},[72,1257,12],{"class":85},[72,1259,89],{"class":88},[72,1261,1262],{"class":92}," --rm",[72,1264,980],{"class":92},[72,1266,1267],{"class":88}," mydata:\u002Fdata",[72,1269,980],{"class":92},[72,1271,1026],{"class":1025},[72,1273,1030],{"class":1029},[72,1275,1033],{"class":1025},[72,1277,1278],{"class":88},":\u002Fbackup",[72,1280,1281],{"class":88}," alpine",[72,1283,1285],{"class":1284},"s_hVV"," \\\n",[72,1287,1288,1291,1294,1297,1300,1303],{"class":74,"line":291},[72,1289,1290],{"class":88},"  tar",[72,1292,1293],{"class":88}," czf",[72,1295,1296],{"class":88}," \u002Fbackup\u002Fbackup.tar.gz",[72,1298,1299],{"class":92}," -C",[72,1301,1302],{"class":88}," \u002Fdata",[72,1304,1305],{"class":88}," .\n",[72,1307,1308],{"class":74,"line":298},[72,1309,295],{"emptyLinePlaceholder":294},[72,1311,1312],{"class":74,"line":304},[72,1313,1314],{"class":78},"# 恢复：将 backup.tar.gz 解压回一个新卷\n",[72,1316,1317,1319,1321,1323,1325,1328,1330,1332,1334,1336,1338,1340],{"class":74,"line":382},[72,1318,12],{"class":85},[72,1320,89],{"class":88},[72,1322,1262],{"class":92},[72,1324,980],{"class":92},[72,1326,1327],{"class":88}," mydata_restored:\u002Fdata",[72,1329,980],{"class":92},[72,1331,1026],{"class":1025},[72,1333,1030],{"class":1029},[72,1335,1033],{"class":1025},[72,1337,1278],{"class":88},[72,1339,1281],{"class":88},[72,1341,1285],{"class":1284},[72,1343,1344,1346,1349,1351,1353],{"class":74,"line":387},[72,1345,1290],{"class":88},[72,1347,1348],{"class":88}," xzf",[72,1350,1296],{"class":88},[72,1352,1299],{"class":92},[72,1354,1355],{"class":88}," \u002Fdata\n",[26,1357,1358,114],{},[30,1359,1073],{},[317,1361,1362,1365,1368],{},[320,1363,1364],{},"支持卷驱动（如本地、NFS、云存储）。",[320,1366,1367],{},"可以在多个容器之间共享。",[320,1369,1370],{},"备份和恢复简单（直接复制卷的目录，或如上用临时容器打包）。",[50,1372,1374],{"id":1373},"_3-临时文件tmpfs","3. 临时文件（tmpfs）",[26,1376,1377,1378,1381],{},"将数据存储在宿主机的内存中，不会写入磁盘。容器停止或删除后，数据即丢失。",[30,1379,1380],{},"适合存放临时、敏感、不持久化的数据","（如缓存、密钥）。",[26,1383,1384,114],{},[30,1385,1386],{},"语法",[63,1388,1390],{"className":65,"code":1389,"language":67,"meta":68,"style":68},"docker run -d --tmpfs \u002F容器内路径 镜像名\n",[58,1391,1392],{"__ignoreMap":68},[72,1393,1394,1396,1398,1400,1403,1406],{"class":74,"line":75},[72,1395,12],{"class":85},[72,1397,89],{"class":88},[72,1399,93],{"class":92},[72,1401,1402],{"class":92}," --tmpfs",[72,1404,1405],{"class":88}," \u002F容器内路径",[72,1407,986],{"class":88},[26,1409,1410,114],{},[30,1411,998],{},[63,1413,1415],{"className":65,"code":1414,"language":67,"meta":68,"style":68},"docker run -d --name temp-test --tmpfs \u002Fapp\u002Ftemp alpine sleep 300\n",[58,1416,1417],{"__ignoreMap":68},[72,1418,1419,1421,1423,1425,1427,1430,1432,1435,1437,1440],{"class":74,"line":75},[72,1420,12],{"class":85},[72,1422,89],{"class":88},[72,1424,93],{"class":92},[72,1426,96],{"class":92},[72,1428,1429],{"class":88}," temp-test",[72,1431,1402],{"class":92},[72,1433,1434],{"class":88}," \u002Fapp\u002Ftemp",[72,1436,1281],{"class":88},[72,1438,1439],{"class":88}," sleep",[72,1441,1442],{"class":403}," 300\n",[26,1444,1445,114],{},[30,1446,1073],{},[317,1448,1449,1452,1455],{},[320,1450,1451],{},"速度快（内存读写）。",[320,1453,1454],{},"容器重启后数据清空。",[320,1456,1457],{},"不占用磁盘空间。",[50,1459,1461],{"id":1460},"_4-三种方式对比","4. 三种方式对比",[116,1463,1464,1478],{},[119,1465,1466],{},[122,1467,1468,1471,1473,1475],{},[125,1469,1470],{},"特性",[125,1472,937],{},[125,1474,943],{},[125,1476,1477],{},"tmpfs",[132,1479,1480,1496,1512,1528,1544,1560],{},[122,1481,1482,1487,1490,1493],{},[137,1483,1484],{},[30,1485,1486],{},"数据存储位置",[137,1488,1489],{},"宿主机任意目录",[137,1491,1492],{},"Docker 管理的路径",[137,1494,1495],{},"宿主机内存",[122,1497,1498,1503,1506,1509],{},[137,1499,1500],{},[30,1501,1502],{},"持久性",[137,1504,1505],{},"是（宿主机文件不变则持久）",[137,1507,1508],{},"是",[137,1510,1511],{},"否（容器停止即失效）",[122,1513,1514,1519,1522,1525],{},[137,1515,1516],{},[30,1517,1518],{},"管理方式",[137,1520,1521],{},"用户手动管理",[137,1523,1524],{},"Docker 命令管理",[137,1526,1527],{},"仅运行时挂载",[122,1529,1530,1535,1538,1541],{},[137,1531,1532],{},[30,1533,1534],{},"适用环境",[137,1536,1537],{},"开发环境",[137,1539,1540],{},"生产环境",[137,1542,1543],{},"临时缓存\u002F敏感数据",[122,1545,1546,1551,1554,1557],{},[137,1547,1548],{},[30,1549,1550],{},"可移植性",[137,1552,1553],{},"低（依赖具体路径）",[137,1555,1556],{},"高（卷可命名、备份）",[137,1558,1559],{},"不适用跨容器持久化",[122,1561,1562,1567,1570,1572],{},[137,1563,1564],{},[30,1565,1566],{},"性能",[137,1568,1569],{},"接近原生文件系统",[137,1571,1569],{},[137,1573,1574],{},"内存速度，但受限内存大小",[50,1576,1578,1579,1581],{"id":1577},"_5-使用-mount-语法推荐","5. 使用 ",[58,1580,992],{}," 语法（推荐）",[26,1583,1584,1586,1587,1589,1590,1592],{},[58,1585,992],{}," 比 ",[58,1588,198],{}," 更明确、可读性更高，语法错误时会直接报错（而 ",[58,1591,198],{}," 在路径不存在时可能被静默当作卷名创建）。",[26,1594,1595,114],{},[30,1596,1597],{},"绑定挂载示例",[63,1599,1601],{"className":65,"code":1600,"language":67,"meta":68,"style":68},"docker run -d --mount type=bind,source=\"$(pwd)\u002Fhtml\",target=\u002Fusr\u002Fshare\u002Fnginx\u002Fhtml nginx\n",[58,1602,1603],{"__ignoreMap":68},[72,1604,1605,1607,1609,1611,1614,1617,1621,1623,1625,1628,1631,1634],{"class":74,"line":75},[72,1606,12],{"class":85},[72,1608,89],{"class":88},[72,1610,93],{"class":92},[72,1612,1613],{"class":92}," --mount",[72,1615,1616],{"class":88}," type=bind,source=",[72,1618,1620],{"class":1619},"sjJ54","\"$(",[72,1622,1030],{"class":1029},[72,1624,1033],{"class":1619},[72,1626,1627],{"class":88},"\u002Fhtml",[72,1629,1630],{"class":1619},"\"",[72,1632,1633],{"class":88},",target=\u002Fusr\u002Fshare\u002Fnginx\u002Fhtml",[72,1635,108],{"class":88},[26,1637,1638,114],{},[30,1639,1640],{},"卷示例",[63,1642,1644],{"className":65,"code":1643,"language":67,"meta":68,"style":68},"docker run -d --mount source=mydata,target=\u002Fapp\u002Fdata alpine\n",[58,1645,1646],{"__ignoreMap":68},[72,1647,1648,1650,1652,1654,1656,1659],{"class":74,"line":75},[72,1649,12],{"class":85},[72,1651,89],{"class":88},[72,1653,93],{"class":92},[72,1655,1613],{"class":92},[72,1657,1658],{"class":88}," source=mydata,target=\u002Fapp\u002Fdata",[72,1660,1152],{"class":88},[26,1662,1663,114],{},[30,1664,1665],{},"tmpfs 示例",[63,1667,1669],{"className":65,"code":1668,"language":67,"meta":68,"style":68},"docker run -d --mount type=tmpfs,target=\u002Fapp\u002Ftemp alpine\n",[58,1670,1671],{"__ignoreMap":68},[72,1672,1673,1675,1677,1679,1681,1684],{"class":74,"line":75},[72,1674,12],{"class":85},[72,1676,89],{"class":88},[72,1678,93],{"class":92},[72,1680,1613],{"class":92},[72,1682,1683],{"class":88}," type=tmpfs,target=\u002Fapp\u002Ftemp",[72,1685,1152],{"class":88},[50,1687,1688],{"id":1688},"数据管理小结",[317,1690,1691,1697,1703],{},[320,1692,1693,1696],{},[30,1694,1695],{},"开发调试","：使用绑定挂载，实时同步代码。",[320,1698,1699,1702],{},[30,1700,1701],{},"生产持久化","：使用卷，数据独立、易备份。",[320,1704,1705,1708],{},[30,1706,1707],{},"临时数据","：使用 tmpfs，避免磁盘写入，提高性能。",[45,1710,1712],{"id":1711},"三网络基础","三、网络基础",[26,1714,1715,1716,1719,1720,232,1723,43],{},"Docker 提供了多种网络驱动，使容器之间、容器与宿主机之间能够通信。默认安装后 Docker 会自动创建三种网络：",[58,1717,1718],{},"bridge","（默认）、",[58,1721,1722],{},"host",[58,1724,1725],{},"none",[50,1727,1729],{"id":1728},"_1-查看网络","1. 查看网络",[63,1731,1733],{"className":65,"code":1732,"language":67,"meta":68,"style":68},"docker network ls\n",[58,1734,1735],{"__ignoreMap":68},[72,1736,1737,1739,1742],{"class":74,"line":75},[72,1738,12],{"class":85},[72,1740,1741],{"class":88}," network",[72,1743,1744],{"class":88}," ls\n",[26,1746,1747],{},"输出示例：",[63,1749,1754],{"className":1750,"code":1752,"language":1753},[1751],"language-text","NETWORK ID     NAME      DRIVER    SCOPE\nabc123def456   bridge    bridge    local\n789ghi012jkl   host      host      local\n345mno678pqr   none      null      local\n","text",[58,1755,1752],{"__ignoreMap":68},[317,1757,1758,1767,1775],{},[320,1759,1760,1762,1763,1766],{},[30,1761,1718],{},"：默认网络，容器启动时不指定网络则加入此网络。同一 bridge 网络内的容器可以通过 IP 互相访问，但",[30,1764,1765],{},"不能","通过容器名直接访问（自定义桥接网络才支持容器名解析）。",[320,1768,1769,1771,1772,1774],{},[30,1770,1722],{},"：容器直接使用宿主机的网络栈，没有网络隔离，性能好但端口易冲突（Windows\u002FmacOS 上的 Docker Desktop 因运行在虚拟机内，",[58,1773,1722],{}," 网络行为与 Linux 有差异）。",[320,1776,1777,1779],{},[30,1778,1725],{},"：容器没有网络接口（仅 loopback），完全隔离，适合无需联网的批处理任务。",[50,1781,1783],{"id":1782},"_2-创建自定义桥接网络推荐","2. 创建自定义桥接网络（推荐）",[63,1785,1787],{"className":65,"code":1786,"language":67,"meta":68,"style":68},"docker network create mynet\n",[58,1788,1789],{"__ignoreMap":68},[72,1790,1791,1793,1795,1797],{"class":74,"line":75},[72,1792,12],{"class":85},[72,1794,1741],{"class":88},[72,1796,1124],{"class":88},[72,1798,1799],{"class":88}," mynet\n",[317,1801,1802,1816],{},[320,1803,1804,1805,1808,1809,1812,1813,43],{},"自定义网络支持",[30,1806,1807],{},"内置 DNS 解析","：同一网络中的容器可以通过",[30,1810,1811],{},"容器名","互相 ping 通，无需使用 ",[58,1814,1815],{},"--link",[320,1817,1818,1819,43],{},"可以指定子网、网关等：",[58,1820,1821],{},"docker network create --subnet=172.20.0.0\u002F24 mynet",[50,1823,1825],{"id":1824},"_3-在自定义网络中运行容器通过容器名通信","3. 在自定义网络中运行容器（通过容器名通信）",[63,1827,1829],{"className":65,"code":1828,"language":67,"meta":68,"style":68},"# 启动两个容器，都连接到 mynet\ndocker run -d --name app1 --network mynet nginx\ndocker run -d --name app2 --network mynet nginx\n\n# 进入 app1 容器测试能否使用 app2 名称 ping 通\ndocker exec -it app1 bash\napt update && apt install iputils-ping -y   # 如果镜像有 ping 命令可忽略\nping app2   # 成功解析并通信\n",[58,1830,1831,1836,1857,1876,1880,1885,1898,1924],{"__ignoreMap":68},[72,1832,1833],{"class":74,"line":75},[72,1834,1835],{"class":78},"# 启动两个容器，都连接到 mynet\n",[72,1837,1838,1840,1842,1844,1846,1849,1852,1855],{"class":74,"line":82},[72,1839,12],{"class":85},[72,1841,89],{"class":88},[72,1843,93],{"class":92},[72,1845,96],{"class":92},[72,1847,1848],{"class":88}," app1",[72,1850,1851],{"class":92}," --network",[72,1853,1854],{"class":88}," mynet",[72,1856,108],{"class":88},[72,1858,1859,1861,1863,1865,1867,1870,1872,1874],{"class":74,"line":291},[72,1860,12],{"class":85},[72,1862,89],{"class":88},[72,1864,93],{"class":92},[72,1866,96],{"class":92},[72,1868,1869],{"class":88}," app2",[72,1871,1851],{"class":92},[72,1873,1854],{"class":88},[72,1875,108],{"class":88},[72,1877,1878],{"class":74,"line":298},[72,1879,295],{"emptyLinePlaceholder":294},[72,1881,1882],{"class":74,"line":304},[72,1883,1884],{"class":78},"# 进入 app1 容器测试能否使用 app2 名称 ping 通\n",[72,1886,1887,1889,1891,1893,1895],{"class":74,"line":382},[72,1888,12],{"class":85},[72,1890,280],{"class":88},[72,1892,283],{"class":92},[72,1894,1848],{"class":88},[72,1896,1897],{"class":88}," bash\n",[72,1899,1900,1903,1906,1909,1912,1915,1918,1921],{"class":74,"line":387},[72,1901,1902],{"class":85},"apt",[72,1904,1905],{"class":88}," update",[72,1907,1908],{"class":1025}," &&",[72,1910,1911],{"class":85}," apt",[72,1913,1914],{"class":88}," install",[72,1916,1917],{"class":88}," iputils-ping",[72,1919,1920],{"class":92}," -y",[72,1922,1923],{"class":78},"   # 如果镜像有 ping 命令可忽略\n",[72,1925,1926,1929,1931],{"class":74,"line":393},[72,1927,1928],{"class":85},"ping",[72,1930,1869],{"class":88},[72,1932,1933],{"class":78},"   # 成功解析并通信\n",[317,1935,1936,1945],{},[320,1937,1938,1939,1941,1942,43],{},"不需要使用 ",[58,1940,1815],{}," 或手动配置 ",[58,1943,1944],{},"\u002Fetc\u002Fhosts",[320,1946,1947,1948,1951],{},"也可以使用 ",[58,1949,1950],{},"docker run --network mynet --name app3 ..."," 直接加入。",[50,1953,1955],{"id":1954},"_4-将已有容器连接到网络","4. 将已有容器连接到网络",[63,1957,1959],{"className":65,"code":1958,"language":67,"meta":68,"style":68},"# 将已运行的 app1 容器连接到 mynet（可以同时连接多个网络）\ndocker network connect mynet app1\n\n# 断开连接\ndocker network disconnect mynet app1\n",[58,1960,1961,1966,1980,1984,1989],{"__ignoreMap":68},[72,1962,1963],{"class":74,"line":75},[72,1964,1965],{"class":78},"# 将已运行的 app1 容器连接到 mynet（可以同时连接多个网络）\n",[72,1967,1968,1970,1972,1975,1977],{"class":74,"line":82},[72,1969,12],{"class":85},[72,1971,1741],{"class":88},[72,1973,1974],{"class":88}," connect",[72,1976,1854],{"class":88},[72,1978,1979],{"class":88}," app1\n",[72,1981,1982],{"class":74,"line":291},[72,1983,295],{"emptyLinePlaceholder":294},[72,1985,1986],{"class":74,"line":298},[72,1987,1988],{"class":78},"# 断开连接\n",[72,1990,1991,1993,1995,1998,2000],{"class":74,"line":304},[72,1992,12],{"class":85},[72,1994,1741],{"class":88},[72,1996,1997],{"class":88}," disconnect",[72,1999,1854],{"class":88},[72,2001,1979],{"class":88},[317,2003,2004],{},[320,2005,2006],{},"容器可以同时属于多个网络，实现网络隔离和桥接（例如一个容器同时对外提供服务、又能访问内部数据库网络）。",[50,2008,2010],{"id":2009},"_5-端口映射公开服务到宿主机","5. 端口映射（公开服务到宿主机）",[26,2012,2013],{},"端口映射使宿主机外的客户端能够访问容器内的服务。",[63,2015,2017],{"className":65,"code":2016,"language":67,"meta":68,"style":68},"# 将宿主机 8080 端口映射到容器的 80 端口（TCP）\ndocker run -d -p 8080:80 nginx\n\n# 指定协议（默认 TCP，可显式声明）\ndocker run -d -p 8080:80\u002Ftcp nginx\n\n# UDP 映射\ndocker run -d -p 8080:80\u002Fudp nginx\n\n# 同时映射 TCP 和 UDP\ndocker run -d -p 8080:80\u002Ftcp -p 8080:80\u002Fudp nginx\n\n# 随机映射容器暴露的所有端口（主机端口从 32768 开始）\ndocker run -d -P nginx   # 注意是大写 -P\n",[58,2018,2019,2024,2038,2042,2047,2062,2066,2071,2086,2090,2095,2113,2117,2122],{"__ignoreMap":68},[72,2020,2021],{"class":74,"line":75},[72,2022,2023],{"class":78},"# 将宿主机 8080 端口映射到容器的 80 端口（TCP）\n",[72,2025,2026,2028,2030,2032,2034,2036],{"class":74,"line":82},[72,2027,12],{"class":85},[72,2029,89],{"class":88},[72,2031,93],{"class":92},[72,2033,102],{"class":92},[72,2035,105],{"class":88},[72,2037,108],{"class":88},[72,2039,2040],{"class":74,"line":291},[72,2041,295],{"emptyLinePlaceholder":294},[72,2043,2044],{"class":74,"line":298},[72,2045,2046],{"class":78},"# 指定协议（默认 TCP，可显式声明）\n",[72,2048,2049,2051,2053,2055,2057,2060],{"class":74,"line":304},[72,2050,12],{"class":85},[72,2052,89],{"class":88},[72,2054,93],{"class":92},[72,2056,102],{"class":92},[72,2058,2059],{"class":88}," 8080:80\u002Ftcp",[72,2061,108],{"class":88},[72,2063,2064],{"class":74,"line":382},[72,2065,295],{"emptyLinePlaceholder":294},[72,2067,2068],{"class":74,"line":387},[72,2069,2070],{"class":78},"# UDP 映射\n",[72,2072,2073,2075,2077,2079,2081,2084],{"class":74,"line":393},[72,2074,12],{"class":85},[72,2076,89],{"class":88},[72,2078,93],{"class":92},[72,2080,102],{"class":92},[72,2082,2083],{"class":88}," 8080:80\u002Fudp",[72,2085,108],{"class":88},[72,2087,2088],{"class":74,"line":407},[72,2089,295],{"emptyLinePlaceholder":294},[72,2091,2092],{"class":74,"line":412},[72,2093,2094],{"class":78},"# 同时映射 TCP 和 UDP\n",[72,2096,2097,2099,2101,2103,2105,2107,2109,2111],{"class":74,"line":418},[72,2098,12],{"class":85},[72,2100,89],{"class":88},[72,2102,93],{"class":92},[72,2104,102],{"class":92},[72,2106,2059],{"class":88},[72,2108,102],{"class":92},[72,2110,2083],{"class":88},[72,2112,108],{"class":88},[72,2114,2115],{"class":74,"line":506},[72,2116,295],{"emptyLinePlaceholder":294},[72,2118,2119],{"class":74,"line":511},[72,2120,2121],{"class":78},"# 随机映射容器暴露的所有端口（主机端口从 32768 开始）\n",[72,2123,2124,2126,2128,2130,2133,2136],{"class":74,"line":517},[72,2125,12],{"class":85},[72,2127,89],{"class":88},[72,2129,93],{"class":92},[72,2131,2132],{"class":92}," -P",[72,2134,2135],{"class":88}," nginx",[72,2137,2138],{"class":78},"   # 注意是大写 -P\n",[317,2140,2141,2146],{},[320,2142,2143,2145],{},[58,2144,161],{}," 可以多次使用，映射多个端口。",[320,2147,2148,2149,43],{},"查看映射情况：",[58,2150,2151],{},"docker port \u003C容器名>",[50,2153,2155],{"id":2154},"_6-常用网络管理命令","6. 常用网络管理命令",[116,2157,2158,2166],{},[119,2159,2160],{},[122,2161,2162,2164],{},[125,2163,766],{},[125,2165,130],{},[132,2167,2168,2178,2188,2198,2208,2218,2228,2238],{},[122,2169,2170,2175],{},[137,2171,2172],{},[58,2173,2174],{},"docker network ls",[137,2176,2177],{},"列出所有网络",[122,2179,2180,2185],{},[137,2181,2182],{},[58,2183,2184],{},"docker network inspect \u003C网络名>",[137,2186,2187],{},"查看网络详情（包括连接的容器）",[122,2189,2190,2195],{},[137,2191,2192],{},[58,2193,2194],{},"docker network create \u003C名称>",[137,2196,2197],{},"创建自定义桥接网络",[122,2199,2200,2205],{},[137,2201,2202],{},[58,2203,2204],{},"docker network rm \u003C网络名>",[137,2206,2207],{},"删除网络（需先断开所有容器）",[122,2209,2210,2215],{},[137,2211,2212],{},[58,2213,2214],{},"docker network prune",[137,2216,2217],{},"删除所有未被使用的网络",[122,2219,2220,2225],{},[137,2221,2222],{},[58,2223,2224],{},"docker run --network \u003C网络名>",[137,2226,2227],{},"启动时指定网络",[122,2229,2230,2235],{},[137,2231,2232],{},[58,2233,2234],{},"docker network connect \u003C网络名> \u003C容器名>",[137,2236,2237],{},"将容器连接到网络",[122,2239,2240,2245],{},[137,2241,2242],{},[58,2243,2244],{},"docker network disconnect \u003C网络名> \u003C容器名>",[137,2246,2247],{},"断开容器与网络的连接",[50,2249,2251],{"id":2250},"_7-最佳实践建议","7. 最佳实践建议",[317,2253,2254,2262,2268,2276],{},[320,2255,2256,2258,2259,2261],{},[30,2257,1540],{},"：为不同应用栈创建独立的自定义桥接网络，避免默认 ",[58,2260,1718],{}," 网络的限制（无 DNS 解析）。",[320,2263,2264,2267],{},[30,2265,2266],{},"微服务架构","：使用自定义网络，通过容器名作为服务发现；跨主机场景可考虑 overlay 网络（需 Swarm 模式）或服务网格方案。",[320,2269,2270,2272,2273,2275],{},[30,2271,855],{},"：仅在需要对外暴露的服务上使用 ",[58,2274,161],{},"；内部容器间通信无需映射端口，减少攻击面。",[320,2277,2278,2281,2282,2284],{},[30,2279,2280],{},"宿主机网络","：除非对性能有极致要求（且能解决端口冲突），一般不推荐使用 ",[58,2283,1722],{}," 网络。",[26,2286,2287,2288,43],{},"掌握 Docker 容器管理、数据持久化与网络基础，可以灵活构建容器间的通信拓扑，并为生产部署打下基础；多容器协同的编排方式见 ",[39,2289,2291],{"href":2290},"\u002Fknowledge\u002Fbooklet\u002Fuphold\u002Fdocker\u002Fdocker-compose","Docker Compose",[45,2293,2294],{"id":2294},"参考文献",[116,2296,2297,2306],{},[119,2298,2299],{},[122,2300,2301,2304],{},[125,2302,2303],{},"资料",[125,2305,130],{},[132,2307,2308,2321,2333,2345],{},[122,2309,2310,2318],{},[137,2311,2312],{},[39,2313,2317],{"href":2314,"rel":2315},"https:\u002F\u002Fdocs.docker.com\u002F",[2316],"nofollow","Docker 文档",[137,2319,2320],{},"官方",[122,2322,2323,2330],{},[137,2324,2325],{},[39,2326,2329],{"href":2327,"rel":2328},"https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Fstorage\u002Fvolumes\u002F",[2316],"Volumes 官方指南",[137,2331,2332],{},"数据卷",[122,2334,2335,2342],{},[137,2336,2337],{},[39,2338,2341],{"href":2339,"rel":2340},"https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Fnetwork\u002F",[2316],"Networking 官方指南",[137,2343,2344],{},"网络",[122,2346,2347,2353],{},[137,2348,2349],{},[39,2350,2352],{"href":2351},"\u002Fknowledge\u002Fbooklet\u002Fuphold","运维导读",[137,2354,2355],{},"学习路径",[2357,2358,2359],"style",{},"html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sptTA, html code.shiki .sptTA{--shiki-light:#6182B8;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":68,"searchDepth":82,"depth":82,"links":2361},[2362,2373,2382,2391],{"id":47,"depth":82,"text":48,"children":2363},[2364,2365,2366,2367,2368,2369,2370,2371,2372],{"id":52,"depth":291,"text":53},{"id":262,"depth":291,"text":263},{"id":342,"depth":291,"text":343},{"id":428,"depth":291,"text":429},{"id":570,"depth":291,"text":571},{"id":655,"depth":291,"text":656},{"id":700,"depth":291,"text":701},{"id":756,"depth":291,"text":757},{"id":827,"depth":291,"text":827},{"id":926,"depth":82,"text":927,"children":2374},[2375,2376,2377,2378,2379,2381],{"id":953,"depth":291,"text":954},{"id":1087,"depth":291,"text":1088},{"id":1373,"depth":291,"text":1374},{"id":1460,"depth":291,"text":1461},{"id":1577,"depth":291,"text":2380},"5. 使用 --mount 语法（推荐）",{"id":1688,"depth":291,"text":1688},{"id":1711,"depth":82,"text":1712,"children":2383},[2384,2385,2386,2387,2388,2389,2390],{"id":1728,"depth":291,"text":1729},{"id":1782,"depth":291,"text":1783},{"id":1824,"depth":291,"text":1825},{"id":1954,"depth":291,"text":1955},{"id":2009,"depth":291,"text":2010},{"id":2154,"depth":291,"text":2155},{"id":2250,"depth":291,"text":2251},{"id":2294,"depth":82,"text":2294},{"title":8,"description":9},"knowledge\u002Fbooklet\u002Fuphold\u002FDocker\u002Fdocker-runtime","knowledge\u002Fknowledge\u002Fbooklet\u002Fuphold\u002FDocker\u002Fdocker-runtime.md","md",{"items":2397},[2398,2401,2403,2407,2410,2414],{"path":2290,"title":2399,"description":2400,"category":10,"score":382},"Docker Compose 编排","Docker Compose 是定义和运行多容器 Docker 应用的工具，通过一个 compose.yml 文件即可管理 Web、数据库、缓存等多个服务。本文覆盖安装、完整字段说明、多服务示例、常用指令与常见排错。",{"path":41,"title":42,"description":2402,"category":10,"score":382},"镜像（Image）是 Docker 容器的只读模板，Dockerfile 则是构建镜像的蓝图。本文完整覆盖镜像的搜索、拉取、查看、删除、打标签、推送，以及 Dockerfile 常用指令、多阶段构建与体积优化技巧。",{"path":2404,"title":2405,"description":2406,"category":10,"score":382},"\u002Fknowledge\u002Fbooklet\u002Fuphold\u002Fdocker\u002Fdocker-intro","Docker 基础概念、安装与命令速查","Docker 是一个开源的容器化平台，能将应用程序及其所有依赖打包成轻量级、可移植的容器。本文介绍核心概念、底层原理、跨平台安装配置，并附完整的命令速查表，是学习 Docker 的第一篇。",{"path":2351,"title":2408,"description":2409,"category":10,"score":298},"运维与协作导读","本目录覆盖日常开发运维中的 Git 版本控制、Docker 容器化与 Nginx 服务网关，与 工程化 · Git、部署相关 等章节互补，提供完整的十阶段学习路径。",{"path":2411,"title":2412,"description":2413,"category":10,"score":75},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fbasics","后端入门概览","本目录覆盖 JavaScript\u002FTypeScript 服务端运行时与框架、数据存储，以及 Rust 系统编程入门，提供从零到部署的完整学习路径。前置建议：JavaScript 基础、工程化 · 环境变量。",{"path":2415,"title":2416,"description":2417,"category":10,"score":75},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fbun\u002Fbase","Bun 基础与核心命令","Bun 是用 Zig 编写的 JavaScript 运行时，内置包管理（bun install）、打包（bun build）、测试（bun test）等，并持续兼容 Node.js API。本文介绍核心特点、安装方式，以及日常最常用的命令与包管理功能。见 运行时对比。",{"series":2419,"title":12,"items":2420,"index":291,"prev":2425,"next":2426},"booklet\u002Fuphold\u002Fdocker",[2421,2422,2423,2424],{"path":2290,"title":2399,"date":16,"pinned":17},{"path":41,"title":42,"date":16,"pinned":17},{"path":2404,"title":2405,"date":16,"pinned":17},{"path":7,"title":8,"date":16,"pinned":17},{"path":2404,"title":2405,"date":16,"pinned":17},null]