[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-config":3,"primary-menu":6,"cat-docker":85,"catposts-docker":98,"post-detail-post-what-is-docker-f8a5e438":1004},{"config":4,"socialLinks":5},null,[],{"metadata":7,"spec":10,"menuItems":20},{"name":8,"creationTimestamp":9},"primary","2026-09-12T06:13:55.024154Z",{"displayName":11,"menuItems":12},"主菜单",[13,14,15,16,17,18,19],"88c3f10b-321c-4092-86a8-70db00251b74","menu-item-izrtmxer","c4c814d1-0c2c-456b-8c96-4864965fee94","menu-item-column","menu-item-tools","menu-item-zsxq","menu-item-ocrxlczu",[21,30,40,49,58,67,76],{"displayName":22,"metadata":23,"spec":25,"status":28,"children":29},"首页",{"name":13,"creationTimestamp":24},"2026-09-12T06:13:54.422830Z",{"displayName":22,"href":26,"priority":27,"menuName":8},"\u002F",0,{"displayName":22,"href":26},[],{"displayName":31,"metadata":32,"spec":34,"status":38,"children":39},"Java面试八股",{"name":14,"creationTimestamp":33},"2026-09-13T09:42:02.854891Z",{"displayName":31,"href":35,"target":36,"priority":37,"menuName":8},"\u002Fjava-interview","_self",1,{"displayName":31,"href":35},[],{"displayName":41,"metadata":42,"spec":44,"status":47,"children":48},"文章",{"name":15,"creationTimestamp":43},"2026-09-12T06:13:54.457307Z",{"displayName":41,"href":45,"priority":46,"menuName":8},"\u002Farchives",2,{"displayName":41,"href":45},[],{"displayName":50,"metadata":51,"spec":53,"status":56,"children":57},"项目实战",{"name":16,"creationTimestamp":52},"2026-09-14T00:35:08.138170Z",{"displayName":50,"href":54,"target":36,"priority":55,"menuName":8},"\u002Fcolumn",3,{"displayName":50,"href":54},[],{"displayName":59,"metadata":60,"spec":62,"status":65,"children":66},"在线工具",{"name":17,"creationTimestamp":61},"2026-09-14T00:35:08.171474Z",{"displayName":59,"href":63,"target":36,"priority":64,"menuName":8},"\u002Ftools",4,{"displayName":59,"href":63},[],{"displayName":68,"metadata":69,"spec":71,"status":74,"children":75},"知识星球",{"name":18,"creationTimestamp":70},"2026-09-14T00:35:08.199145Z",{"displayName":68,"href":72,"target":36,"priority":73,"menuName":8},"\u002Fzsxq",5,{"displayName":68,"href":72},[],{"displayName":77,"metadata":78,"spec":80,"status":83,"children":84},"特价云服务器",{"name":19,"creationTimestamp":79},"2026-09-25T15:30:59.201614Z",{"displayName":77,"href":81,"target":36,"priority":82,"menuName":8},"\u002Fserver",6,{"displayName":77,"href":81},[],{"metadata":86,"spec":89,"status":95,"postCount":97},{"name":87,"creationTimestamp":88},"test-docker-cat","2026-09-12T08:20:41.272236Z",{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},"Docker 教程","docker","\u002Fupload\u002Ftutorial-cover-docker.png","Docker 容器化实战教程：镜像与容器、Dockerfile、Docker Compose 及常用中间件部署。",false,{"permalink":96,"postCount":97,"visiblePostCount":97},"\u002Fcategories\u002Fdocker",43,[99,124,145,166,187,208,229,250,271,291,312,333,354,374,395,416,437,458,479,500,521,541,563,584,605,627,648,669,690,711,732,753,774,795,816,837,858,880,901,922,943,963,983],{"metadata":100,"spec":103,"status":114,"categories":119},{"name":101,"creationTimestamp":102},"post-windows-install-docker-7b76e7ed","2026-09-12T08:28:44.359805Z",{"title":104,"slug":105,"cover":106,"excerpt":107,"publishTime":109,"categories":110,"tags":111,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Windows 安装 Docker","windows-install-docker","\u002Fupload\u002Fcover-a1d86f6c6323.png",{"raw":108,"autoGenerate":94},"大家好，本小节中，我们将学习如何在 Windows 系统中安装 Docker 环境，全文图文讲解，超级详细...","2026-09-12T08:28:44.431185Z",[87],[],"PUBLIC",true,{"permalink":115,"excerpt":116,"lastModifyTime":117,"phase":118},"\u002Farchives\u002Fwindows-install-docker","本小节中，我们将学习如何在 Windows 系统中安装 Docker 环境，全文图文讲解，超级详细...","2026-09-14T00:21:04.050875Z","PUBLISHED",[120],{"metadata":121,"spec":122,"status":123,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":125,"spec":128,"status":137,"categories":140},{"name":126,"creationTimestamp":127},"post-why-use-docker-63e4ebba","2026-09-12T08:28:43.731698Z",{"title":129,"slug":130,"cover":131,"excerpt":132,"publishTime":134,"categories":135,"tags":136,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 和虚拟机的区别是什么？","why-use-docker","\u002Fupload\u002Fcover-4c84de248435.png",{"raw":133,"autoGenerate":94},"上小节中，我们了解到 Docker 是一种虚拟化技术，那么，相对于传统的虚拟机，两者之间有什么区别呢？为什么大厂流行用 Docker 呢？","2026-09-12T08:28:43.796231Z",[87],[],{"permalink":138,"excerpt":133,"lastModifyTime":139,"phase":118},"\u002Farchives\u002Fwhy-use-docker","2026-09-14T00:21:04.556515Z",[141],{"metadata":142,"spec":143,"status":144,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":146,"spec":149,"status":158,"categories":161},{"name":147,"creationTimestamp":148},"post-what-is-dockerfile-448ce59c","2026-09-12T08:28:43.099768Z",{"title":150,"slug":151,"cover":152,"excerpt":153,"publishTime":155,"categories":156,"tags":157,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"什么是 Dockerfile ?","what-is-dockerfile","\u002Fupload\u002Fcover-82e568c18a51.png",{"raw":154,"autoGenerate":94},"Dockerfile 是一个被用来构建 Docker 镜像的文本文件，该文件中包含了一行行的指令（Instruction），这些指令对应着修改、安装、构建、操作的命令，每一行指令构建一层（layer），层层累积，于是有了一个完整的镜像。","2026-09-12T08:28:43.153243Z",[87],[],{"permalink":159,"excerpt":154,"lastModifyTime":160,"phase":118},"\u002Farchives\u002Fwhat-is-dockerfile","2026-09-14T00:21:05.048687Z",[162],{"metadata":163,"spec":164,"status":165,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":167,"spec":170,"status":179,"categories":182},{"name":168,"creationTimestamp":169},"post-what-is-docker-f8a5e438","2026-09-12T08:28:42.477730Z",{"title":171,"slug":172,"cover":173,"excerpt":174,"publishTime":176,"categories":177,"tags":178,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 是干什么的？","what-is-docker","\u002Fupload\u002F166262085309991.jpg",{"raw":175,"autoGenerate":94},"Docker 是一个开源的应用容器引擎，它基于 GO 语言开发，可以让开发者在构建应用时，将应用与其依赖的环境一起打包到容器中, 然后很方便地发布到任意平台（Linux \u002F Windows）中,  以实现快速部署...","2026-09-12T08:28:42.542878Z",[87],[],{"permalink":180,"excerpt":175,"lastModifyTime":181,"phase":118},"\u002Farchives\u002Fwhat-is-docker","2026-09-14T00:21:05.462106Z",[183],{"metadata":184,"spec":185,"status":186,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":188,"spec":191,"status":200,"categories":203},{"name":189,"creationTimestamp":190},"post-what-is-docker-compose-d59b89d5","2026-09-12T08:28:41.836013Z",{"title":192,"slug":193,"cover":194,"excerpt":195,"publishTime":197,"categories":198,"tags":199,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker Compose 是干什么的？","what-is-docker-compose","\u002Fupload\u002Fcover-9a273941f45e.png",{"raw":196,"autoGenerate":94},"Docker Compose 是 Docker 官方的开源项目，能够实现对 Docker 容器集群的快速编排，以保证快速部署分布式应用 ...","2026-09-12T08:28:41.897727Z",[87],[],{"permalink":201,"excerpt":196,"lastModifyTime":202,"phase":118},"\u002Farchives\u002Fwhat-is-docker-compose","2026-09-14T00:21:05.975639Z",[204],{"metadata":205,"spec":206,"status":207,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":209,"spec":212,"status":221,"categories":224},{"name":210,"creationTimestamp":211},"post-what-diff-docker-k8s-23c07485","2026-09-12T08:28:41.236238Z",{"title":213,"slug":214,"cover":215,"excerpt":216,"publishTime":218,"categories":219,"tags":220,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"k8s 和 Docker 的区别是什么？","what-diff-docker-k8s","\u002Fupload\u002Fcover-7a64fd5e13c5.png",{"raw":217,"autoGenerate":94},"简单来说, ,k8s 和 Docker 并不是一个维度的东西，不具有可比性。它们之间是相互依存的关系，Docker 是容器引擎，而 k8s  是用来编排 Docker 等容器的协调器 ...","2026-09-12T08:28:41.301038Z",[87],[],{"permalink":222,"excerpt":217,"lastModifyTime":223,"phase":118},"\u002Farchives\u002Fwhat-diff-docker-k8s","2026-09-14T00:21:07.002754Z",[225],{"metadata":226,"spec":227,"status":228,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":230,"spec":233,"status":242,"categories":245},{"name":231,"creationTimestamp":232},"post-ubuntu-install-docker-3f241068","2026-09-12T08:28:40.591637Z",{"title":234,"slug":235,"cover":236,"excerpt":237,"publishTime":239,"categories":240,"tags":241,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Ubuntu 安装 Docker","ubuntu-install-docker","",{"raw":238,"autoGenerate":94},"要想在 Ubuntu 上安装 Docker，需要满足一些前置条件，才能安装 Docker。操作系统要求: Docker 支持以下版本的 Ubuntu  64 位操作系统， x86_64(或 amd64), armhf, arm64, 和 s390x CPU 架构均支持 Docker 安装...","2026-09-12T08:28:40.664959Z",[87],[],{"permalink":243,"excerpt":238,"lastModifyTime":244,"phase":118},"\u002Farchives\u002Fubuntu-install-docker","2026-09-12T08:28:40.595226Z",[246],{"metadata":247,"spec":248,"status":249,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":251,"spec":254,"status":263,"categories":266},{"name":252,"creationTimestamp":253},"post-macos-docker-install-1639dbf9","2026-09-12T08:28:39.867311Z",{"title":255,"slug":256,"cover":257,"excerpt":258,"publishTime":260,"categories":261,"tags":262,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"MacOS 安装 Docker","macos-docker-install","\u002Fupload\u002Fcover-6531a902ccd4.png",{"raw":259,"autoGenerate":94},"MacOS 苹果系统安装 Docker 两种方式，一种是使用 Homebrew 安装，另一种是手动下载安装包来安装，本文通过图文的方式，非常详细的讲解了如何在 MacOS 系统上完成 Docker 安装。","2026-09-12T08:28:39.928897Z",[87],[],{"permalink":264,"excerpt":259,"lastModifyTime":265,"phase":118},"\u002Farchives\u002Fmacos-docker-install","2026-09-14T00:21:07.689205Z",[267],{"metadata":268,"spec":269,"status":270,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":272,"spec":275,"status":283,"categories":286},{"name":273,"creationTimestamp":274},"post-dockerfile-commands-6162c113","2026-09-12T08:28:39.293708Z",{"title":276,"slug":277,"cover":236,"excerpt":278,"publishTime":280,"categories":281,"tags":282,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Dockerfile 常用指令汇总","dockerfile-commands",{"raw":279,"autoGenerate":94},"想要熟练使用 Dockerfile 制作构建镜像，就需要熟悉 Dockerfile 常用指令，前面小节中我们知道了 COPY 、ADD 指令，除此之外，Dockerfile 还额外提供了十多个指令。下面是 Dockerfile 常用指令汇总 ...","2026-09-12T08:28:39.353856Z",[87],[],{"permalink":284,"excerpt":279,"lastModifyTime":285,"phase":118},"\u002Farchives\u002Fdockerfile-commands","2026-09-12T08:28:39.297226Z",[287],{"metadata":288,"spec":289,"status":290,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":292,"spec":295,"status":304,"categories":307},{"name":293,"creationTimestamp":294},"post-dockerfile-build-image-59898e1c","2026-09-12T08:28:38.683864Z",{"title":296,"slug":297,"cover":298,"excerpt":299,"publishTime":301,"categories":302,"tags":303,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Dockerfile 制作构建镜像","dockerfile-build-image","\u002Fupload\u002Fcover-5d0745d6b951.png",{"raw":300,"autoGenerate":94},"本小节中，我们将上手通过 Dockerfile 制作第一个镜像，此镜像也非常简单，即定制一个 Nginx 镜像，唯一不同的是，我们需要将 Nginx 默认的首页欢迎语更改为 Hello, Nginx by Docker ...","2026-09-12T08:28:38.762107Z",[87],[],{"permalink":305,"excerpt":300,"lastModifyTime":306,"phase":118},"\u002Farchives\u002Fdockerfile-build-image","2026-09-14T00:21:08.257217Z",[308],{"metadata":309,"spec":310,"status":311,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":313,"spec":316,"status":325,"categories":328},{"name":314,"creationTimestamp":315},"post-docker-volume-2ab5edb3","2026-09-12T08:28:37.847806Z",{"title":317,"slug":318,"cover":319,"excerpt":320,"publishTime":322,"categories":323,"tags":324,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 数据卷","docker-volume","\u002Fupload\u002Fcover-4bbe3061884e.png",{"raw":321,"autoGenerate":94},"简单来说，数据卷是一个可供一个或多个容器使用的特殊目录，用于持久化数据以及共享容器间的数据，它以正常的文件或目录的形式存在于宿主机上。另外，其生命周期独立于容器的生命周期，即当你删除容器时，数据卷并不会被删除 ...","2026-09-12T08:28:38.029002Z",[87],[],{"permalink":326,"excerpt":321,"lastModifyTime":327,"phase":118},"\u002Farchives\u002Fdocker-volume","2026-09-14T00:21:08.639580Z",[329],{"metadata":330,"spec":331,"status":332,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":334,"spec":337,"status":346,"categories":349},{"name":335,"creationTimestamp":336},"post-docker-volume-container-9d665afc","2026-09-12T08:28:37.210457Z",{"title":338,"slug":339,"cover":340,"excerpt":341,"publishTime":343,"categories":344,"tags":345,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 数据卷容器","docker-volume-container","\u002Fupload\u002F165804090120953.jpg",{"raw":342,"autoGenerate":94},"如果你有一些需要持续更新的数据需要在容器之间共享，最佳实践是创建数据卷容器。数据卷容器，其实就是一个正常的 Docker 容器，专门用于提供数据卷供其他容器挂载的 ...","2026-09-12T08:28:37.263345Z",[87],[],{"permalink":347,"excerpt":342,"lastModifyTime":348,"phase":118},"\u002Farchives\u002Fdocker-volume-container","2026-09-13T05:18:47.535534Z",[350],{"metadata":351,"spec":352,"status":353,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":355,"spec":358,"status":366,"categories":369},{"name":356,"creationTimestamp":357},"post-docker-volume-backup-8d4028da","2026-09-12T08:28:36.602929Z",{"title":359,"slug":360,"cover":236,"excerpt":361,"publishTime":363,"categories":364,"tags":365,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 使用数据卷容器备份、恢复、迁移数据卷","docker-volume-backup",{"raw":362,"autoGenerate":94},"本小节中，我们将学习如何对数据卷容器中的数据进行进行备份、恢复和迁移。首先使用 --volumes-from 命令创建一个加载 dbdata 的容器卷容器 ...","2026-09-12T08:28:36.662322Z",[87],[],{"permalink":367,"excerpt":362,"lastModifyTime":368,"phase":118},"\u002Farchives\u002Fdocker-volume-backup","2026-09-12T08:28:36.606521Z",[370],{"metadata":371,"spec":372,"status":373,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":375,"spec":378,"status":387,"categories":390},{"name":376,"creationTimestamp":377},"post-docker-upload-image-b7b32c97","2026-09-12T08:28:35.848750Z",{"title":379,"slug":380,"cover":381,"excerpt":382,"publishTime":384,"categories":385,"tags":386,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 上传镜像","docker-upload-image","\u002Fupload\u002Fcover-dfe11ebe8783.png",{"raw":383,"autoGenerate":94},"本文中，我们将学习如何将镜像上传至 Docker Hub 上。想要上传镜像到 Docker Hub 上，首先，我们需要注册 Docker Hub 账号。打开 Docker Hub 网址 https:\u002F\u002Fhub.docker.com，开始注册 ...","2026-09-12T08:28:35.907099Z",[87],[],{"permalink":388,"excerpt":383,"lastModifyTime":389,"phase":118},"\u002Farchives\u002Fdocker-upload-image","2026-09-14T00:21:09.433485Z",[391],{"metadata":392,"spec":393,"status":394,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":396,"spec":399,"status":408,"categories":411},{"name":397,"creationTimestamp":398},"post-docker-total-cmd-c814048a","2026-09-12T08:28:35.278844Z",{"title":400,"slug":401,"cover":402,"excerpt":403,"publishTime":405,"categories":406,"tags":407,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 常用命令大全","docker-total-cmd","\u002Fupload\u002F166255773325089.jpg",{"raw":404,"autoGenerate":94},"本文汇总了 Docker 常用的一些命令，分门别类都总结好了，超级全面...","2026-09-12T08:28:35.346290Z",[87],[],{"permalink":409,"excerpt":404,"lastModifyTime":410,"phase":118},"\u002Farchives\u002Fdocker-total-cmd","2026-09-13T05:18:57.588086Z",[412],{"metadata":413,"spec":414,"status":415,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":417,"spec":420,"status":429,"categories":432},{"name":418,"creationTimestamp":419},"post-docker-stop-container-77342052","2026-09-12T08:28:34.458193Z",{"title":421,"slug":422,"cover":423,"excerpt":424,"publishTime":426,"categories":427,"tags":428,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 停止&amp;关闭容器","docker-stop-container","\u002Fupload\u002F165683843779847.jpg",{"raw":425,"autoGenerate":94},"Docker 中通过 docker container stop 命令停止关闭一个正在运行的容器，举个例子🌰，比如想要停止下图中的 Ubuntu 容器，通过容器 ID 或者容器名称都可以停止容器 ...","2026-09-12T08:28:34.517887Z",[87],[],{"permalink":430,"excerpt":425,"lastModifyTime":431,"phase":118},"\u002Farchives\u002Fdocker-stop-container","2026-09-13T05:18:58.637618Z",[433],{"metadata":434,"spec":435,"status":436,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":438,"spec":441,"status":450,"categories":453},{"name":439,"creationTimestamp":440},"post-docker-search-image-57657128","2026-09-12T08:28:33.812287Z",{"title":442,"slug":443,"cover":444,"excerpt":445,"publishTime":447,"categories":448,"tags":449,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 搜索镜像","docker-search-image","\u002Fupload\u002F165700112104243.jpg",{"raw":446,"autoGenerate":94},"在 Docker 中，通过 docker search [option] keyword 命令搜索镜像，比如，你想搜索仓库中 mysql 相关的镜像，可以输入如下命令 ...","2026-09-12T08:28:33.871570Z",[87],[],{"permalink":451,"excerpt":446,"lastModifyTime":452,"phase":118},"\u002Farchives\u002Fdocker-search-image","2026-09-13T05:19:00.305759Z",[454],{"metadata":455,"spec":456,"status":457,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":459,"spec":462,"status":471,"categories":474},{"name":460,"creationTimestamp":461},"post-docker-save-load-image-e3603a96","2026-09-12T08:28:33.199217Z",{"title":463,"slug":464,"cover":465,"excerpt":466,"publishTime":468,"categories":469,"tags":470,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 导出&amp;导入镜像","docker-save-load-image","\u002Fupload\u002F165700399037320.jpg",{"raw":467,"autoGenerate":94},"日常编码中，如果需要将自己本地的镜像分享给别人，可以将镜像导出成 tar 包，别人直接导入这个 tar 包，即可将镜像引入到本地镜像库。小伙伴可以通过 docker save 命令可以导出 Docker 镜像 ...","2026-09-12T08:28:33.254322Z",[87],[],{"permalink":472,"excerpt":467,"lastModifyTime":473,"phase":118},"\u002Farchives\u002Fdocker-save-load-image","2026-09-13T05:19:00.962108Z",[475],{"metadata":476,"spec":477,"status":478,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":480,"spec":483,"status":492,"categories":495},{"name":481,"creationTimestamp":482},"post-docker-run-container-67ac48aa","2026-09-12T08:28:32.567783Z",{"title":484,"slug":485,"cover":486,"excerpt":487,"publishTime":489,"categories":490,"tags":491,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 启动容器","docker-run-container","\u002Fupload\u002F165675444666134.jpg",{"raw":488,"autoGenerate":94},"启动容器有两种方式，第一种是基于镜像新建一个容器并启动，第二种是将在终止状态 exited 的容器重新启动，本文以图文的方式告诉大家如何启动 Docker 容器 ...","2026-09-12T08:28:32.633365Z",[87],[],{"permalink":493,"excerpt":488,"lastModifyTime":494,"phase":118},"\u002Farchives\u002Fdocker-run-container","2026-09-13T05:19:02.556640Z",[496],{"metadata":497,"spec":498,"status":499,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":501,"spec":504,"status":513,"categories":516},{"name":502,"creationTimestamp":503},"post-docker-restart-container-f6aa701c","2026-09-12T08:28:31.942254Z",{"title":505,"slug":506,"cover":507,"excerpt":508,"publishTime":510,"categories":511,"tags":512,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 重启容器","docker-restart-container","\u002Fupload\u002F165693588723614.jpg",{"raw":509,"autoGenerate":94},"执行 docker restart [container ID or NAMES] 命令重启 Docker 容器，举个例子🌰，比如想要重启下面的 Redis 容器 ...","2026-09-12T08:28:32.010484Z",[87],[],{"permalink":514,"excerpt":509,"lastModifyTime":515,"phase":118},"\u002Farchives\u002Fdocker-restart-container","2026-09-13T05:19:03.126874Z",[517],{"metadata":518,"spec":519,"status":520,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":522,"spec":525,"status":533,"categories":536},{"name":523,"creationTimestamp":524},"post-docker-repository-9d5fb9d2","2026-09-12T08:28:31.303127Z",{"title":526,"slug":527,"cover":236,"excerpt":528,"publishTime":530,"categories":531,"tags":532,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 仓库","docker-repository",{"raw":529,"autoGenerate":94},"一个 Docker Registry 中可以包含多个仓库（Repository）；每个仓库可以包含多个标签（Tag）；每个标签对应一个镜像 ...","2026-09-12T08:28:31.370426Z",[87],[],{"permalink":534,"excerpt":529,"lastModifyTime":535,"phase":118},"\u002Farchives\u002Fdocker-repository","2026-09-12T08:28:31.308023Z",[537],{"metadata":538,"spec":539,"status":540,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":542,"spec":545,"status":554,"categories":558},{"name":543,"creationTimestamp":544},"post-docker-remove-image-22a14910","2026-09-12T08:28:30.044587Z",{"title":546,"slug":547,"cover":548,"excerpt":549,"publishTime":551,"categories":552,"tags":553,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 删除镜像","docker-remove-image","\u002Fupload\u002F165641372835974.jpg",{"raw":550,"autoGenerate":94},"大家好，本小节中，将学习 Docker 如何删除镜像。有两种方式，分别是通过标签删除镜像，以及通过 ID 删除镜像。","2026-09-12T08:28:30.170036Z",[87],[],{"permalink":555,"excerpt":556,"lastModifyTime":557,"phase":118},"\u002Farchives\u002Fdocker-remove-image","本小节中，将学习 Docker 如何删除镜像。有两种方式，分别是通过标签删除镜像，以及通过 ID 删除镜像。","2026-09-13T05:19:04.427106Z",[559],{"metadata":560,"spec":561,"status":562,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":564,"spec":567,"status":576,"categories":579},{"name":565,"creationTimestamp":566},"post-docker-ps-container-cc726a97","2026-09-12T08:28:29.271365Z",{"title":568,"slug":569,"cover":570,"excerpt":571,"publishTime":573,"categories":574,"tags":575,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 查看容器","docker-ps-container","\u002Fupload\u002F165692898193876.jpg",{"raw":572,"autoGenerate":94},"在 Docker 中，我们可以通过 docker ps 命令查看正在运行中的容器，docker ps -a 命令可以查看所有容器，包括运行中的、已经停止运行的容器...","2026-09-12T08:28:29.336224Z",[87],[],{"permalink":577,"excerpt":572,"lastModifyTime":578,"phase":118},"\u002Farchives\u002Fdocker-ps-container","2026-09-13T05:19:05.550572Z",[580],{"metadata":581,"spec":582,"status":583,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":585,"spec":588,"status":597,"categories":600},{"name":586,"creationTimestamp":587},"post-docker-nginx-install-ssl-a377919f","2026-09-12T08:28:28.665687Z",{"title":589,"slug":590,"cover":591,"excerpt":592,"publishTime":594,"categories":595,"tags":596,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker Nginx 配置安装 SSL 证书（支持 Https 访问）","docker-nginx-install-ssl","\u002Fupload\u002Fcover-4ca56e528d21.png",{"raw":593,"autoGenerate":94},"上小节《Docker 安装 Nginx》中，我们已经学会了通过 Docker 快速安装 Nginx ，以及配置反向代理，本小节中，我们将学习如何为 Nginx 配置安装 SSL 证书，使网站支持通过 Https 协议访问 ...","2026-09-12T08:28:28.738926Z",[87],[],{"permalink":598,"excerpt":593,"lastModifyTime":599,"phase":118},"\u002Farchives\u002Fdocker-nginx-install-ssl","2026-09-14T00:21:10.398179Z",[601],{"metadata":602,"spec":603,"status":604,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":606,"spec":609,"status":618,"categories":622},{"name":607,"creationTimestamp":608},"post-docker-look-image-6e9a9628","2026-09-12T08:28:28.024749Z",{"title":610,"slug":611,"cover":612,"excerpt":613,"publishTime":615,"categories":616,"tags":617,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 查看镜像信息","docker-look-image","\u002Fupload\u002F165648660235112.jpg",{"raw":614,"autoGenerate":94},"大家好，本小节中，我们将学习 Docker 如何查看镜像信息。通过命令 docker images 或者 docker image ls 即可列出本地已下载的镜像 ...","2026-09-12T08:28:28.085240Z",[87],[],{"permalink":619,"excerpt":620,"lastModifyTime":621,"phase":118},"\u002Farchives\u002Fdocker-look-image","本小节中，我们将学习 Docker 如何查看镜像信息。通过命令 docker images 或者 docker image ls 即可列出本地已下载的镜像 ...","2026-09-13T05:19:16.479315Z",[623],{"metadata":624,"spec":625,"status":626,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":628,"spec":631,"status":640,"categories":643},{"name":629,"creationTimestamp":630},"post-docker-install-zookeeper-72ccf30f","2026-09-12T08:28:27.267923Z",{"title":632,"slug":633,"cover":634,"excerpt":635,"publishTime":637,"categories":638,"tags":639,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 安装 Zookeeper（图文教程）","docker-install-zookeeper","\u002Fupload\u002F172293048784392.jpg",{"raw":636,"autoGenerate":94},"我们已经测试了美团 Leaf-segment 号段模式（依赖数据库）来获取分布式 ID ,  除了该模式外，还有 Leaf-snowflake  （基于雪花算法）模式，它依赖于 Zookeeper , 所以，本小节的内容是，在本地通过 Docker 将单机版的 Zookeeper 环境搭建好。","2026-09-12T08:28:27.343802Z",[87],[],{"permalink":641,"excerpt":636,"lastModifyTime":642,"phase":118},"\u002Farchives\u002Fdocker-install-zookeeper","2026-09-13T05:19:21.645282Z",[644],{"metadata":645,"spec":646,"status":647,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":649,"spec":652,"status":661,"categories":664},{"name":650,"creationTimestamp":651},"post-docker-install-redis-5af17add","2026-09-12T08:28:26.614853Z",{"title":653,"slug":654,"cover":655,"excerpt":656,"publishTime":658,"categories":659,"tags":660,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 安装 Redis（图文教程）","docker-install-redis","\u002Fupload\u002F165624364123749.png",{"raw":657,"autoGenerate":94},"在星球第二个项目后续的业务功能开发中，会频繁使用到分布式缓存 Redis，那么，本小节中，我就将演示如何通过 Docker 快速的将本地的 Redis 环境搭建好...","2026-09-12T08:28:26.683365Z",[87],[],{"permalink":662,"excerpt":657,"lastModifyTime":663,"phase":118},"\u002Farchives\u002Fdocker-install-redis","2026-09-13T05:19:35.352647Z",[665],{"metadata":666,"spec":667,"status":668,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":670,"spec":673,"status":682,"categories":685},{"name":671,"creationTimestamp":672},"post-docker-install-nginx-f7369a19","2026-09-12T08:28:25.931765Z",{"title":674,"slug":675,"cover":676,"excerpt":677,"publishTime":679,"categories":680,"tags":681,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 安装 Nginx","docker-install-nginx","\u002Fupload\u002F165736441796898.jpg",{"raw":678,"autoGenerate":94},"本小节中，我们将学习如何通过 Docker 快速安装 Ngnix, 并反向代理到后台的 Web 服务。 执行 docker pull nginx:1.19.4 下载 Nginx 镜像，命令执行成功后，通过 docker images 命令检查一下镜像是否下载成功...","2026-09-12T08:28:25.994216Z",[87],[],{"permalink":683,"excerpt":678,"lastModifyTime":684,"phase":118},"\u002Farchives\u002Fdocker-install-nginx","2026-09-14T00:21:10.892893Z",[686],{"metadata":687,"spec":688,"status":689,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":691,"spec":694,"status":703,"categories":706},{"name":692,"creationTimestamp":693},"post-docker-install-mysql-4f03f35f","2026-09-12T08:28:25.312248Z",{"title":695,"slug":696,"cover":697,"excerpt":698,"publishTime":700,"categories":701,"tags":702,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 安装 MySQL（图文教程）","docker-install-mysql","\u002Fupload\u002F165702232024982.jpg",{"raw":699,"autoGenerate":94},"本小节中，我们将学习如何通过 Docker 快速安装 Mysql 环境。这里以安装 Mysql 5.7 版本为例，执行 docker pull mysql:5.7 命令，下载完成后，通过 docker images 检查一下镜像是否下载成功...","2026-09-12T08:28:25.380377Z",[87],[],{"permalink":704,"excerpt":699,"lastModifyTime":705,"phase":118},"\u002Farchives\u002Fdocker-install-mysql","2026-09-14T00:21:11.609663Z",[707],{"metadata":708,"spec":709,"status":710,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":712,"spec":715,"status":724,"categories":727},{"name":713,"creationTimestamp":714},"post-docker-install-minio-b6dec88d","2026-09-12T08:28:24.603453Z",{"title":716,"slug":717,"cover":718,"excerpt":719,"publishTime":721,"categories":722,"tags":723,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 安装 Minio 分布式存储（图文教程）","docker-install-minio","\u002Fupload\u002F169663913789430.jpg",{"raw":720,"autoGenerate":94},"在我们的《前后端分离博客项目中》，涉及到上传博客 LOGO 图片、作者头像，以及后续发布文章也需要支持图片上传。所以，我们首先需要搭建一个图床服务，这里我选型的是 Minio 对象存储，它不光可以存储图片，还能存储文件、视频等，非常强大...","2026-09-12T08:28:24.669227Z",[87],[],{"permalink":725,"excerpt":720,"lastModifyTime":726,"phase":118},"\u002Farchives\u002Fdocker-install-minio","2026-09-14T00:21:12.617965Z",[728],{"metadata":729,"spec":730,"status":731,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":733,"spec":736,"status":745,"categories":748},{"name":734,"creationTimestamp":735},"post-docker-install-jenkins-cac21be2","2026-09-12T08:28:23.983351Z",{"title":737,"slug":738,"cover":739,"excerpt":740,"publishTime":742,"categories":743,"tags":744,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 安装 Jenkins（图文教程）","docker-install-jenkins","\u002Fupload\u002Fcover-b97f087a779d.png",{"raw":741,"autoGenerate":94},"Jenkins 是一个开源的持续集成（Continuous Integration）工具，它的主要作用是帮助开发团队自动化构建、测试和部署软件项目。通俗来说，Jenkins 可以在每次代码变更时，帮助我们自动进行一系列的操作，例如编译代码、运行测试、生成文档，甚至是将应用程序部署到服务器上。","2026-09-12T08:28:24.043455Z",[87],[],{"permalink":746,"excerpt":741,"lastModifyTime":747,"phase":118},"\u002Farchives\u002Fdocker-install-jenkins","2026-09-14T00:21:13.189071Z",[749],{"metadata":750,"spec":751,"status":752,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":754,"spec":757,"status":766,"categories":769},{"name":755,"creationTimestamp":756},"post-docker-install-compose-d427ef40","2026-09-12T08:28:23.146866Z",{"title":758,"slug":759,"cover":760,"excerpt":761,"publishTime":763,"categories":764,"tags":765,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker Compose 安装与卸载","docker-install-compose","\u002Fupload\u002F166366076551050.png",{"raw":762,"autoGenerate":94},"Docker Compose 支持 Linux、MacOS、Windows 10 以及更高版本等主流操作系统的安装，本文通过图文详细说明了不同系统中，Docker Compose 要如何镜像安装与卸载 ...","2026-09-12T08:28:23.213491Z",[87],[],{"permalink":767,"excerpt":762,"lastModifyTime":768,"phase":118},"\u002Farchives\u002Fdocker-install-compose","2026-09-13T05:20:22.953112Z",[770],{"metadata":771,"spec":772,"status":773,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":775,"spec":778,"status":787,"categories":790},{"name":776,"creationTimestamp":777},"post-docker-install-cassandra-03d02f70","2026-09-12T08:28:22.473185Z",{"title":779,"slug":780,"cover":781,"excerpt":782,"publishTime":784,"categories":785,"tags":786,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 安装 Cassandra 数据库（图文教程）","docker-install-cassandra","\u002Fupload\u002F172179052498364.jpg",{"raw":783,"autoGenerate":94},"本小节中，我们将通过 Docker 把本地的 Cassandra 测试环境搭建起来。Apache Cassandra 是一个开源的分布式 NoSQL（Not Only SQL）数据库管理系统，专为处理大规模数据量和高写入频率的工作负载而设计。","2026-09-12T08:28:22.546599Z",[87],[],{"permalink":788,"excerpt":783,"lastModifyTime":789,"phase":118},"\u002Farchives\u002Fdocker-install-cassandra","2026-09-13T05:20:25.158312Z",[791],{"metadata":792,"spec":793,"status":794,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":796,"spec":799,"status":808,"categories":811},{"name":797,"creationTimestamp":798},"post-docker-image-e76362b6","2026-09-12T08:28:21.839619Z",{"title":800,"slug":801,"cover":802,"excerpt":803,"publishTime":805,"categories":806,"tags":807,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 镜像","docker-image","\u002Fupload\u002Fcover-c40a46c7dc01.png",{"raw":804,"autoGenerate":94},"镜像是 Docker 的三个基本概念之一，它是 Docker 运行容器的前提，仓库是存放镜像的场所。Docker 镜像是一个特殊的文件系统，除了提供容器运行时所需的程序、库、资源、配置等文件外...","2026-09-12T08:28:21.903334Z",[87],[],{"permalink":809,"excerpt":804,"lastModifyTime":810,"phase":118},"\u002Farchives\u002Fdocker-image","2026-09-14T00:21:13.584509Z",[812],{"metadata":813,"spec":814,"status":815,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":817,"spec":820,"status":829,"categories":832},{"name":818,"creationTimestamp":819},"post-docker-export-import-container-541bad36","2026-09-12T08:28:21.240842Z",{"title":821,"slug":822,"cover":823,"excerpt":824,"publishTime":826,"categories":827,"tags":828,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 导出&amp;导入容器","docker-export-import-container","\u002Fupload\u002F165698500345714.jpg",{"raw":825,"autoGenerate":94},"使用 docker export 命令可以导出容器，比如想导出下面的 Redis 容器，执行  docker export 9e8d11aeef0c &gt; redis.tar 命令即可，导出的 tar 包快照存于当前目录下...","2026-09-12T08:28:21.304957Z",[87],[],{"permalink":830,"excerpt":825,"lastModifyTime":831,"phase":118},"\u002Farchives\u002Fdocker-export-import-container","2026-09-13T05:20:25.998391Z",[833],{"metadata":834,"spec":835,"status":836,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":838,"spec":841,"status":850,"categories":853},{"name":839,"creationTimestamp":840},"post-docker-exec-container-4e90d582","2026-09-12T08:28:20.597994Z",{"title":842,"slug":843,"cover":844,"excerpt":845,"publishTime":847,"categories":848,"tags":849,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 进入容器命令","docker-exec-container","\u002Fupload\u002F165685069315125.jpg",{"raw":846,"autoGenerate":94},"要想进入到已运行的 Docker 容器，主要有如下两种方式，第一种使用 docker exec命令，第二种使用 docker attach 命令...","2026-09-12T08:28:20.663925Z",[87],[],{"permalink":851,"excerpt":846,"lastModifyTime":852,"phase":118},"\u002Farchives\u002Fdocker-exec-container","2026-09-13T05:20:26.724480Z",[854],{"metadata":855,"spec":856,"status":857,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":859,"spec":862,"status":871,"categories":875},{"name":860,"creationTimestamp":861},"post-docker-download-image-bae8d2fe","2026-09-12T08:28:19.928197Z",{"title":863,"slug":864,"cover":865,"excerpt":866,"publishTime":868,"categories":869,"tags":870,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 拉取&amp;下载镜像","docker-download-image","\u002Fupload\u002F165648522762749.jpg",{"raw":867,"autoGenerate":94},"大家好，本文中，我们将需要学习 Docker 如何拉取&amp;下载镜像？想要在本地运行 Docker 容器，需要先下载 Docker 镜像。默认情况下，Docker 会尝试从 Docker Hub 镜像仓库下载。另外，用户也可以自定义配置镜像仓库地址 ...","2026-09-12T08:28:19.996485Z",[87],[],{"permalink":872,"excerpt":873,"lastModifyTime":874,"phase":118},"\u002Farchives\u002Fdocker-download-image","本文中，我们将需要学习 Docker 如何拉取&amp;下载镜像？想要在本地运行 Docker 容器，需要先下载 Docker 镜像。默认情况下，Docker 会尝试从 Docker Hub 镜像仓库下载。另外，用户也可以自定义配置镜像仓库地址 ...","2026-09-13T05:20:27.610905Z",[876],{"metadata":877,"spec":878,"status":879,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":881,"spec":884,"status":893,"categories":896},{"name":882,"creationTimestamp":883},"post-docker-delete-container-561986e7","2026-09-12T08:28:19.306727Z",{"title":885,"slug":886,"cover":887,"excerpt":888,"publishTime":890,"categories":891,"tags":892,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 删除容器","docker-delete-container","\u002Fupload\u002F165685534557469.jpg",{"raw":889,"autoGenerate":94},"本小节中将学习如何删除 Docker 容器。执行 docker container rm 命令可以删除一个已经停止运行的容器。举个例子，比如想要删除下面的 Redis 容器...","2026-09-12T08:28:19.369523Z",[87],[],{"permalink":894,"excerpt":889,"lastModifyTime":895,"phase":118},"\u002Farchives\u002Fdocker-delete-container","2026-09-13T05:20:28.217987Z",[897],{"metadata":898,"spec":899,"status":900,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":902,"spec":905,"status":914,"categories":917},{"name":903,"creationTimestamp":904},"post-docker-container-bccc3314","2026-09-12T08:28:18.682458Z",{"title":906,"slug":907,"cover":908,"excerpt":909,"publishTime":911,"categories":912,"tags":913,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 容器","docker-container","\u002Fupload\u002Fcover-900796218579.png",{"raw":910,"autoGenerate":94},"通过 Docker 镜像运行的实例称之为容器，两者的关系就像是面向对象程序设计中的类和实例一样，镜像是静态的定义，容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 ...","2026-09-12T08:28:18.747600Z",[87],[],{"permalink":915,"excerpt":910,"lastModifyTime":916,"phase":118},"\u002Farchives\u002Fdocker-container","2026-09-14T00:21:13.932628Z",[918],{"metadata":919,"spec":920,"status":921,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":923,"spec":926,"status":935,"categories":938},{"name":924,"creationTimestamp":925},"post-docker-compose-example-5841178a","2026-09-12T08:28:18.028525Z",{"title":927,"slug":928,"cover":929,"excerpt":930,"publishTime":932,"categories":933,"tags":934,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker Compose 实战 web 服务","docker-compose-example","\u002Fupload\u002F166467690411164.png",{"raw":931,"autoGenerate":94},"本小节中，我们将通过 Docker Compose 搭建一个简单的网站。这个简单的网站需实现功能：每当用户访问时，页面显示总访问次数 ...","2026-09-12T08:28:18.096894Z",[87],[],{"permalink":936,"excerpt":931,"lastModifyTime":937,"phase":118},"\u002Farchives\u002Fdocker-compose-example","2026-09-13T05:20:32.006565Z",[939],{"metadata":940,"spec":941,"status":942,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":944,"spec":947,"status":955,"categories":958},{"name":945,"creationTimestamp":946},"post-docker-compose-commands-4193309c","2026-09-12T08:28:17.286875Z",{"title":948,"slug":949,"cover":236,"excerpt":950,"publishTime":952,"categories":953,"tags":954,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker Compose 命令大全","docker-compose-commands",{"raw":951,"autoGenerate":94},"本小节中，我们将学习 docker-compose 命令的使用，以及相关命令说明 ...","2026-09-12T08:28:17.374056Z",[87],[],{"permalink":956,"excerpt":951,"lastModifyTime":957,"phase":118},"\u002Farchives\u002Fdocker-compose-commands","2026-09-12T08:28:17.290603Z",[959],{"metadata":960,"spec":961,"status":962,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":964,"spec":967,"status":975,"categories":978},{"name":965,"creationTimestamp":966},"post-centos-install-docker-6341005b","2026-09-12T08:28:16.420289Z",{"title":968,"slug":969,"cover":236,"excerpt":970,"publishTime":972,"categories":973,"tags":974,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"CentOS 安装 Docker","centos-install-docker",{"raw":971,"autoGenerate":94},"Docker 支持以下 64 位的 CentOS 版本, 且内核版本不低于 3.10, 安装之前，请先卸载旧版本的 Docker ...","2026-09-12T08:28:16.506229Z",[87],[],{"permalink":976,"excerpt":971,"lastModifyTime":977,"phase":118},"\u002Farchives\u002Fcentos-install-docker","2026-09-12T08:28:16.424268Z",[979],{"metadata":980,"spec":981,"status":982,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":984,"spec":987,"status":996,"categories":999},{"name":985,"creationTimestamp":986},"post-aliyun-docker-registry-ffd7badf","2026-09-12T08:28:15.567618Z",{"title":988,"slug":989,"cover":990,"excerpt":991,"publishTime":993,"categories":994,"tags":995,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},"Docker 镜像加速器（配置阿里云）","aliyun-docker-registry","\u002Fupload\u002Fcover-0cca1a8bc3e5.png",{"raw":992,"autoGenerate":94},"Docker 默认情况下是从官方 Docker Hub 下载镜像，但是由于 Docker Hub 服务器在国外的缘故，国内用户在下载镜像的时候，会非常慢。想要解决这个问题，我们可以配置国内的镜像加速器，如阿里云加速器、DaoCloud、网易加速器、百度云加速器等等。接下来，我将演示如何配置阿里云镜像加速器。","2026-09-12T08:28:15.641590Z",[87],[],{"permalink":997,"excerpt":992,"lastModifyTime":998,"phase":118},"\u002Farchives\u002Faliyun-docker-registry","2026-09-14T00:21:14.569395Z",[1000],{"metadata":1001,"spec":1002,"status":1003,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"metadata":1005,"spec":1006,"status":1010,"categories":1011,"content":1016},{"name":168,"creationTimestamp":169},{"title":171,"slug":172,"cover":173,"excerpt":1007,"publishTime":176,"categories":1008,"tags":1009,"priority":27,"pinned":94,"deleted":94,"visible":112,"allowComment":113},{"raw":175,"autoGenerate":94},[87],[],{"permalink":180,"excerpt":175,"lastModifyTime":181,"phase":118},[1012],{"metadata":1013,"spec":1014,"status":1015,"postCount":97},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":91,"cover":92,"description":93,"priority":27,"hideFromList":94,"preventParentPostCascadeQuery":94},{"permalink":96,"postCount":97,"visiblePostCount":97},{"content":1017,"raw":1017},"\u003Cp>\n\u003Cimg src=\"\u002Fupload\u002F166262085309991.jpg\" loading=\"lazy\" title=\"Docker 是什么？\" alt=\"Docker 是什么？\">\u003Cspan class=\"image-caption\">Docker 是什么？\u003C\u002Fspan>\n\u003C\u002Fp>\n\u003Cp>先来看下官网的介绍，原文如下：\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>翻译一下，意思如下：\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Docker 是一个\u003Cstrong>开源的平台\u003C\u002Fstrong>，我们\u003Cstrong>可以用 Docker 来开发、部署和运行我们的应用程序\u003C\u002Fstrong>。Docker 可以帮助我们\u003Cstrong>将应用程序和底层基础设施进行分离，以帮助我们更快的实现交付\u003C\u002Fstrong>。通过 Docker 技术，我们可以像管理我们的应用一样管理我们的基础设施（比如操作系统、依赖的开发包等）。通过 Docker 技术，可以精简我们的整个开发和交互流程。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>\u003Cem>说人话，要怎么理解官方的定义？\u003C\u002Fem>\u003C\u002Fp>\n\u003Cp>做过开发的小伙伴，在工作中肯定也遇到过下面的场景：\u003C\u002Fp>\n\u003Cp>测试工程师：&quot;你的代码有 Bug，测试不通过！&quot;\u003C\u002Fp>\n\u003Cp>开发工程师： &quot;放屁 ！ 我在自己机器上测试都是 OK 的 ！你会用吗？&quot;\u003C\u002Fp>\n\u003Cp>\n\u003Cimg src=\"\u002Fupload\u002F166987592152182.jpg\" loading=\"lazy\" title=\"你写的代码有问题！\" alt=\"你写的代码有问题！\">\u003Cspan class=\"image-caption\">你写的代码有问题！\u003C\u002Fspan>\n\u003C\u002Fp>\n\u003Cp>我就碰到过类似情况，当时开发一个导出文件功能，本地测试功能没有任何问题，提交到测试环境后，测试小伙伴反馈报错。一番排查后，最终找到原因是 JDK 版本的原因，测试环境用的 Open JDK 版本, 而我本地测试用的 Oracle JDK 版本。Open JDK 作为 Oracle JDK 的阉割版本，少了某个字体，从而导致文件导出功能报错。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>传统的软件开发模式是: 开发人员在本地先开发好应用，然后提交到测试环境，测试人员测试没有问题，最终部署到线上，供用户使用。\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>\u003Cstrong>痛点：由于交付的单元是应用，但是应用又依赖于基础设施，比如依赖操作系统、开发包版本等等。这些因素的不确定性，导致了上面问题的发生。\u003C\u002Fstrong>\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>\u003Cem>有什么优雅的方式解决这个问题呢？\u003C\u002Fem>\u003C\u002Fp>\n\u003Cp>相信大家都安装过虚拟机，比如你想在 Windows 电脑上搭建一个 Linux 系统，需要提前下载好 Linux 系统的 ISO 镜像文件，然后通过它就可以安装一个 Linux 系统。\u003C\u002Fp>\n\u003Cp>\n\u003Cimg src=\"\u002Fupload\u002F167180164515485.jpg\" loading=\"lazy\" title=\"Vmware 虚拟机\" alt=\"Vmware 虚拟机\">\u003Cspan class=\"image-caption\">Vmware 虚拟机\u003C\u002Fspan>\n\u003C\u002Fp>\n\u003Cp>这和 Docker 有什么关系呢？Docker 其实是一个\u003Cstrong>轻量级的虚拟化技术\u003C\u002Fstrong>。\u003Cstrong>Docker 可以让开发者在构建应用时，将应用与其依赖的环境一起打包到一个可移植的容器中\u003C\u002Fstrong>, 然后很方便地发布到任意操作系统中。倘若，测试人员面向的是整个打包好的容器进行测试，那么，上述提到的问题将不会发生。\u003C\u002Fp>\n\u003Ch2>Docker 的历史\u003C\u002Fh2>\n\u003Cp>2010 年，下图这位名叫 Solomon Hykes 的帅气小伙在美国成立了 dotCloud 公司，从此开启了容器化时代。\u003C\u002Fp>\n\u003Cp>\n\u003Cimg src=\"\u002Fupload\u002F166307873358088.png\" loading=\"lazy\" title=\"Docker 公司创始人\" alt=\"Docker 公司创始人\">\u003Cspan class=\"image-caption\">Docker 公司创始人\u003C\u002Fspan>\n\u003C\u002Fp>\n\u003Cp>后来，dotCloud 将自己公司多年积累的容器化技术进行了标准化，取名为 Docker, 也就是大家熟悉的鲸鱼 logo。\u003C\u002Fp>\n\u003Cp>\n\u003Cimg src=\"\u002Fupload\u002F166308080840469.png\" loading=\"lazy\" title=\"Docker 的 Logo \" alt=\"Docker 的 Logo \">\u003Cspan class=\"image-caption\">Docker 的 Logo \u003C\u002Fspan>\n\u003C\u002Fp>\n\u003Cp>Docker 于 2013 年 3 月以 Apache 2.0 协议开源，并将源码放在了 GitHub 上进行维护。自从开源后，越来越多的工程师发现了它的优点，人气迅速攀升，成为当时最火爆的开源技术之一。\u003C\u002Fp>\n\u003Cp>在 2013 年底，由于 Docker 太火了，dotCloud 公司干脆决定将公司名改为 Docker Inc。\u003C\u002Fp>\n\u003Ch2>Docker 架构\u003C\u002Fh2>\n\u003Cp>为了方便理解，先放一张官网的 Docker 架构图：\u003C\u002Fp>\n\u003Cp>\n\u003Cimg src=\"\u002Fupload\u002Fillust-d361d44909d7.png\" loading=\"lazy\" title=\"Docker 架构\" alt=\"Docker 架构\">\u003Cspan class=\"image-caption\">Docker 架构\u003C\u002Fspan>\n\u003C\u002Fp>\n\u003Cp>Docker 主要由以下部分组成：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Docker Client；\u003C\u002Fli>\n\u003Cli>Docker Daemon；\u003C\u002Fli>\n\u003Cli>Docker Registry。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Docker Client\u003C\u002Fh3>\n\u003Cp>通过后面的章节学习，我们在安装好 Docker 后，可以通过在命令窗口中敲 \u003Ccode>docker\u003C\u002Fcode> 命令，来执行相关操作，如 \u003Ccode>docker run\u003C\u002Fcode> 等。这个操作就是通过 Docker Client 客户端来执行的。\u003C\u002Fp>\n\u003Cp>Docker Client 用于和 Docker Daemon 交互。\u003C\u002Fp>\n\u003Ch3>Docker Daemon\u003C\u002Fh3>\n\u003Cp>Docker Daemon 是一个 Docker 后台运行的守护进程，我们的 Docker Client 的命令就是和 Docker Daemon 来进行交互的。\u003C\u002Fp>\n\u003Cp>启动 Docker daemon 可以通过如下命令：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>service docker start\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>或：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>systemctl start docker.service\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>启动成功后，通过 \u003Ccode>ps\u003C\u002Fcode>命令即可看到 docker daemon 进程：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>$ ps aux | grep dockerd\nroot     10214  1.2  0.0 1014252 23768 ?       Ssl  00:58   0:00 \u002Fusr\u002Fbin\u002Fdockerd-current --add-runtime docker-runc=\u002Fusr\u002Flibexec\u002Fdocker\u002Fdocker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=\u002Fusr\u002Flibexec\u002Fdocker\u002Fdocker-proxy-current --init-path=\u002Fusr\u002Flibexec\u002Fdocker\u002Fdocker-init-current --seccomp-profile=\u002Fetc\u002Fdocker\u002Fseccomp.json --selinux-enabled --log-driver=journald --signature-verification=false --storage-driver overlay2\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Docker Registry\u003C\u002Fh3>\n\u003Cp>Registry 意为\u003Cstrong>注册中心\u003C\u002Fstrong>，它是\u003Cstrong>用来存储 Docker 镜像的地方\u003C\u002Fstrong>，后续我们下载镜像都会从注册中心下载。需要注意，注册中心有很多，常见的如官方的 Docker Hub，另外，各大云厂商也提供了自己的注册中心，比如阿里云、腾讯云等，甚至你也可以搭建自己的私有注册中心。\u003C\u002Fp>\n\u003Cp>Docker 默认使用 Docker Hub，比如我们执行 \u003Ccode>docker pull &lt;image-name&gt;\u003C\u002Fcode> 时，Docker 默认去 Docker Hub 中寻找名字为 \u003Ccode>image-name\u003C\u002Fcode> 的镜像。如果使用自己的 Registry 需要进行单独的配置。\u003C\u002Fp>\n\u003Ch4>Docker Images\u003C\u002Fh4>\n\u003Cp>Docker 镜像可以理解为\u003Cstrong>存于磁盘上面可以通过特定方式执行的静态文件\u003C\u002Fstrong>，可以类比传统虚拟机中的 ISO 文件。（Docker 镜像是可以被 Docker Daemon 识别并执行的特定文件）。\u003C\u002Fp>\n\u003Cp>这里只做了解，会在后面章节具体学习。\u003C\u002Fp>\n\u003Ch4>Docker Container\u003C\u002Fh4>\n\u003Cp>Container 也就是容器。Docker 官方对容器的定义如下：\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>A container is a runnable instance of an image.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>翻译过来，也非常好理解：\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>\u003Cstrong>容器是镜像的运行实例。\u003C\u002Fstrong>\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>为了方便理解，可以类比为通过 ISO 文件运行起来的一个操作环境。后面章节中会具体学习。\u003C\u002Fp>\n13:T2fad,\u003Cp>\n\u003Cdiv class=\"img-loading\">\u003Cimg src=\"\u002Fupload\u002F166262085309991.jpg\" loading=\"lazy\" title=\"Docker 是什么？\" alt=\"Docker 是什么？\">\u003C\u002Fdiv>\u003Cspan class=\"image-caption\">Docker 是什么？\u003C\u002Fspan>\n\u003C\u002Fp>\n\u003Cp>先来看下官网的介绍，原文如下：\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>翻译一下，意思如下：\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Docker 是一个\u003Cstrong>开源的平台\u003C\u002Fstrong>，我们\u003Cstrong>可以用 Docker 来开发、部署和运行我们的应用程序\u003C\u002Fstrong>。Docker 可以帮助我们\u003Cstrong>将应用程序和底层基础设施进行分离，以帮助我们更快的实现交付\u003C\u002Fstrong>。通过 Docker 技术，我们可以像管理我们的应用一样管理我们的基础设施（比如操作系统、依赖的开发包等）。通过 Docker 技术，可以精简我们的整个开发和交互流程。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>\u003Cem>说人话，要怎么理解官方的定义？\u003C\u002Fem>\u003C\u002Fp>\n\u003Cp>做过开发的小伙伴，在工作中肯定也遇到过下面的场景：\u003C\u002Fp>\n\u003Cp>测试工程师：&quot;你的代码有 Bug，测试不通过！&quot;\u003C\u002Fp>\n\u003Cp>开发工程师： &quot;放屁 ！ 我在自己机器上测试都是 OK 的 ！你会用吗？&quot;\u003C\u002Fp>\n\u003Cp>\n\u003Cdiv class=\"img-loading\">\u003Cimg src=\"\u002Fupload\u002F166987592152182.jpg\" loading=\"lazy\" title=\"你写的代码有问题！\" alt=\"你写的代码有问题！\">\u003C\u002Fdiv>\u003Cspan class=\"image-caption\">你写的代码有问题！\u003C\u002Fspan>\n\u003C\u002Fp>\n\u003Cp>我就碰到过类似情况，当时开发一个导出文件功能，本地测试功能没有任何问题，提交到测试环境后，测试小伙伴反馈报错。一番排查后，最终找到原因是 JDK 版本的原因，测试环境用的 Open JDK 版本, 而我本地测试用的 Oracle JDK 版本。Open JDK 作为 Oracle JDK 的阉割版本，少了某个字体，从而导致文件导出功能报错。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>传统的软件开发模式是: 开发人员在本地先开发好应用，然后提交到测试环境，测试人员测试没有问题，最终部署到线上，供用户使用。\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>\u003Cstrong>痛点：由于交付的单元是应用，但是应用又依赖于基础设施，比如依赖操作系统、开发包版本等等。这些因素的不确定性，导致了上面问题的发生。\u003C\u002Fstrong>\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>\u003Cem>有什么优雅的方式解决这个问题呢？\u003C\u002Fem>\u003C\u002Fp>\n\u003Cp>相信大家都安装过虚拟机，比如你想在 Windows 电脑上搭建一个 Linux 系统，需要提前下载好 Linux 系统的 ISO 镜像文件，然后通过它就可以安装一个 Linux 系统。\u003C\u002Fp>\n\u003Cp>\n\u003Cdiv class=\"img-loading\">\u003Cimg src=\"\u002Fupload\u002F167180164515485.jpg\" loading=\"lazy\" title=\"Vmware 虚拟机\" alt=\"Vmware 虚拟机\">\u003C\u002Fdiv>\u003Cspan class=\"image-caption\">Vmware 虚拟机\u003C\u002Fspan>\n\u003C\u002Fp>\n\u003Cp>这和 Docker 有什么关系呢？Docker 其实是一个\u003Cstrong>轻量级的虚拟化技术\u003C\u002Fstrong>。\u003Cstrong>Docker 可以让开发者在构建应用时，将应用与其依赖的环境一起打包到一个可移植的容器中\u003C\u002Fstrong>, 然后很方便地发布到任意操作系统中。倘若，测试人员面向的是整个打包好的容器进行测试，那么，上述提到的问题将不会发生。\u003C\u002Fp>\n\u003Ch2 id=\"toc-0\">Docker 的历史\u003C\u002Fh2>\n\u003Cp>2010 年，下图这位名叫 Solomon Hykes 的帅气小伙在美国成立了 dotCloud 公司，从此开启了容器化时代。\u003C\u002Fp>\n\u003Cp>\n\u003Cdiv class=\"img-loading\">\u003Cimg src=\"\u002Fupload\u002F166307873358088.png\" loading=\"lazy\" title=\"Docker 公司创始人\" alt=\"Docker 公司创始人\">\u003C\u002Fdiv>\u003Cspan class=\"image-caption\">Docker 公司创始人\u003C\u002Fspan>\n\u003C\u002Fp>\n\u003Cp>后来，dotCloud 将自己公司多年积累的容器化技术进行了标准化，取名为 Docker, 也就是大家熟悉的鲸鱼 logo。\u003C\u002Fp>\n\u003Cp>\n\u003Cdiv class=\"img-loading\">\u003Cimg src=\"\u002Fupload\u002F166308080840469.png\" loading=\"lazy\" title=\"Docker 的 Logo \" alt=\"Docker 的 Logo \">\u003C\u002Fdiv>\u003Cspan class=\"image-caption\">Docker 的 Logo \u003C\u002Fspan>\n\u003C\u002Fp>\n\u003Cp>Docker 于 2013 年 3 月以 Apache 2.0 协议开源，并将源码放在了 GitHub 上进行维护。自从开源后，越来越多的工程师发现了它的优点，人气迅速攀升，成为当时最火爆的开源技术之一。\u003C\u002Fp>\n\u003Cp>在 2013 年底，由于 Docker 太火了，dotCloud 公司干脆决定将公司名改为 Docker Inc。\u003C\u002Fp>\n\u003Ch2 id=\"toc-1\">Docker 架构\u003C\u002Fh2>\n\u003Cp>为了方便理解，先放一张官网的 Docker 架构图：\u003C\u002Fp>\n\u003Cp>\n\u003Cdiv class=\"img-loading\">\u003Cimg src=\"\u002Fupload\u002Fillust-d361d44909d7.png\" loading=\"lazy\" title=\"Docker 架构\" alt=\"Docker 架构\">\u003C\u002Fdiv>\u003Cspan class=\"image-caption\">Docker 架构\u003C\u002Fspan>\n\u003C\u002Fp>\n\u003Cp>Docker 主要由以下部分组成：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Docker Client；\u003C\u002Fli>\n\u003Cli>Docker Daemon；\u003C\u002Fli>\n\u003Cli>Docker Registry。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"toc-2\">Docker Client\u003C\u002Fh3>\n\u003Cp>通过后面的章节学习，我们在安装好 Docker 后，可以通过在命令窗口中敲 \u003Ccode>docker\u003C\u002Fcode> 命令，来执行相关操作，如 \u003Ccode>docker run\u003C\u002Fcode> 等。这个操作就是通过 Docker Client 客户端来执行的。\u003C\u002Fp>\n\u003Cp>Docker Client 用于和 Docker Daemon 交互。\u003C\u002Fp>\n\u003Ch3 id=\"toc-3\">Docker Daemon\u003C\u002Fh3>\n\u003Cp>Docker Daemon 是一个 Docker 后台运行的守护进程，我们的 Docker Client 的命令就是和 Docker Daemon 来进行交互的。\u003C\u002Fp>\n\u003Cp>启动 Docker daemon 可以通过如下命令：\u003C\u002Fp>\n\u003Cdiv class=\"language-sql\" data-ext=\"sql\" data-code=\"service%20docker%20start%0A\">\n        \u003Cbutton class=\"vp-copy-code-button\" data-copy data-copied=\"已复制\" aria-label=\"复制代码\">\u003C\u002Fbutton>\n        \u003Cpre>\u003Ccode class=\"language-sql\">service docker \u003Cspan class=\"token keyword\">start\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n      \u003C\u002Fdiv>\n\u003Cp>或：\u003C\u002Fp>\n\u003Cdiv class=\"language-sql\" data-ext=\"sql\" data-code=\"systemctl%20start%20docker.service%0A\">\n        \u003Cbutton class=\"vp-copy-code-button\" data-copy data-copied=\"已复制\" aria-label=\"复制代码\">\u003C\u002Fbutton>\n        \u003Cpre>\u003Ccode class=\"language-sql\">systemctl \u003Cspan class=\"token keyword\">start\u003C\u002Fspan> docker\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>service\n\u003C\u002Fcode>\u003C\u002Fpre>\n      \u003C\u002Fdiv>\n\u003Cp>启动成功后，通过 \u003Ccode>ps\u003C\u002Fcode>命令即可看到 docker daemon 进程：\u003C\u002Fp>\n\u003Cdiv class=\"language-javascript\" data-ext=\"javascript\" data-code=\"%24%20ps%20aux%20%7C%20grep%20dockerd%0Aroot%20%20%20%20%2010214%20%201.2%20%200.0%201014252%2023768%20%3F%20%20%20%20%20%20%20Ssl%20%2000%3A58%20%20%200%3A00%20%2Fusr%2Fbin%2Fdockerd-current%20--add-runtime%20docker-runc%3D%2Fusr%2Flibexec%2Fdocker%2Fdocker-runc-current%20--default-runtime%3Ddocker-runc%20--exec-opt%20native.cgroupdriver%3Dsystemd%20--userland-proxy-path%3D%2Fusr%2Flibexec%2Fdocker%2Fdocker-proxy-current%20--init-path%3D%2Fusr%2Flibexec%2Fdocker%2Fdocker-init-current%20--seccomp-profile%3D%2Fetc%2Fdocker%2Fseccomp.json%20--selinux-enabled%20--log-driver%3Djournald%20--signature-verification%3Dfalse%20--storage-driver%20overlay2%0A\">\n        \u003Cbutton class=\"vp-copy-code-button\" data-copy data-copied=\"已复制\" aria-label=\"复制代码\">\u003C\u002Fbutton>\n        \u003Cpre>\u003Ccode class=\"language-javascript\">$ ps aux \u003Cspan class=\"token operator\">|\u003C\u002Fspan> grep dockerd\nroot     \u003Cspan class=\"token number\">10214\u003C\u002Fspan>  \u003Cspan class=\"token number\">1.2\u003C\u002Fspan>  \u003Cspan class=\"token number\">0.0\u003C\u002Fspan> \u003Cspan class=\"token number\">1014252\u003C\u002Fspan> \u003Cspan class=\"token number\">23768\u003C\u002Fspan> \u003Cspan class=\"token operator\">?\u003C\u002Fspan>       Ssl  \u003Cspan class=\"token number\">00\u003C\u002Fspan>\u003Cspan class=\"token operator\">:\u003C\u002Fspan>\u003Cspan class=\"token number\">58\u003C\u002Fspan>   \u003Cspan class=\"token number\">0\u003C\u002Fspan>\u003Cspan class=\"token operator\">:\u003C\u002Fspan>\u003Cspan class=\"token number\">00\u003C\u002Fspan> \u003Cspan class=\"token operator\">\u002F\u003C\u002Fspan>usr\u003Cspan class=\"token operator\">\u002F\u003C\u002Fspan>bin\u003Cspan class=\"token operator\">\u002F\u003C\u002Fspan>dockerd\u003Cspan class=\"token operator\">-\u003C\u002Fspan>current \u003Cspan class=\"token operator\">--\u003C\u002Fspan>add\u003Cspan class=\"token operator\">-\u003C\u002Fspan>runtime docker\u003Cspan class=\"token operator\">-\u003C\u002Fspan>runc\u003Cspan class=\"token operator\">=\u003C\u002Fspan>\u003Cspan class=\"token operator\">\u002F\u003C\u002Fspan>usr\u003Cspan class=\"token operator\">\u002F\u003C\u002Fspan>libexec\u003Cspan class=\"token operator\">\u002F\u003C\u002Fspan>docker\u003Cspan class=\"token operator\">\u002F\u003C\u002Fspan>docker\u003Cspan class=\"token operator\">-\u003C\u002Fspan>runc\u003Cspan class=\"token operator\">-\u003C\u002Fspan>current \u003Cspan class=\"token operator\">--\u003C\u002Fspan>\u003Cspan class=\"token keyword\">default\u003C\u002Fspan>\u003Cspan class=\"token operator\">-\u003C\u002Fspan>runtime\u003Cspan class=\"token operator\">=\u003C\u002Fspan>docker\u003Cspan class=\"token operator\">-\u003C\u002Fspan>runc \u003Cspan class=\"token operator\">--\u003C\u002Fspan>exec\u003Cspan class=\"token operator\">-\u003C\u002Fspan>opt native\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>cgroupdriver\u003Cspan class=\"token operator\">=\u003C\u002Fspan>systemd \u003Cspan class=\"token operator\">--\u003C\u002Fspan>userland\u003Cspan class=\"token operator\">-\u003C\u002Fspan>proxy\u003Cspan class=\"token operator\">-\u003C\u002Fspan>path\u003Cspan class=\"token operator\">=\u003C\u002Fspan>\u003Cspan class=\"token operator\">\u002F\u003C\u002Fspan>usr\u003Cspan class=\"token operator\">\u002F\u003C\u002Fspan>libexec\u003Cspan class=\"token operator\">\u002F\u003C\u002Fspan>docker\u003Cspan class=\"token operator\">\u002F\u003C\u002Fspan>docker\u003Cspan class=\"token operator\">-\u003C\u002Fspan>proxy\u003Cspan class=\"token operator\">-\u003C\u002Fspan>current \u003Cspan class=\"token operator\">--\u003C\u002Fspan>init\u003Cspan class=\"token operator\">-\u003C\u002Fspan>path\u003Cspan class=\"token operator\">=\u003C\u002Fspan>\u003Cspan class=\"token operator\">\u002F\u003C\u002Fspan>usr\u003Cspan class=\"token operator\">\u002F\u003C\u002Fspan>libexec\u003Cspan class=\"token operator\">\u002F\u003C\u002Fspan>docker\u003Cspan class=\"token operator\">\u002F\u003C\u002Fspan>docker\u003Cspan class=\"token operator\">-\u003C\u002Fspan>init\u003Cspan class=\"token operator\">-\u003C\u002Fspan>current \u003Cspan class=\"token operator\">--\u003C\u002Fspan>seccomp\u003Cspan class=\"token operator\">-\u003C\u002Fspan>profile\u003Cspan class=\"token operator\">=\u003C\u002Fspan>\u003Cspan class=\"token operator\">\u002F\u003C\u002Fspan>etc\u003Cspan class=\"token operator\">\u002F\u003C\u002Fspan>docker\u003Cspan class=\"token operator\">\u002F\u003C\u002Fspan>seccomp\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>json \u003Cspan class=\"token operator\">--\u003C\u002Fspan>selinux\u003Cspan class=\"token operator\">-\u003C\u002Fspan>enabled \u003Cspan class=\"token operator\">--\u003C\u002Fspan>log\u003Cspan class=\"token operator\">-\u003C\u002Fspan>driver\u003Cspan class=\"token operator\">=\u003C\u002Fspan>journald \u003Cspan class=\"token operator\">--\u003C\u002Fspan>signature\u003Cspan class=\"token operator\">-\u003C\u002Fspan>verification\u003Cspan class=\"token operator\">=\u003C\u002Fspan>\u003Cspan class=\"token boolean\">false\u003C\u002Fspan> \u003Cspan class=\"token operator\">--\u003C\u002Fspan>storage\u003Cspan class=\"token operator\">-\u003C\u002Fspan>driver overlay2\n\u003C\u002Fcode>\u003C\u002Fpre>\n      \u003C\u002Fdiv>\n\u003Ch3 id=\"toc-4\">Docker Registry\u003C\u002Fh3>\n\u003Cp>Registry 意为\u003Cstrong>注册中心\u003C\u002Fstrong>，它是\u003Cstrong>用来存储 Docker 镜像的地方\u003C\u002Fstrong>，后续我们下载镜像都会从注册中心下载。需要注意，注册中心有很多，常见的如官方的 Docker Hub，另外，各大云厂商也提供了自己的注册中心，比如阿里云、腾讯云等，甚至你也可以搭建自己的私有注册中心。\u003C\u002Fp>\n\u003Cp>Docker 默认使用 Docker Hub，比如我们执行 \u003Ccode>docker pull &lt;image-name&gt;\u003C\u002Fcode> 时，Docker 默认去 Docker Hub 中寻找名字为 \u003Ccode>image-name\u003C\u002Fcode> 的镜像。如果使用自己的 Registry 需要进行单独的配置。\u003C\u002Fp>\n\u003Ch4 id=\"toc-5\">Docker Images\u003C\u002Fh4>\n\u003Cp>Docker 镜像可以理解为\u003Cstrong>存于磁盘上面可以通过特定方式执行的静态文件\u003C\u002Fstrong>，可以类比传统虚拟机中的 ISO 文件。（Docker 镜像是可以被 Docker Daemon 识别并执行的特定文件）。\u003C\u002Fp>\n\u003Cp>这里只做了解，会在后面章节具体学习。\u003C\u002Fp>\n\u003Ch4 id=\"toc-6\">Docker Container\u003C\u002Fh4>\n\u003Cp>Container 也就是容器。Docker 官方对容器的定义如下：\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>A container is a runnable instance of an image.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>翻译过来，也非常好理解：\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>\u003Cstrong>容器是镜像的运行实例。\u003C\u002Fstrong>\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>为了方便理解，可以类比为通过 ISO 文件运行起来的一个操作环境。后面章节中会具体学习。\u003C\u002Fp>"]