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