<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Docker on Worthify 博客</title><link>https://worthify-blog.pages.dev/tags/docker/</link><description>Recent content in Docker on Worthify 博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Fri, 16 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://worthify-blog.pages.dev/tags/docker/index.xml" rel="self" type="application/rss+xml"/><item><title>docker 基础介绍</title><link>https://worthify-blog.pages.dev/posts/docker-%E5%9F%BA%E7%A1%80%E4%BB%8B%E7%BB%8D/</link><pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate><guid>https://worthify-blog.pages.dev/posts/docker-%E5%9F%BA%E7%A1%80%E4%BB%8B%E7%BB%8D/</guid><description>&lt;h2 id="docker-是什么"&gt;docker 是什么？&lt;/h2&gt;&#10;&lt;p&gt;docker 采用 google 公司开发的 go 语言编写而成，对进程进行封装隔离，基于操作系统层面的虚拟化技术。由于隔离的进出独立于宿主机和其他隔离的进程，因此也被称之为容器。&lt;/p&gt;&#10;&lt;h3 id="容器container"&gt;容器（Container）&lt;/h3&gt;&#10;&lt;p&gt;那么什么是容器？j简单说，容器就是应用程序每个组件的独立进程，每个组件（数据库，python程序等）都在独立的容器中运行，它与计算机中的其他组件完全隔离。&lt;/p&gt;&#10;&lt;p&gt;容器的特定主要有：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;自包括，每个容器都具有其运行所需的一切，并且不依赖与主机上任何预安装的依赖项。&lt;/li&gt;&#10;&lt;li&gt;隔离。每个容器都是独立的，因此单个容器中发送的任何事情都不会影响到主机或者其他运行的容器，这大大提高了应用程序的安全性。&lt;/li&gt;&#10;&lt;li&gt;独立。每个容器都是独立管理的，删除一个容器也不会影响到其他容器。&lt;/li&gt;&#10;&lt;li&gt;可移植性。容器可以在任何地方运行。在任何地方都相同的方式运行。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="容器的与虚拟机的区别"&gt;容器的与虚拟机的区别&lt;/h4&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;虚拟机：&lt;/strong&gt; 虚拟机是一个完整的操作系统，拥有自己的内核，硬件驱动程序和软件程序。运行一个虚拟机会让主机花费大量性能。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;容器：&lt;/strong&gt; 容器只隔离一个独立进程，其中包括运行所需的所有文件。当有多个容器运行时，它们会共享同一个系统内核，这样就可以在花费少量的性能来运行多个应用程序。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;现在为了最大化的利用硬件性能，&lt;strong&gt;虚拟机和容器通常是结合在&lt;/strong&gt;一起使用的。例如我们购买的云服务器，上面运行的操作系统其实就是云服务提供商通过虚拟机在一台服务器上虚拟出来的。这样一台服务器可以运行多个操作系统，减少资源浪费降低成本。同时，我们有时候也会在云服务器上运行一些容器化的应用程序。减少开发成本和服务器压力。从而可以让服务器运行更多程序或者留出性能以更好的运行程序。&lt;/p&gt;&#10;&lt;h3 id="镜像image"&gt;镜像（Image）&lt;/h3&gt;&#10;&lt;p&gt;容器是一个独立运行的进程，那么它运行时需要的资源从何而来？那就就是镜像的作用。&lt;/p&gt;&#10;&lt;p&gt;举一个简单的例子，我们计算机中都运行着软件，这些软件能够运行的前提是因为有可以承载这个软件的操作系统。而镜像可以简单的理解为软件运行时所需要的基础文件。&lt;/p&gt;&#10;&lt;p&gt;例如一个 pyhton web 应用，它的镜像就是 python 运行环境（用于运行 Python 程序），Python 代码（软件的运行代码），依赖库（Python pip包，第三方库等），数据库等（检索，存储数据）。&lt;/p&gt;&#10;&lt;p&gt;镜像有两个重要的原则：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;==&lt;strong&gt;镜像一旦被创建就不可变，无法更改，只能在其上添加新的功能。&lt;/strong&gt;==&lt;/li&gt;&#10;&lt;li&gt;==&lt;strong&gt;容器的镜像由层组成，每一层都基于前一层构建，后层修改不会影响前一层的内容。&lt;/strong&gt;==&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="分层存储"&gt;分层存储&lt;/h4&gt;&#10;&lt;p&gt;如上面所说，镜像由层组成，镜像构建时，会一层层构建，前一层时后一层基础。每一层构建完后不会更改。后一层上的任何变化都只会作用于自己在的一层。例如删除前一层文件的操作，实际上不是正真的删除前一层的文件，只是对文件做了删除的标记。最终容器运行时，虽然看不到这个文件，但是这个文件会一直跟随着镜像。因此在构建镜像时，每一层尽量只包括该层需要添加的东西，任何额外的东西需要在该层构建结束前清除。&lt;/p&gt;&#10;&lt;p&gt;分层存储的特征：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;镜像复用：&lt;/strong&gt; 例如两个个容器都使用的是 Python 3.12 这个版本的 python.，那么这两个容器可以共同使用同一个版本的 Pythion，不需要重复存储同样的内容。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;定制化：&lt;/strong&gt; 当某个容器镜像的某些功能不嫩满足需求时，可以在此基础上构建一个新层来添加功能。最后构建为一个新的镜像来使用。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="仓库repository"&gt;仓库（Repository）&lt;/h3&gt;&#10;&lt;p&gt;镜像构建完毕后，可以很轻松的在本地运行，但是，如果其他服务器要使用这个镜像，就需要从一个集中管理镜像的地方上分发镜像。这个集中管理镜像的地方就是仓库。Docker Registry 就提供这种服务。&lt;/p&gt;&#10;&lt;p&gt;==&lt;strong&gt;一个 Docker Registry 中包含多个仓库（Repository） ，每个仓库可以包含多个标签（Tag），每个标签就对应一个镜像。&lt;/strong&gt;==&lt;/p&gt;&#10;&lt;p&gt;仓库中会包含一个软件的多个扳本，而标签就用于对应该软件的各个扳本。我们可以通过&amp;lt;仓库名&amp;gt;:&amp;lt;标签&amp;gt; 的格式来指定该软件的具体扳本。如果不指定标签，那么默认以 &lt;code&gt;latest&lt;/code&gt; 作为默认标签。&lt;/p&gt;&#10;&lt;p&gt;例如，Ubuntu 镜像，我现在需要 &lt;code&gt;16.04&lt;/code&gt;，这个版本的，那么我在下载镜像时要这样写：&lt;code&gt;Ubunutu:16.04&lt;/code&gt;。&lt;/p&gt;&#10;&lt;p&gt;仓库名经常以 &lt;em&gt;两段式路径&lt;/em&gt; 形式出现，比如 &lt;code&gt;jwilder/nginx-proxy&lt;/code&gt;，前者往往意味着 Docker Registry 多用户环境下的用户名，后者则往往是对应的软件名。但这并非绝对，取决于所使用的具体 Docker Registry 的软件或服务。&lt;/p&gt;</description></item></channel></rss>