<?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 我的博客</title><link>https://hugo-blog-eight-gamma.vercel.app/tags/docker/</link><description>Recent content in Docker on 我的博客</description><generator>Hugo -- gohugo.io</generator><language>zh</language><lastBuildDate>Wed, 16 Sep 2026 10:00:00 +0800</lastBuildDate><atom:link href="https://hugo-blog-eight-gamma.vercel.app/tags/docker/index.xml" rel="self" type="application/rss+xml"/><item><title>Docker 基础教程（2026 修订版）</title><link>https://hugo-blog-eight-gamma.vercel.app/0005.html</link><pubDate>Wed, 16 Sep 2026 10:00:00 +0800</pubDate><guid>https://hugo-blog-eight-gamma.vercel.app/0005.html</guid><description>&#10; &lt;blockquote&gt;&#10; &lt;p&gt;本文是 2020 年《Docker 基础教程》的全面修订版。这些年 Docker 生态变化很大：Compose 已成为内置插件、BuildKit 成为默认构建器、国内镜像加速格局几经洗牌。原文章的内容已按 2026 年的现状重写。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="1-docker-简介"&gt;1. Docker 简介&#10;&lt;/h2&gt;&lt;p&gt;Docker 是基于 Go 语言的开源项目，通过对应用的封装、分发、部署、运行等生命周期的管理，实现**&amp;ldquo;一次封装，到处运行&amp;rdquo;**。&lt;/p&gt;&#10;&lt;p&gt;它解决的是运行环境和配置问题，是方便持续集成的容器虚拟化技术。&lt;/p&gt;&#10;&lt;p&gt;补充一点 2020 年文章里没有的背景：如今容器格式和运行时已经由 &lt;strong&gt;OCI（Open Container Initiative）&lt;/strong&gt; 标准化，Docker 镜像本质上是 OCI 镜像，可以被 containerd、Podman、Kubernetes 等任何符合标准的运行时直接使用——这也意味着你学到的镜像知识不会绑定在某一家工具上。&lt;/p&gt;&#10;&lt;h3 id="11-与传统虚拟技术的差别"&gt;1.1 与传统虚拟技术的差别&#10;&lt;/h3&gt;&lt;p&gt;传统虚拟机是虚拟出硬件后，在其上运行一个完整的操作系统，再在该系统上运行应用。&lt;/p&gt;&#10;&lt;p&gt;容器内的应用&lt;strong&gt;直接运行于宿主内核&lt;/strong&gt;，容器没有自己的内核，也没有硬件虚拟，因此比传统虚拟机更轻便：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;维度&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;虚拟机&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;容器&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;隔离级别&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;硬件级（hypervisor）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;进程级（namespace + cgroups）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;启动速度&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;分钟级&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;秒级甚至毫秒级&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;体积&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;GB 级&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;MB 级&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;性能损耗&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;有&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;接近原生&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;每个容器之间互相隔离，各有自己的文件系统，容器之间进程不会相互影响。&lt;/p&gt;&#10;&lt;h3 id="12-docker-优势"&gt;1.2 Docker 优势&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;轻量，秒级启动&lt;/li&gt;&#10;&lt;li&gt;标准的打包、部署、运行方案（OCI 标准）&lt;/li&gt;&#10;&lt;li&gt;镜像分层存储，支持增量分发&lt;/li&gt;&#10;&lt;li&gt;易于构建，适合自动化测试和持续集成&lt;/li&gt;&#10;&lt;li&gt;性能高，内存和 IO 开销低&lt;/li&gt;&#10;&lt;li&gt;生态成熟：Docker Hub 海量镜像、Compose 一键编排&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="13-docker-基本组成"&gt;1.3 Docker 基本组成&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;镜像（image）&lt;/strong&gt;：只读模板，用来创建容器。一个镜像可以创建很多容器，类似类和对象的关系。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;容器（container）&lt;/strong&gt;：镜像的运行实例。可以启动、停止、删除，每个容器相互隔离。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;仓库（repository）&lt;/strong&gt;：集中存放镜像的场所。最大的公开仓库是 Docker Hub；国内各大云厂商（阿里云、腾讯云等）也都提供镜像仓库服务。&lt;/p&gt;&#10;&lt;h2 id="2-docker-安装"&gt;2. Docker 安装&#10;&lt;/h2&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;时代变了：CentOS 7 已于 2024 年停止维护（EOL），其自带 yum 源不可用。现在生产环境推荐 &lt;strong&gt;Ubuntu 22.04/24.04 LTS、Debian 12 或 Rocky/Alma Linux&lt;/strong&gt;。以下以 Ubuntu 为例。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="21-ubuntu-安装步骤官方推荐方式"&gt;2.1 Ubuntu 安装步骤（官方推荐方式）&#10;&lt;/h3&gt;&lt;p&gt;安装依赖并添加 Docker 官方 apt 仓库：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install -y ca-certificates curl&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo install -m &lt;span style="color:#ae81ff"&gt;0755&lt;/span&gt; -d /etc/apt/keyrings&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo chmod a+r /etc/apt/keyrings/docker.asc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; signed-by=/etc/apt/keyrings/docker.asc] \&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; https://download.docker.com/linux/ubuntu &lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;. /etc/os-release &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; echo $VERSION_CODENAME&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; stable&amp;#34;&lt;/span&gt; | &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装 Docker Engine 与 Compose 插件：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install -y docker-ce docker-ce-cli containerd.io &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; docker-buildx-plugin docker-compose-plugin&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;注意最后两个包：&lt;code&gt;docker-buildx-plugin&lt;/code&gt; 和 &lt;code&gt;docker-compose-plugin&lt;/code&gt;——2026 年 &lt;strong&gt;&lt;code&gt;docker compose&lt;/code&gt;（带空格）已是内置子命令&lt;/strong&gt;，不再需要单独安装 &lt;code&gt;docker-compose&lt;/code&gt; 这个 Python 老工具。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;启动并设置开机自启：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable --now docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;验证安装：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run hello-world&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;免 sudo 运行 docker&lt;/strong&gt;（把当前用户加入 docker 组，重新登录生效）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo usermod -aG docker $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="22-windows--macos"&gt;2.2 Windows / macOS&#10;&lt;/h3&gt;&lt;p&gt;桌面端使用 &lt;strong&gt;Docker Desktop&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Windows 需启用 &lt;strong&gt;WSL 2&lt;/strong&gt; 后端（&lt;code&gt;wsl --install&lt;/code&gt;），体验远好于旧版的 Hyper-V 模式&lt;/li&gt;&#10;&lt;li&gt;macOS 原生支持 Apple Silicon（arm64），拉取 amd64 镜像时加 &lt;code&gt;--platform linux/amd64&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="23-国内镜像加速2026-年现状"&gt;2.3 国内镜像加速（2026 年现状）&#10;&lt;/h3&gt;&lt;p&gt;这块变化最大。2024 年起大批公益镜像站关停，目前可用的方案：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;阿里云个人加速器&lt;/strong&gt;（推荐）：登录 &lt;a class="link" href="https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors" target="_blank" rel="noopener"&#10; &gt;阿里云容器镜像服务&lt;/a&gt;，在&amp;quot;镜像加速器&amp;quot;页面获取你的专属地址&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;云厂商内网加速&lt;/strong&gt;：阿里云 ECS、腾讯云 CVM 内网自带加速域名，无需配置&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;其他存活镜像站&lt;/strong&gt;：可用性随时变化，建议配置多个做兜底&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;配置方式——编辑 &lt;code&gt;/etc/docker/daemon.json&lt;/code&gt;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;registry-mirrors&amp;#34;&lt;/span&gt;: [&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;https://xxxxxx.mirror.aliyuncs.com&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;https://docker.m.daocloud.io&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;重载并重启：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl daemon-reload&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;验证加速器是否生效：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker info | grep -A &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Registry Mirrors&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;💡 如果加速器全部失效，终极方案是自建：一台海外 VPS 上用 &lt;code&gt;registry:2&lt;/code&gt; 镜像搭一个代理缓存，或直接把常用镜像托管到阿里云个人仓库。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="3-docker-常用命令"&gt;3. Docker 常用命令&#10;&lt;/h2&gt;&lt;h3 id="31-帮助与信息"&gt;3.1 帮助与信息&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker version &lt;span style="color:#75715e"&gt;# 版本&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker info &lt;span style="color:#75715e"&gt;# 系统信息（含镜像加速器、存储驱动等）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker &amp;lt;命令&amp;gt; --help &lt;span style="color:#75715e"&gt;# 任意子命令的帮助&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="32-镜像命令"&gt;3.2 镜像命令&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker images &lt;span style="color:#75715e"&gt;# 列出本地镜像&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker search tomcat &lt;span style="color:#75715e"&gt;# 搜索镜像&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker pull tomcat:10-jdk21 &lt;span style="color:#75715e"&gt;# 下载镜像（建议显式指定 tag，别用 latest）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker rmi tomcat:10-jdk21 &lt;span style="color:#75715e"&gt;# 删除镜像&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker image prune -a &lt;span style="color:#75715e"&gt;# 清理所有无用镜像（原 dangling 镜像清理的升级版）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;2026 年的最佳实践：生产环境&lt;strong&gt;固定镜像 tag 和 digest&lt;/strong&gt;（如 &lt;code&gt;tomcat@sha256:...&lt;/code&gt;），避免 &lt;code&gt;latest&lt;/code&gt; 在重建时悄悄升级导致事故。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="33-容器命令"&gt;3.3 容器命令&#10;&lt;/h3&gt;&lt;p&gt;新建并启动容器（后台运行 + 端口映射 + 自动重启）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run -d --name web -p 8080:80 --restart unless-stopped nginx:1.27&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;常用 &lt;code&gt;-run&lt;/code&gt; 参数对照：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;参数&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;含义&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;-d&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;后台运行&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;-p 宿主端口:容器端口&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;端口映射&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;--name xxx&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;指定容器名（代替又长又难敲的容器 ID）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;--restart unless-stopped&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;开机/异常自动重启&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;-v /data:/var/lib/mysql&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;挂载数据卷&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;-e MYSQL_ROOT_PASSWORD=xxx&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;注入环境变量&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;--network xxx&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;加入指定网络&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;容器生命周期：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker ps &lt;span style="color:#75715e"&gt;# 运行中的容器&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker ps -a &lt;span style="color:#75715e"&gt;# 所有容器（含已停止）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker start web &lt;span style="color:#75715e"&gt;# 启动&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker restart web &lt;span style="color:#75715e"&gt;# 重启&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker stop web &lt;span style="color:#75715e"&gt;# 停止（发 SIGTERM，优雅退出）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker kill web &lt;span style="color:#75715e"&gt;# 强制停止（SIGKILL）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker rm web &lt;span style="color:#75715e"&gt;# 删除已停止的容器&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker rm -f web &lt;span style="color:#75715e"&gt;# 强制删除运行中的容器&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker container prune &lt;span style="color:#75715e"&gt;# 批量清理所有停止的容器&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看与调试：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker logs -f --tail &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt; web &lt;span style="color:#75715e"&gt;# 跟踪查看最后 100 行日志&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker top web &lt;span style="color:#75715e"&gt;# 容器内进程&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker inspect web &lt;span style="color:#75715e"&gt;# 容器完整配置（JSON）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker stats &lt;span style="color:#75715e"&gt;# 实时资源占用（容器版 top）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;进入容器（推荐 &lt;code&gt;exec&lt;/code&gt; 而不是老教程里的 &lt;code&gt;attach&lt;/code&gt;）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker exec -it web /bin/bash &lt;span style="color:#75715e"&gt;# 在运行中的容器里开一个新终端&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;原 2020 年教程推荐的 &lt;code&gt;docker attach&lt;/code&gt; 会共享容器主进程的 stdin，&lt;code&gt;exit&lt;/code&gt; 会直接把容器停掉；&lt;code&gt;docker exec&lt;/code&gt; 是新开进程，退出不影响容器，&lt;strong&gt;日常调试一律用 exec&lt;/strong&gt;。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="34-docker-composev2必会"&gt;3.4 Docker Compose（v2，必会）&#10;&lt;/h3&gt;&lt;p&gt;2026 年 Compose 已是 Docker 内置插件，用&lt;strong&gt;空格&lt;/strong&gt;调用，配置文件也统一为 &lt;code&gt;compose.yaml&lt;/code&gt;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker compose up -d &lt;span style="color:#75715e"&gt;# 根据 compose.yaml 创建并启动全部服务&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker compose ps &lt;span style="color:#75715e"&gt;# 查看服务状态&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker compose logs -f &lt;span style="color:#75715e"&gt;# 跟踪日志&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker compose down &lt;span style="color:#75715e"&gt;# 停止并删除容器（-v 连数据卷一起删）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一个典型的 &lt;code&gt;compose.yaml&lt;/code&gt;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;web&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;nginx:1.27&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;8080:80&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./html:/usr/share/nginx/html&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;unless-stopped&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;db&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;mysql:8.4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;example&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;db-data:/var/lib/mysql&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;db-data&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="4-docker-镜像与构建"&gt;4. Docker 镜像与构建&#10;&lt;/h2&gt;&lt;p&gt;镜像是一种轻量级、可执行的软件包，打包了代码、运行时、库、环境变量和配置文件。底层基于**联合文件系统（UnionFS）**的分层结构——多个容器可以共享同一份只读层，只有写入时才复制（写时复制）。&lt;/p&gt;&#10;&lt;h3 id="41-从-commit-到-dockerfile"&gt;4.1 从 commit 到 Dockerfile&#10;&lt;/h3&gt;&lt;p&gt;2020 年的教程教的是 &lt;code&gt;docker commit&lt;/code&gt; 把容器固化成镜像，这个命令还在，但&lt;strong&gt;只适合临时保存现场&lt;/strong&gt;，正规做法是写 &lt;code&gt;Dockerfile&lt;/code&gt;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 多阶段构建：builder 阶段编译，runtime 阶段只带产物&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; &lt;span style="color:#e6db74"&gt;node:22-alpine&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; &lt;span style="color:#e6db74"&gt;builder&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WORKDIR&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/app&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;COPY&lt;/span&gt; package*.json ./&lt;span style="color:#960050;background-color:#1e0010"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;RUN&lt;/span&gt; npm ci&lt;span style="color:#960050;background-color:#1e0010"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;COPY&lt;/span&gt; . .&lt;span style="color:#960050;background-color:#1e0010"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;RUN&lt;/span&gt; npm run build&lt;span style="color:#960050;background-color:#1e0010"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; &lt;span style="color:#e6db74"&gt;nginx:1.27-alpine&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;COPY&lt;/span&gt; --from&lt;span style="color:#f92672"&gt;=&lt;/span&gt;builder /app/dist /usr/share/nginx/html&lt;span style="color:#960050;background-color:#1e0010"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;EXPOSE&lt;/span&gt; &lt;span style="color:#e6db74"&gt;80&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;构建（BuildKit 已是默认构建器，无需额外配置）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker build -t myapp:1.0 .&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;多阶段构建能把最终镜像从 1GB+ 压到几十 MB——编译工具链全部留在 builder 阶段，不进最终镜像。&lt;/p&gt;&#10;&lt;h3 id="42-构建最佳实践"&gt;4.2 构建最佳实践&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;.dockerignore&lt;/code&gt; 必写&lt;/strong&gt;：排除 &lt;code&gt;node_modules&lt;/code&gt;、&lt;code&gt;.git&lt;/code&gt; 等，否则构建上下文巨大且可能泄露敏感文件&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;利用缓存&lt;/strong&gt;：先 &lt;code&gt;COPY package*.json&lt;/code&gt; 再 &lt;code&gt;npm ci&lt;/code&gt;，最后才 &lt;code&gt;COPY . .&lt;/code&gt;，代码改动不会触发依赖重装&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;镜像瘦身&lt;/strong&gt;：优先 &lt;code&gt;alpine&lt;/code&gt; / &lt;code&gt;slim&lt;/code&gt; 基础镜像；合并 &lt;code&gt;RUN&lt;/code&gt; 指令并清理缓存&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;跨平台构建&lt;/strong&gt;：&lt;code&gt;docker buildx build --platform linux/amd64,linux/arm64&lt;/code&gt; 一条命令构建多架构镜像（Apple Silicon 和云服务器架构不同时很有用）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;安全扫描&lt;/strong&gt;：&lt;code&gt;docker scout cves myapp:1.0&lt;/code&gt; 检查镜像漏洞&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="43-数据持久化"&gt;4.3 数据持久化&#10;&lt;/h3&gt;&lt;p&gt;容器删了数据就没了，重要数据必须挂卷：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run -d -v mydata:/var/lib/mysql mysql:8.4 &lt;span style="color:#75715e"&gt;# 命名卷（推荐，docker 管理）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run -d -v /host/path:/data nginx:1.27 &lt;span style="color:#75715e"&gt;# 绑定挂载（开发调试用）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="写在最后"&gt;写在最后&#10;&lt;/h2&gt;&lt;p&gt;六年过去，Docker 的核心概念（镜像、容器、仓库、分层）一点没变，变的是周边：安装更省心、Compose 更强大、构建更智能、国内加速更折腾。入门顺序建议：&lt;strong&gt;装好 → 跑通 hello-world → 用 compose 编排一个真实项目 → 写第一个 Dockerfile&lt;/strong&gt;，一周足够上手。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;原文发布于 2020-09-19，本文为 2026 年全面修订版。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;</description></item></channel></rss>