[{"data":1,"prerenderedAt":404},["ShallowReactive",2],{"wiki-page-/wiki/2024-10-03-docker-jiao-cheng/ch1-jian-jie":3,"wiki-doc-items-/wiki/2024-10-03-docker-jiao-cheng/ch1-jian-jie":339},{"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,"layout":332,"meta":333,"navigation":330,"path":334,"seo":335,"stem":336,"wikiDepth":337,"__hash__":338},"content/wiki/2024-10-03-Docker教程/ch1-简介.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/CD 中自动测试、构建、部署",[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","/wiki/2024-10-03-docker-jiao-cheng","Docker教程","md",true,false,null,{},"/wiki/2024-10-03-docker-jiao-cheng/ch1-jian-jie",{"title":5,"description":315},"wiki/2024-10-03-Docker教程/ch1-简介",1,"PDc7mS6hXARYnlF--OnIK8OdZmO-LEXsGyFEkX1W1E8",[340,341,347,353,359,365,371,377,383,389,395,401],{"path":334,"stem":336,"title":5,"date":325,"chapter":323,"chapterSort":324,"docKey":326,"docRoot":327,"docTitle":328,"isWikiDoc":330,"isWikiIndex":331},{"path":342,"stem":343,"title":344,"date":325,"chapter":345,"chapterSort":346,"docKey":326,"docRoot":327,"docTitle":328,"isWikiDoc":330,"isWikiIndex":331},"/wiki/2024-10-03-docker-jiao-cheng/ch10-1-kuai-su-da-kai-zhong-duan","wiki/2024-10-03-Docker教程/ch10-1-快速打开终端","Docker快速打开终端","10.1",10010000,{"path":348,"stem":349,"title":350,"date":325,"chapter":351,"chapterSort":352,"docKey":326,"docRoot":327,"docTitle":328,"isWikiDoc":330,"isWikiIndex":331},"/wiki/2024-10-03-docker-jiao-cheng/ch10-docker-shi-yong-you-hua","wiki/2024-10-03-Docker教程/ch10-Docker使用优化","Docker使用优化","10",10000000,{"path":354,"stem":355,"title":356,"date":325,"chapter":357,"chapterSort":358,"docKey":326,"docRoot":327,"docTitle":328,"isWikiDoc":330,"isWikiIndex":331},"/wiki/2024-10-03-docker-jiao-cheng/ch2-an-zhuang-docker","wiki/2024-10-03-Docker教程/ch2-安装Docker","安装Docker","2",2000000,{"path":360,"stem":361,"title":362,"date":325,"chapter":363,"chapterSort":364,"docKey":326,"docRoot":327,"docTitle":328,"isWikiDoc":330,"isWikiIndex":331},"/wiki/2024-10-03-docker-jiao-cheng/ch3-docker-zhi-tong","wiki/2024-10-03-Docker教程/ch3-Docker直通","Docker直通","3",3000000,{"path":366,"stem":367,"title":368,"date":325,"chapter":369,"chapterSort":370,"docKey":326,"docRoot":327,"docTitle":328,"isWikiDoc":330,"isWikiIndex":331},"/wiki/2024-10-03-docker-jiao-cheng/ch4-dockerhub-huan-yuan","wiki/2024-10-03-Docker教程/ch4-DockerHub换源","DockerHub换源","4",4000000,{"path":372,"stem":373,"title":374,"date":325,"chapter":375,"chapterSort":376,"docKey":326,"docRoot":327,"docTitle":328,"isWikiDoc":330,"isWikiIndex":331},"/wiki/2024-10-03-docker-jiao-cheng/ch5-docker-rong-qi-li-de-cheng-xu-de-tu-xing-jie-mian-tan-bu-chu-lai","wiki/2024-10-03-Docker教程/ch5-docker容器里的程序的图形界面弹不出来","docker容器里的程序的图形界面弹不出来","5",5000000,{"path":378,"stem":379,"title":380,"date":325,"chapter":381,"chapterSort":382,"docKey":326,"docRoot":327,"docTitle":328,"isWikiDoc":330,"isWikiIndex":331},"/wiki/2024-10-03-docker-jiao-cheng/ch6-docker-ming-ling-xue-xi","wiki/2024-10-03-Docker教程/ch6-Docker命令学习","Docker命令学习","6",6000000,{"path":384,"stem":385,"title":386,"date":325,"chapter":387,"chapterSort":388,"docKey":326,"docRoot":327,"docTitle":328,"isWikiDoc":330,"isWikiIndex":331},"/wiki/2024-10-03-docker-jiao-cheng/ch7-ge-zhong-docker-rong-qi-bu-shu","wiki/2024-10-03-Docker教程/ch7-各种Docker容器部署","各种Docker容器部署","7",7000000,{"path":390,"stem":391,"title":392,"date":325,"chapter":393,"chapterSort":394,"docKey":326,"docRoot":327,"docTitle":328,"isWikiDoc":330,"isWikiIndex":331},"/wiki/2024-10-03-docker-jiao-cheng/ch8-shou-dong-chuang-jian-docker-jing-xiang","wiki/2024-10-03-Docker教程/ch8-手动创建Docker镜像","手动创建Docker镜像","8",8000000,{"path":396,"stem":397,"title":398,"date":325,"chapter":399,"chapterSort":400,"docKey":326,"docRoot":327,"docTitle":328,"isWikiDoc":330,"isWikiIndex":331},"/wiki/2024-10-03-docker-jiao-cheng/ch9-vscode-yuan-cheng-kai-fa","wiki/2024-10-03-Docker教程/ch9-VScode远程开发","VScode远程开发","9",9000000,{"path":327,"stem":402,"title":328,"date":325,"chapter":332,"chapterSort":403,"docKey":326,"docRoot":327,"docTitle":328,"isWikiDoc":330,"isWikiIndex":330},"wiki/2024-10-03-Docker教程/index",0,1778560327946]