[{"data":1,"prerenderedAt":404},["ShallowReactive",2],{"wiki-page-\u002Fwiki\u002F2024-10-03-docker-jiao-cheng\u002Fch1-jian-jie":3,"wiki-doc-items-2024-10-03-docker-jiao-cheng":338},{"id":4,"title":5,"body":6,"chapter":323,"chapterSort":324,"date":325,"description":315,"docKey":326,"docRoot":327,"docTitle":328,"extension":329,"isWikiDoc":330,"isWikiIndex":331,"meta":332,"navigation":330,"path":333,"seo":334,"stem":335,"wikiDepth":336,"__hash__":337},"wiki\u002Fwiki\u002F2024-10-03-Docker教程\u002Fch1-简介.md","简介",{"type":7,"value":8,"toc":314},"minimark",[9,14,26,33,42,45,53,56,59,63,76,80,133,136,139,142,145,148,152,190,196,200,254,259,262,265,270,273,279,282,285,290,293,296,300],[10,11,13],"h3",{"id":12},"什么是-docker","🐳 什么是 Docker？",[15,16,17,18,22,23],"p",{},"Docker 是一个开源的 ",[19,20,21],"strong",{},"应用容器引擎"," ，可以让开发者将应用和其所有依赖打包成一个“容器”，",[19,24,25],{},"一次构建，到处运行。",[15,27,28,29,32],{},"“",[19,30,31],{},"一次构建，到处运行","”也就是说：",[34,35,36],"ol",{},[37,38,39],"li",{},[19,40,41],{},"之前：",[15,43,44],{},"之前想跑ROS2+OpenCV+CUDA+CuDNN，我需要在一台电脑上一个一个环境的安装配置，如果我还要在另一台电脑上跑这个，也需要把第二台电脑也这样配置一遍。如果我的系统环境崩了，需要重装系统了，重装完后又双叒叕要再来一遍配置过程，很麻烦。",[34,46,48],{"start":47},2,[37,49,50],{},[19,51,52],{},"使用docker后：",[15,54,55],{},"（docker镜像和docker容器的概念在下下下面，下面这段话里看到镜像和容器的概念先接受就行。）",[15,57,58],{},"我只需要在电脑上用docker配置一遍这个ROS2+OpenCV+CUDA+CuDNN环境，然后用docker生成一个镜像，把这个镜像打包好。以后在任何一台电脑上，我都可以直接用这个镜像生成一个容器，而这个容器内就包含了我所需要的ROS2+OpenCV+CUDA+CuDNN环境，如果我的容器环境崩了，我只需要把坏掉的容器删掉，重新由镜像再生成一个新的容器即可。只需要配置一次，以后都可以一键安装这个环境。",[10,60,62],{"id":61},"它是怎么工作的","📦 它是怎么工作的？",[64,65,66,69],"ul",{},[37,67,68],{},"传统方式：软件运行需要在不同系统上安装各种库、配置环境，很麻烦。",[37,70,71,72,75],{},"Docker方式：打包成“容器”，环境和应用一起封装， ",[19,73,74],{},"无论在哪运行都一样稳定"," 。",[10,77,79],{"id":78},"docker-的几个基本概念","🔧 Docker 的几个基本概念",[81,82,83,97],"table",{},[84,85,86],"thead",{},[87,88,89,94],"tr",{},[90,91,93],"th",{"align":92},"left","概念",[90,95,96],{"align":92},"解释",[98,99,100,109,117,125],"tbody",{},[87,101,102,106],{},[103,104,105],"td",{"align":92},"镜像",[103,107,108],{"align":92},"Image，运行容器的模板，像是一个应用快照",[87,110,111,114],{},[103,112,113],{"align":92},"容器",[103,115,116],{"align":92},"Container，运行中的镜像实例，有自己的文件系统、网络等",[87,118,119,122],{},[103,120,121],{"align":92},"Dockerfile",[103,123,124],{"align":92},"构建镜像的脚本，写明安装哪些包、设置哪些环境变量等",[87,126,127,130],{},[103,128,129],{"align":92},"仓库",[103,131,132],{"align":92},"Registry，存放镜像的地方，比如 Docker Hub",[15,134,135],{},"抽象化理解:",[15,137,138],{},"Docker镜像≈C++类",[15,140,141],{},"Docker容器≈C++类实例(即对象)",[15,143,144],{},"形象化理解: 镜像可以类似于给电脑装系统的iso镜像文件。 容器可以类似于已经被装到电脑上的可以运行的系统。",[15,146,147],{},"把镜像变为容器时，需要用docker run命令添加很多参数，这个可以理解你这个电脑到底有啥硬件配置。",[10,149,151],{"id":150},"类比理解","🔍 类比理解",[81,153,154,164],{},[84,155,156],{},[87,157,158,161],{},[90,159,160],{"align":92},"传统部署",[90,162,163],{"align":92},"Docker部署",[98,165,166,174,182],{},[87,167,168,171],{},[103,169,170],{"align":92},"手动安装依赖、调试版本不一致问题",[103,172,173],{"align":92},"一次打包环境和代码",[87,175,176,179],{},[103,177,178],{"align":92},"程序“裸奔”跑在系统上",[103,180,181],{"align":92},"程序“穿着容器”隔离运行",[87,183,184,187],{},[103,185,186],{"align":92},"容易“在我电脑上能跑”",[103,188,189],{"align":92},"保证“无论在哪都能跑”",[15,191,192,193],{},"就像快递包裹： ",[19,194,195],{},"你不再关心内容怎么运送，因为包装已经帮你做好了一切隔离。",[10,197,199],{"id":198},"docker-的核心优势","✅ Docker 的核心优势",[81,201,202,212],{},[84,203,204],{},[87,205,206,209],{},[90,207,208],{"align":92},"优势",[90,210,211],{"align":92},"说明",[98,213,214,222,230,238,246],{},[87,215,216,219],{},[103,217,218],{"align":92},"轻量级",[103,220,221],{"align":92},"基于系统内核共享，启动速度快，占资源少",[87,223,224,227],{},[103,225,226],{"align":92},"跨平台",[103,228,229],{"align":92},"一次构建，到处运行（Windows、Linux、macOS 上都一致）",[87,231,232,235],{},[103,233,234],{"align":92},"易于迁移部署",[103,236,237],{"align":92},"应用和环境一起封装，不怕依赖不一致",[87,239,240,243],{},[103,241,242],{"align":92},"易于版本控制",[103,244,245],{"align":92},"镜像版本可控，支持回滚",[87,247,248,251],{},[103,249,250],{"align":92},"生态丰富",[103,252,253],{"align":92},"Docker Hub 上有成千上万的现成镜像可用",[34,255,256],{},[37,257,258],{},"在Linux上可以几乎实现无性能损失。",[15,260,261],{},"docker里的发行版和本机共用Linux内核。",[15,263,264],{},"CPU损耗不到1%。 内存接近原生没损耗。 硬盘损耗不到2%。 网络性能接近原生没有损耗。 显卡损耗小于1%。",[34,266,267],{"start":47},[37,268,269],{},"可以快速部署在绝大多数Linux发行版",[15,271,272],{},"你想跑ROS2，之前是仅在Ubuntu上是比较好部署的，但是现在你可以使用任意发行版，比如Fedora，ArchLinux等发行版上也能通过docker跑ROS2。",[34,274,276],{"start":275},3,[37,277,278],{},"配置环境简单",[15,280,281],{},"之前你需要在Ubuntu上按照教程安装ROS2，CUDA，CuDNN，OpenCV4等等，但是只要你用了Docker，可以直接用docker pull命令拉取别人配置好的开发环境，只需要一条命令直通罗马。",[15,283,284],{},"你仅仅只需要把一个发行版最基础的东西配置好，比如那些仓库换源，输入法，显卡驱动（只用让显卡工作起来，不用在本机配置CUDA和CuDNN）等。",[34,286,288],{"start":287},4,[37,289,250],{},[15,291,292],{},"生态及其丰富，有很多东西即便自己不构建，也能在dockerhub上找到别人构建好的镜像，自己连编译都省去了。",[15,294,295],{},"比如之前配置cuda和cudnn的话，需要在本机先安装英伟达驱动，再安装CUDA和CuDNN。而现在，我们只需要本机安装英伟达驱动，英伟达官方在DockerHub上提供了CUDA和CUDNN的镜像，他们已经编译好了，我们可以直接拿来用。",[10,297,299],{"id":298},"常见-docker-应用场景","📁 常见 Docker 应用场景",[64,301,302,305,308,311],{},[37,303,304],{},"本地开发：快速搭建各种开发环境（如 Python + Jupyter、ROS + Gazebo）",[37,306,307],{},"测试部署：CI\u002FCD 中自动测试、构建、部署",[37,309,310],{},"微服务架构：每个服务一个容器，灵活组合",[37,312,313],{},"科研工具封装：复现别人论文环境，或封装自己的项目发给他人使用",{"title":315,"searchDepth":47,"depth":47,"links":316},"",[317,318,319,320,321,322],{"id":12,"depth":275,"text":13},{"id":61,"depth":275,"text":62},{"id":78,"depth":275,"text":79},{"id":150,"depth":275,"text":151},{"id":198,"depth":275,"text":199},{"id":298,"depth":275,"text":299},"1",1000000,"2024-10-03","2024-10-03-docker-jiao-cheng","\u002Fwiki\u002F2024-10-03-docker-jiao-cheng","Docker教程","md",true,false,{},"\u002Fwiki\u002F2024-10-03-docker-jiao-cheng\u002Fch1-jian-jie",{"title":5,"description":315},"wiki\u002F2024-10-03-Docker教程\u002Fch1-简介",1,"7pEPVZIFgaZ7Pfhlse84EbN2ud6Cre_oyQG2_WKkaXE",[339,340,346,352,358,364,370,376,382,388,394,400],{"path":333,"stem":335,"title":5,"date":325,"chapter":323,"chapterSort":324,"docKey":326,"docRoot":327,"docTitle":328,"isWikiDoc":330,"isWikiIndex":331},{"path":341,"stem":342,"title":343,"date":325,"chapter":344,"chapterSort":345,"docKey":326,"docRoot":327,"docTitle":328,"isWikiDoc":330,"isWikiIndex":331},"\u002Fwiki\u002F2024-10-03-docker-jiao-cheng\u002Fch10-1-kuai-su-da-kai-zhong-duan","wiki\u002F2024-10-03-Docker教程\u002Fch10-1-快速打开终端","Docker快速打开终端","10.1",10010000,{"path":347,"stem":348,"title":349,"date":325,"chapter":350,"chapterSort":351,"docKey":326,"docRoot":327,"docTitle":328,"isWikiDoc":330,"isWikiIndex":331},"\u002Fwiki\u002F2024-10-03-docker-jiao-cheng\u002Fch10-docker-shi-yong-you-hua","wiki\u002F2024-10-03-Docker教程\u002Fch10-Docker使用优化","Docker使用优化","10",10000000,{"path":353,"stem":354,"title":355,"date":325,"chapter":356,"chapterSort":357,"docKey":326,"docRoot":327,"docTitle":328,"isWikiDoc":330,"isWikiIndex":331},"\u002Fwiki\u002F2024-10-03-docker-jiao-cheng\u002Fch2-an-zhuang-docker","wiki\u002F2024-10-03-Docker教程\u002Fch2-安装Docker","安装Docker","2",2000000,{"path":359,"stem":360,"title":361,"date":325,"chapter":362,"chapterSort":363,"docKey":326,"docRoot":327,"docTitle":328,"isWikiDoc":330,"isWikiIndex":331},"\u002Fwiki\u002F2024-10-03-docker-jiao-cheng\u002Fch3-docker-zhi-tong","wiki\u002F2024-10-03-Docker教程\u002Fch3-Docker直通","Docker直通","3",3000000,{"path":365,"stem":366,"title":367,"date":325,"chapter":368,"chapterSort":369,"docKey":326,"docRoot":327,"docTitle":328,"isWikiDoc":330,"isWikiIndex":331},"\u002Fwiki\u002F2024-10-03-docker-jiao-cheng\u002Fch4-dockerhub-huan-yuan","wiki\u002F2024-10-03-Docker教程\u002Fch4-DockerHub换源","DockerHub换源","4",4000000,{"path":371,"stem":372,"title":373,"date":325,"chapter":374,"chapterSort":375,"docKey":326,"docRoot":327,"docTitle":328,"isWikiDoc":330,"isWikiIndex":331},"\u002Fwiki\u002F2024-10-03-docker-jiao-cheng\u002Fch5-docker-rong-qi-li-de-cheng-xu-de-tu-xing-jie-mian-tan-bu-chu-lai","wiki\u002F2024-10-03-Docker教程\u002Fch5-docker容器里的程序的图形界面弹不出来","docker容器里的程序的图形界面弹不出来","5",5000000,{"path":377,"stem":378,"title":379,"date":325,"chapter":380,"chapterSort":381,"docKey":326,"docRoot":327,"docTitle":328,"isWikiDoc":330,"isWikiIndex":331},"\u002Fwiki\u002F2024-10-03-docker-jiao-cheng\u002Fch6-docker-ming-ling-xue-xi","wiki\u002F2024-10-03-Docker教程\u002Fch6-Docker命令学习","Docker命令学习","6",6000000,{"path":383,"stem":384,"title":385,"date":325,"chapter":386,"chapterSort":387,"docKey":326,"docRoot":327,"docTitle":328,"isWikiDoc":330,"isWikiIndex":331},"\u002Fwiki\u002F2024-10-03-docker-jiao-cheng\u002Fch7-ge-zhong-docker-rong-qi-bu-shu","wiki\u002F2024-10-03-Docker教程\u002Fch7-各种Docker容器部署","各种Docker容器部署","7",7000000,{"path":389,"stem":390,"title":391,"date":325,"chapter":392,"chapterSort":393,"docKey":326,"docRoot":327,"docTitle":328,"isWikiDoc":330,"isWikiIndex":331},"\u002Fwiki\u002F2024-10-03-docker-jiao-cheng\u002Fch8-shou-dong-chuang-jian-docker-jing-xiang","wiki\u002F2024-10-03-Docker教程\u002Fch8-手动创建Docker镜像","手动创建Docker镜像","8",8000000,{"path":395,"stem":396,"title":397,"date":325,"chapter":398,"chapterSort":399,"docKey":326,"docRoot":327,"docTitle":328,"isWikiDoc":330,"isWikiIndex":331},"\u002Fwiki\u002F2024-10-03-docker-jiao-cheng\u002Fch9-vscode-yuan-cheng-kai-fa","wiki\u002F2024-10-03-Docker教程\u002Fch9-VScode远程开发","VScode远程开发","9",9000000,{"path":327,"stem":401,"title":328,"date":325,"chapter":402,"chapterSort":403,"docKey":326,"docRoot":327,"docTitle":328,"isWikiDoc":330,"isWikiIndex":330},"wiki\u002F2024-10-03-Docker教程\u002Findex",null,0,1778666543821]