90DaysOfDevOps 实战(Day 44):Docker 镜像与 Docker Desktop 上运行你的第一个容器 文档/教程【免费下载链接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.项目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps点击查看免费下载本篇技术指南承接 90DaysOfDevOps 的 DevOps 学习路线图围绕 Docker 镜像Docker Image与 Docker Desktop 的完整上手流程展开从理解镜像的本质、注册并认识 DockerHub 镜像仓库到在 Docker Desktop 中查看容器/镜像/卷再到通过docker run命令真正部署第一个 Web 容器、体验hello-world与交互式 Ubuntu 容器。读完本文你将掌握镜像的拉取、运行、交互与生命周期观察的完整方法并能在本仓库的配套示例文件基础上继续深入。说明本文对应的中文文档位于 2022/zh_cn/Days/day44.md配套操作步骤均以该文档为骨架并结合仓库中 Containers 目录下的 Dockerfile 与 docker-compose 示例进行源码级补充。文中图片取自仓库 2022/Days/Images 目录。DockerHub 镜像仓库首页一、先明确Docker 镜像到底是什么在动手之前先回放一下核心概念原文档中反复强调值得记住Docker 镜像Image是一个用于在 Docker 容器中执行代码的文件。它本质上是一组构建容器的指令集合类似模板同时镜像也是使用 Docker 时的起点。更精确地说镜像是只读的模板其中包含构建容器的指令与预配置环境而容器则是这个模板的运行实例。在后续 Day 45 的文档 中原文档进一步补充了镜像的分层结构每个构成镜像的文件被称为一个“层layer”各层按阶段堆叠每一层依赖于其正下方的层Docker 每次从镜像启动容器时还会额外添加一个可写层即容器层用于保存运行期间的全部变更——这就是“同一镜像可以派生无数个状态各异的容器”的根本原因。本日任务聚焦“用别人构建好的镜像”下一日Day 45才会进入“自己写 Dockerfile 构建镜像”的环节。但即便只是使用现成镜像理解上述分层机制也能帮你解释后面hello-world与 Ubuntu 容器体积差异等直观现象。二、注册 DockerHub镜像的中央仓库在动手部署镜像之前建议先去 DockerHub 注册一个账号。DockerHub 是使用 Docker 及其组件时的中央化资源最常见的角色是托管 Docker 镜像的 Registry镜像仓库除此之外它还提供大量可配合自动化流程使用的能力例如与 CI/CD 自动化如 GitHub Actions 集成配合镜像安全扫描security scanning。登录后向下滚动页面会看到一系列容器镜像列表例如 MySQL 数据库镜像、hello-world等。这些镜像可以视作高质量的“基线镜像baseline images”——如果你恰好需要一个数据库镜像直接使用官方镜像即可无需自己从头构建。在 DockerHub 中按分类、操作系统与架构浏览镜像理解两个信任标识Official Image 与 Verified Publisher在镜像详情页中有两个直接影响你“敢不敢用”的标识原文档专门做了区分标识含义Official Image官方镜像Docker 官方维护的一组精选开源且“开箱即用drop-in”的解决方案仓库来源可信度最高。Verified Publisher验证发布者由已验证的发布者提供的高质量 Docker 内容这些产品由商业实体直接发布和维护。比如以wordpress为关键词搜索时结果中会同时出现官方镜像与验证发布者原文档建议优先关注这些标识以确认容器镜像的来源可靠性——这与镜像供应链安全直接相关。按关键词搜索镜像并识别官方镜像与验证发布者标识三、探索 Docker Desktop从空工作台开始假设你已经安装好 Docker Desktop若你使用的是 Linux则没有 GUI 桌面但 Docker Engine 在 Linux 上完全可用可参考官方 Ubuntu 安装文档其他发行版也有对应安装方式。打开 Docker Desktop 后你会看到一个类似下图的工作台——此时还没有任何运行中的容器但Docker Engine 已经处于运行状态。Docker Desktop 主界面引擎运行中且无运行容器几个核心标签页逐个看Docker Desktop 的左侧标签页是你观察与管理容器生命周期的第一现场原文档逐一带我们过了一遍Containers/Apps容器与应用这里列出所有容器及其运行状态。刚安装时为空列表。Images镜像列出本地已下载的镜像。如果你不是全新安装像原文档作者一样这里可能已经有一些镜像全新安装则大概率是空的。Remote repositories远程仓库这里会显示你已推送到 DockerHub 的镜像。还没有推送过任何镜像时此处为空登录 DockerHub 网站同样会看到仓库列表为空两边可以互相印证。Volumes卷如果你的容器需要持久化数据就可以在这里把卷挂载到本地文件系统或共享文件系统上。本日暂时用不到但它是 Day 46 中 MySQL 数据持久化的重要基础。Dev Environments开发环境该标签页用于帮助团队协作避免在不同 Git 分支之间来回切换。原文档明确说明本系列不展开介绍它。Docker Desktop 的 Images 标签页与本地已存在镜像四、运行第一个容器docker/getting-started回到第一个标签页Docker Desktop 提供了一个 getting-started入门容器。在原文档对应的终端里执行docker run -d -p 80:80 docker/getting-started这条命令拆解如下这些参数在后续所有容器操作中都会反复出现建议一次记牢docker run从镜像创建并启动容器-ddetached 模式即让容器在后台运行终端不会被容器进程阻塞-p 80:80端口映射将容器内部的 80 端口映射到宿主机的 80 端口格式为宿主端口:容器端口docker/getting-started要使用的镜像名来自 DockerHub。执行 docker run -d -p 80:80 docker/getting-started 命令在 Docker Desktop 中确认容器已运行回到 Docker Desktop 窗口你会看到docker/getting-started容器已经处于Running状态Docker Desktop 中显示一个正在运行的容器如果你使用的是 WSL2Windows Subsystem for Linux 2原文档特别提醒必须在 Docker Desktop 的设置中确认 WSL2 集成已启用否则容器可能无法正常在 WSL 后端运行。此时再回到Images 标签页你会发现本地多了一个“in use使用中”的镜像docker/getting-started——这正是docker run自动完成“本地无镜像则从 DockerHub 拉取”流程的直观证据。打开浏览器访问容器内的 Web 服务回到Containers/Apps 标签页点击正在运行的容器默认会展示该容器的日志Logs窗口顶部有一排操作选项例如进入容器终端、查看统计信息等由于docker/getting-started内部是一个 Web 页面我们选择open in browser在浏览器中打开。点击后浏览器会自动打开localhost呈现类似下图的页面——这是一个关于容器与镜像概念的入门教程页相当于容器自带的“说明书”。在浏览器中打开本地 80 端口访问容器内的 Web 页面到这里我们已经成功运行了人生中的第一个容器整个过程并不吓人。为了让环境保持整洁虽然该容器资源占用并不大原文档作者选择先停掉这个容器再继续下一步演示。五、docker run hello-world拉取、运行、自动退出接下来测试从 DockerHub 拉取一个经典镜像。在终端中执行docker run hello-world观察输出你会发现本地并没有hello-world镜像所以 Docker 先完成了拉取pull然后运行镜像接着打印一段内嵌在镜像中的欢迎信息——这段信息说明了容器做了什么、如何运行起来并附带一些参考链接。终端输出 hello-world 容器的欢迎信息为什么容器“不见了”回到 Docker Desktop 查看Containers/Apps 标签页没有“运行中”的容器但出现了一个Exited已退出状态的容器使用的正是hello-world镜像这说明该容器启动 → 输出消息 → 随即终止是一次典型的“一次性任务型容器”。再到Images 标签页确认本地已经多了一个hello-world镜像。这意味着下次再执行docker run hello-world除非版本发生变化否则 Docker 不会再从 DockerHub 拉取任何东西——本地镜像缓存机制在此刻生效。Docker Desktop Images 标签页显示新增的 hello-world 镜像六、交互式 Ubuntu 容器docker run -it ubuntu bashhello-world的输出最后留下了一个“挑战”运行一个更有野心的东西。原文档作者欣然接受执行docker run -it ubuntu bash这条命令的关键参数-iinteractive保持标准输入打开允许我们与容器交互-ttty为容器分配一个伪终端pseudo-TTY让我们能看到类似本地 Shell 的提示符ubuntu bash以ubuntu官方镜像启动并在容器内执行bash作为入口命令。执行后你会立刻得到一个交互式提示符——我们获得了容器内的 bash Shell。注意这并非一个完整的操作系统副本而是基于 Ubuntu 镜像的精简容器化运行环境。为什么它只有不到 30MB进入 Shell 后你会发现有 bash 可用但除此之外几乎没有更多工具——这正是该镜像体积不到 30MB的原因。Docker 镜像追求“紧凑、无冗余”只打包运行所需的最小子集这是容器与传统虚拟机在体积与启动速度上的本质差异虚拟机通常以 GB 计而容器以 MB 计。在容器里安装软件apt 实战尽管精简这个镜像依然可用的包管理器。可以执行apt-get update apt-get upgrade -y对容器镜像进行更新与升级也可以直接安装软件例如原文档演示的apt-get install pintapinta是一个体积超过 200MB 的图片编辑器用它演示安装会显著增大容器体积但仍然停留在 MB 量级不会到 GB——虽然这在实际场景中并非好例子但它直观地说明了容器镜像的“可写层”是可变的我们在容器内安装的所有软件只存在于该容器的运行层。一旦容器被关闭或销毁这些安装与更新就会全部丢失无法形成可复用的版本。这正是下一日Day 45引入Dockerfile构建“可重复镜像”的动机——把安装过程固化为指令才能在多个环境中复制出完全一致的软件环境。七、仓库配套素材从“用镜像”迈向“造镜像”本日文档的收尾预告了后续主题除了下载并使用现成镜像还需要理解网络、安全与其他选项最终目标是把自制镜像推送到自己的 DockerHub 仓库并完成部署。仓库中已经准备了对应的配套素材可作为延伸学习路径Containers 目录下的 Dockerfile一个真实的最小 Dockerfile 示例以ubuntu:18.04为基础镜像执行apt-get update apt-get upgrade -y并通过USER basicuser以非 root 用户运行——这正是 Day 45 文档 中“用 Dockerfile 构建镜像”的仓库落地版本其中还包含 FROM / WORKDIR / RUN / COPY / ADD / ENTRYPOINT / CMD / EXPOSE / LABEL 等核心指令的用途对照表。my_wordpress/docker-compose.yamlDay 46 多容器编排WordPress MySQL示例。elasticsearch-logstash-kibana/docker-compose.yml单节点 ELKElasticsearch、Logstash、Kibana组合示例对应 Day 46 文档 的延伸实践。八、小结与下一步本日我们完成了一条完整的“从零到第一个容器”路径明确 Docker 镜像只读模板、容器运行实例的基本模型注册 DockerHub学会识别 Official Image 与 Verified Publisher 两类信任标识熟悉 Docker Desktop 的 Containers/Apps、Images、Volumes 等核心标签页用docker run -d -p 80:80 docker/getting-started部署并浏览器访问第一个 Web 容器用docker run hello-world观察“拉取-运行-自动退出”的完整生命周期与本地镜像缓存机制用docker run -it ubuntu bash进入交互式容器体验 apt 更新与软件安装理解可写层与镜像体积的关系。下一步建议阅读 Day 45Docker 镜像的解剖The anatomy of a Docker Image学习用 Dockerfile 把“手工安装”固化为可重复构建的镜像指令并尝试用docker build -t 90daysofdevops:0.1 .在 Containers 目录中构建仓库自带的示例镜像。赞分享文档/教程【免费下载链接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.项目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps点击查看免费下载相关推荐90DaysOfDevOps 实战笔记Day 44用 Docker Desktop 拉取并运行你的第一个 Docker 镜像90DaysOfDevOps 实战笔记Day 44用 Docker Desktop 拉取并运行你的第一个 Docker 镜像 本篇是 90DaysOfDe文档/教程90DaysOfDevOps 实战 Day 44Docker 镜像入门与 Docker Desktop 首次动手运行容器90DaysOfDevOps 实战 Day 44Docker 镜像入门与 Docker Desktop 首次动手运行容器 Docker 镜像是容器技术的基石文档/教程90DaysOfDevOps 实战Docker 镜像与 Docker Desktop 从零上手Day 4490DaysOfDevOps 实战Docker 镜像与 Docker Desktop 从零上手Day 44 导读 本文是 90DaysOfDevOps 容文档/教程上一篇3步打造专属Office功能区Office RibbonX Editor完全指南下一篇Open-Meteo一条命令自建五分钟跑通的免费天气API创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考