[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-detail-ssr-43790296491753483":3},{"id":4,"title":5,"tag":6,"createTime":7,"updateTime":8,"renderedHtml":9,"description":10,"ogImageUrl":11},"43790296491753483","初识docker","Docker","2023-10-30","2024-06-13","\u003Ch2 id=\"h2-0-docker-\">docker 解决的问题\u003C\u002Fh2>\n\u003Ch3 id=\"h3-1-1-\">1. 开发、测试和运维人员之间的矛盾\u003C\u002Fh3>\n\u003Cp>\u003Ccode>“程序在我这跑得好好的，在你那怎么就不行呢”\u003C\u002Fcode>这是一个典型的应用场景，Docker image 中包含了程序需要的所有的运行时依赖，比如 java 的程序，肯定要在 image 中包含 jdk；比如 Python 的程序，肯定要在 image 中包含对应版本的 Python 解释器。程序在我这跑得好好的，去你那就不行了，显然是环境问题。Docker 把整个运行时环境打包放到 image 中，所以搞定了环境依赖问题。\u003C\u002Fp>\n\u003Cp>我们知道，一个程序要跑起来，需要这么几部分：代码 + 运行环境 + 配置 + 依赖的服务。代码当然就是同一份代码，环境如果都一样，通常不会有问题。Docker image 中包含了运行环境+配置，这对部署相当友好。如果你没有做过这种系统，那你肯定装过软件，装一些复杂的软件的时候有没有因为版本依赖或者编译参数等让你抓狂？用了 Docker 再也没有这种问题了：\u003C\u002Fp>\n\u003Cdiv class=\"ssr-code-block\" data-lang=\"bash\">\u003Cdiv class=\"ssr-code-head\">\u003Cspan class=\"ssr-code-lang\">bash\u003C\u002Fspan>\u003Cdiv class=\"ssr-code-actions\">\u003Cbutton class=\"ssr-code-fullscreen ssr-code-iconbtn\" type=\"button\" aria-label=\"全屏查看代码\" title=\"全屏\">\u003Csvg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M5 5h6v2H7v4H5V5zm14 0v6h-2V7h-4V5h6zM5 19v-6h2v4h4v2H5zm14 0h-6v-2h4v-4h2v6z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cbutton class=\"ssr-code-copy ssr-code-iconbtn\" type=\"button\" aria-label=\"复制代码\" title=\"复制\">\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--default\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--success\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--error\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"ssr-code-body\">\u003Cdiv class=\"ssr-code-pane\">\u003Cdiv class=\"ssr-code-gutter\" aria-hidden=\"true\">\u003Cspan class=\"ssr-code-num\">1\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">2\u003C\u002Fspan>\u003C\u002Fdiv>\u003Cpre class=\"ssr-code-pre\">\u003Ccode class=\"hljs language-bash\">\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">docker\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">pull\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">xxx\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">docker\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">run\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">xxx\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">;\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003Cp>所以总结起来就是：\u003Ccode>Docker解决了运行环境和配置问题，方便部署，也就方便做持续集成。\u003C\u002Fcode>\u003C\u002Fp>\n\u003Ch3 id=\"h3-2-2-\">2. 更轻量的虚拟化\u003C\u002Fh3>\n\u003Cp>\u003Ccode>“系统好卡，肯定是又有哪个哥们的程序在作孽了”\u003C\u002Fcode>。现在的服务器都牛的很，动不动 128G 内存，24 个 CPU，Linux 本身就是个多租户的操作系统，可以多人共用，但是如果某个程序狂吃内存和 CPU，占用了太多系统资源，这就会影响其他程序的运行。一个公司的几个同事共用一台机器出现这种问题可以通过内部协调沟通解决。但是云主机提供商呢？不同的用户之间不认识，共用一台强大的计算机，结果某个程序耗尽了资源，其他用户肯定不乐意了。\u003C\u002Fp>\n\u003Cp>所以虚拟机出现了，做了资源隔离，不同用户之间彼此老死不相往来，不会相互影响，世界一下子清静了。但是，\u003Ccode>虚拟机有缺点：创建速度慢，迁移起来麻烦，因为中间多了虚拟硬件和虚拟操作系统的创建，有了性能损耗。\u003C\u002Fcode>一台高性能服务器创建十几个虚拟机，太浪费了……\u003C\u002Fp>\n\u003Cp>相对虚拟机的重量级虚拟化方案，Linux 内核级的一些隔离方案让人们看到了希望，cgroups、namespace、tc、quota、chroot、lxc，终于，Docker 出现了，Docker 利用这些成熟的技术。（详见：\u003Ca href=\"https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F55099839\">深挖 Docker 之 Linux namespace 和 cgroups\u003C\u002Fa>），让虚拟化变得轻量了起来，创建一个 container 瞬间完成，速度可以达到秒级甚至是毫秒级！性能损耗非常小，虽说隔离性没有虚拟机那么彻底，安全性上稍差一些，但也基本可以用，不用太担心。\u003C\u002Fp>\n\u003Ch2 id=\"h2-3-\">虚拟机与容器的区别\u003C\u002Fh2>\n\u003Cp>Docker 容器的本质就是通过容器虚拟技术虚拟出的一台主机，就像虚拟机一样。可以将应用及其运行环境部署在这台虚拟出的主机上运行。但容器与虚拟机又有着本质的不同。\u003C\u002Fp>\n\u003Ch3 id=\"h3-4-1-\">1. 虚拟机\u003C\u002Fh3>\n\u003Cp>传统的虚拟技术是在物理机的操作系统之上安装一个虚拟机管理程序，例如 VMware、VirtualBox 等。在其管理下可以创建很多个虚拟机。每个虚拟机需要安装自己独立的操作系统，而应用就是安装在虚拟机操作系统之上的程序，应用程序通过调用各种命令或库函数来使用其需要的各种系统资源。\u003C\u002Fp>\n\u003Cp>对于完全相同的两个应用，其若需要运行在两个虚拟机中，则就需要两套完全相同的虚拟机操作系统与 Binaries\u002FLibraries，存在大量的资源占用冗余。形成资源浪费。\u003C\u002Fp>\n\u003Cimg class=\"article-img article-img-zoomable\" src=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202309091003963.png\" alt=\"image-20230904181729755\" style=\"zoom:60%;\" \u002F loading=\"lazy\" decoding=\"async\" srcset=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202309091003963.png?imageMogr2\u002Fthumbnail\u002F400x\u002Fformat\u002Fwebp\u002Fquality\u002F85 400w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202309091003963.png?imageMogr2\u002Fthumbnail\u002F800x\u002Fformat\u002Fwebp\u002Fquality\u002F85 800w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202309091003963.png?imageMogr2\u002Fthumbnail\u002F1200x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1200w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202309091003963.png?imageMogr2\u002Fthumbnail\u002F1920x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1920w\" sizes=\"(max-width: 576px) 100vw, (max-width: 992px) 90vw, 720px\">\n\u003Cp>Hypervisor 是一种运行在物理服务器和操作系统之间的中间软件层，可允许多个操作系统和应用共享一套基础物理硬件，因此也可以看作是虚拟环境中的“元”操作系统，他可以协调访问服务器上的所有的物理设备和虚拟机，也叫虚拟机监视器。Hypervisor 是所有虚拟化技术的核心。当服务器启动并执行 Hypervisor 时，他会给每一台虚拟机分配适量的内存、CPU、网络和磁盘，并加载所有虚拟机的客户操作系统。常见的产品有 Vmware、KVM、Xen 等。\u003C\u002Fp>\n\u003Ch3 id=\"h3-5-2-\">2. 容器\u003C\u002Fh3>\n\u003Cp>Docker 容器运行在 Docker 引擎之上，所有 Docker 容器共享同一个 Docker 引擎，但它们的运行又是相互隔离、互不干扰的。由于 Docker 容器不需要进行虚拟硬件及操作系统，而是共享的宿主机的硬件与操作系统，所以 Docker 容器对系统资源的占用很少，其仅包含运行时必须的一些资源。所有 Docker 容器对于系统资源的使用都是由 Docker 引擎统一进行管理，所以对系统资源的利用率很高。无论是应用执行速度、内存损耗或者文件存储速度，都要比传统虚拟机技术更高效。\u003C\u002Fp>\n\u003Cimg class=\"article-img article-img-zoomable\" src=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202309041941814.png\" alt=\"image-20230904193756991\" style=\"zoom:60%;\" \u002F loading=\"lazy\" decoding=\"async\" srcset=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202309041941814.png?imageMogr2\u002Fthumbnail\u002F400x\u002Fformat\u002Fwebp\u002Fquality\u002F85 400w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202309041941814.png?imageMogr2\u002Fthumbnail\u002F800x\u002Fformat\u002Fwebp\u002Fquality\u002F85 800w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202309041941814.png?imageMogr2\u002Fthumbnail\u002F1200x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1200w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202309041941814.png?imageMogr2\u002Fthumbnail\u002F1920x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1920w\" sizes=\"(max-width: 576px) 100vw, (max-width: 992px) 90vw, 720px\">\n\u003Ch2 id=\"h2-6-docker-\">Docker 系统架构\u003C\u002Fh2>\n\u003Cp>Docker 中具有几个非常重要的概念，下面通过理解这些概念来了解 Docker 的系统架构。\u003C\u002Fp>\n\u003Cimg class=\"article-img article-img-zoomable\" src=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202309042030121.png\" alt=\"image-20230904203045070\" style=\"zoom:50%;\" \u002F loading=\"lazy\" decoding=\"async\" srcset=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202309042030121.png?imageMogr2\u002Fthumbnail\u002F400x\u002Fformat\u002Fwebp\u002Fquality\u002F85 400w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202309042030121.png?imageMogr2\u002Fthumbnail\u002F800x\u002Fformat\u002Fwebp\u002Fquality\u002F85 800w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202309042030121.png?imageMogr2\u002Fthumbnail\u002F1200x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1200w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202309042030121.png?imageMogr2\u002Fthumbnail\u002F1920x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1920w\" sizes=\"(max-width: 576px) 100vw, (max-width: 992px) 90vw, 720px\">\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Cstrong>Docker client :\u003C\u002Fstrong> Docker 命令行工具，是用户使用 Docker 的主要方式，Docker client 与 Docker daemon 通信并将结果返回给用户，Docker client 也可以通过 socket 或者 RESTful api 访问远程的 Docker daemon。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Docker Daemon：\u003C\u002Fstrong> Docker 守护进程，其监听着 Docker API 请求并管理 Docker 对象，例如镜像、容器、网络和卷。守护进程还可以与其他守护进程通信以管理 Docker 服务。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Docker image：\u003C\u002Fstrong> 镜像是只读的，镜像中包含有需要运行的文件。镜像用来创建 container，一个镜像可以运行多个 container；镜像可以通过 Dockerfile 创建，也可以从 Docker Hub\u002FRegistry 上下载。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Docker container：\u003C\u002Fstrong> 容器是 Docker 的运行组件，启动一个镜像就是一个容器，容器是一个隔离环境，多个容器之间不会相互影响，保证容器中的程序运行在一个相对安全的环境中。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Docker Registry：\u003C\u002Fstrong> Docker 的镜像中心中存放着很多由官方、其他机构或个人创建的 Docker 仓库，Docker 用户可以直接从这些仓库中 pull 需要的镜像，也可以将自己制作的镜像 push 到 Docker 镜像中心相应的仓库中。最常用的镜像中心是 Docker 官方的 Docker Hub（\u003Ca href=\"https:\u002F\u002Fhub.docker.com\">https:\u002F\u002Fhub.docker.com\u003C\u002Fa>）。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n","docker 解决的问题 1. 开发、测试和运维人员之间的矛盾 这是一个典型的应用场景，Docker image 中包含了程序需要的所有的运行时依赖，比如 java 的程序，肯定要在 image 中包含 jdk；比如 Python 的程序，肯定要在 image 中包含对应版本的 Python 解释器。程序在我这跑得好好","https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202309091003963.png"]