Docker 快速上手:用 Play with Docker 在浏览器里跑起你的第一个 httpd 容器
示例工程【免费下载链接】udemy-docker-masteryDocker Mastery Udemy course to build, compose, deploy, and manage containers from local development to high-availability in the cloud项目地址https://gitcode.com/gh_mirrors/ud/udemy-docker-mastery点击查看免费下载本文对应课程章节《Play with Docker / Quick Container Run》位于 intro/quick-container-run/quick-container-run.md是 udemy-docker-mastery 课程入门三部曲之一What is Docker? → Quick Container Run → Why Docker? Why Now?。本篇将带你跳过本机安装配置的繁琐细节直接在浏览器提供的 Docker 沙箱环境中体验docker run的完整流程从检查版本、拉取镜像、发布端口到并行运行多个容器。读完本文你将掌握 Docker 客户端与引擎daemon的协作关系、端口发布-p背后的网络原理以及docker ps、docker logs、docker exec等最基础也最常用的容器操作命令。在深入配置细节之前最快了解 Docker 的方式就是先真正跑起来一个容器。官方为此提供了一个基于 Web 的练习场——Play with Docker简称 PWD它允许你在浏览器里直接获得一个带有 Docker CLI 与 Docker Engine 的 Linux Shell无需任何本机安装。准备注册 Docker 账号并登录 PWDPWD 是一个免费的在线服务为了避免被滥用它要求你先拥有一个Docker 账号ID才能访问。前往 Docker Hub 官网注册一个免费账号即可——这一步本质上只是为了身份验证不涉及任何付费。拿到用户名和密码后打开 PWD 官网登录即可进入工作区。注意PWD 是共享的免费服务偶尔会因负载过高而繁忙。如果登录后报错可以尝试刷新浏览器或过几分钟重试如果 PWD 持续不可用也可以直接阅读本文因为后续所有命令在本机安装 Docker 后可以原样执行。启动一个 PWD 实例并检查 Docker 版本登录成功后你会进入一个新的会话页面顶部有倒计时计时器表示该沙箱会话的可用时长。点击Add New Instance添加新实例按钮即可创建一个带有 Docker CLI 与 Docker Engine守护进程的全新 Shell创建成功后你看到的是一个可以执行基础 Linux 命令、同时内置了 Docker CLI 的 Shell。先用docker version检查版本 docker version Client: Docker Engine - Community Version: 20.10.0 API version: 1.41 Go version: go1.13.15 Git commit: 7287ab3 Built: Tue Dec 8 18:54:00 2020 OS/Arch: linux/amd64 Context: default Experimental: true Server: Docker Engine - Community Engine: Version: 20.10.0 API version: 1.41 (minimum version 1.12) Go version: go1.13.15 Git commit: eeddea2 Built: Tue Dec 8 18:58:04 2020 OS/Arch: linux/amd64 Experimental: true containerd: Version: v1.4.3 GitCommit: 269548fa27e0089a8b8278fc4fc781d7f65a939b runc: Version: 1.0.0-rc92 GitCommit: ff819c7e9184c13b7c2607fe6c30ae19403a7aff docker-init: Version: 0.19.0 GitCommit: de40ad0docker version会返回两组版本信息这一点非常关键Client客户端对应你刚刚运行的docker命令行二进制。它负责接收你输入的命令并将其翻译成对 Docker API 的调用。Server服务器对应后台运行的Docker Engine 守护进程daemon它才是真正执行拉取镜像、创建容器、管理网络等实际工作的组件。Client 通过 Docker API 与 Server 通信。在上面的输出中Docker Engine 与 Client 运行在同一台机器上所以对话发生在本地但这种通信完全可以跨机器进行——Client 可以通过 Unix Socket、TCP 或 SSH 与位于其他机器上的 Docker Engine 通信这也是后面课程中管理远程节点如 Swarm 集群的基础。从 Docker Hub 运行第一个镜像Apache httpd现在来做一件看起来很平常、背后却完成了一整套流水线的事运行一个 Apache Web Server 容器。 docker run -d -p 8800:80 httpd Unable to find image httpd:latest locally latest: Pulling from library/httpd ae13dd578326: Pull complete fd997b74d81b: Pull complete 248a67212d22: Pull complete 60cf240b9129: Pull complete b75bd115573c: Pull complete Digest: sha256:94cd479f4875e3e0fba620baf7a0e9353e15783368f4f74b9ea5bdc729b3f366 Status: Downloaded newer image for httpd:latest 049c7a9c9f5606db8cdd51f572a6493116f445d721c64324887508041f4d8d14命令的最后一行输出049c7a9c9f56...就是新容器的唯一容器 ID。就这样一个最新版的 Apache Web Server 已经在容器中运行起来了。小知识这个官方镜像的名字叫httpd而不是apache是因为 Apache Web Server 的可执行二进制文件本身就叫httpdHTTP Daemon。Docker 官方镜像的命名通常与软件真实二进制名保持一致详情可参考 dockerfile-sample-1/Dockerfile 这类官方镜像的 Dockerfile 写法——例如 Nginx 官方镜像会在末尾用CMD [nginx, -g, daemon off;]显式声明容器启动命令并EXPOSE 80声明监听端口这些元数据都会随镜像一起分发。这一条命令背后发生了什么9 步拆解命令只有一行但背景中发生的事远比你看到的要多。逐步拆开来看Docker Client 向 Docker Engine 下达指令run表示用httpd镜像创建一个新容器-ddetached表示让容器在后台运行-p 8800:80表示在宿主机 IP 上开放端口 8800并把流量转发进容器的 80 端口。默认标签latest我们没有指定 Apache 的版本Docker Engine 便假定为latest——这与大多数包管理器默认安装最新版的习惯一致。本地无缓存则先拉取Docker Engine 在本地没有找到缓存的httpd:latest镜像于是先从 Docker Hub 下载。输出中的Pulling from library/httpd以及一串Pull complete表明镜像由多层layers构成逐层下载最后的Digest: sha256:...是镜像内容的校验摘要。创建容器Docker Engine 基于httpd:latest镜像创建一个新容器。创建虚拟网卡并接入网络Docker Engine 在宿主机上创建一个新的**虚拟以太网接口veth**并接入容器。这个veth连接着 Docker 的默认网络而该默认网络位于宿主机网卡之后通过NAT网络地址转换访问外部网络。分配私有 IPDocker Engine 为容器分配一个唯一的 IP它属于 Docker 控制的私有子网。默认情况下容器通过宿主机 IP 作为网关来访问真实网络和互联网。发布端口Docker Engine 请求宿主机在宿主 IP及 localhost上打开端口 8800并将流量转发到容器 IP 的 80 端口——这正是 Apache 默认监听的端口。启动容器进程Docker Engine 启动容器的进程httpd。返回容器 IDDocker Engine 向 Client 返回唯一的容器 ID。这就是为什么 Docker 被称为应用隔离而非虚拟化的直观体验镜像image负责把应用连同其全部依赖打包注册表registry负责分发容器container负责可复现地运行——即 Docker 的 Build, Ship and Run 生命周期详见 What is Docker?。它利用 Linux 内核的 namespaces 与 cgroups 特性隔离应用容器内的进程默认看不到宿主机上其他进程拥有自己独立的文件系统视图、虚拟网卡和私有 IP。用 curl 验证 Web 服务容器启动后用curl访问已发布的端口 8800 验证 Apache 是否工作 curl localhost:8800 htmlbodyh1It works!/h1/body/html返回的htmlbodyh1It works!/h1/body/html是 Apache httpd 的默认欢迎页说明容器内的 Web 服务已正常对外提供服务。用 docker ps 查看运行中的容器 docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 049c7a9c9f56 httpd httpd-foreground 24 minutes ago Up 24 minutes 0.0.0.0:8800-80/tcp upbeat_mcleandocker ps输出的每一列都值得留意CONTAINER ID容器 ID 的短格式前 12 位即前面docker run返回的长 ID 的缩写IMAGE容器基于的镜像httpdCOMMAND容器启动时运行的进程httpd-foreground——注意它是前台进程这正是容器保持运行的关键容器主进程退出容器即停止STATUSUp 24 minutes表示已运行时长PORTS0.0.0.0:8800-80/tcp表示宿主机所有网卡 IP 的 8800 端口被发布映射到容器 80 端口NAMESDocker 自动生成的随机名称upbeat_mclean也可用--name参数自行指定。隔离与并行运行第二个 httpd 容器由于每个容器都是完全隔离的我们可以在同一台机器上运行多个 Apache 副本而互不干扰。再启动一个监听 8801 端口的容器 docker run -d -p 8801:80 httpd daf459a2c121b4d6007f9779d0563368564a4c50632e888afc0de59c192db065这一次Docker 发现本地已有缓存的镜像于是跳过下载步骤直接完成了其余所有启动步骤。现在应该能看到两个容器同时在运行 docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES daf459a2c121 httpd httpd-foreground About a minute ago Up About a minute 0.0.0.0:8801-80/tcp nervous_hopper 049c7a9c9f56 httpd httpd-foreground 31 minutes ago Up 31 minutes 0.0.0.0:8800-80/tcp upbeat_mclean提示docker提供了大量向后兼容、易于记忆的 CLI 别名。docker ps与docker container ls返回同样的结果类似地docker run等价于docker container run。课程后续的 S04 Creating and Using Containers 章节中大量使用了docker container run --publish 80:80 nginx这种更完整的长命令形式两者可以互换使用。两个容器为什么能同时监听 80 端口这两个 Apache 容器除了共享镜像、以及被发布到同一个宿主 IP 之外没有任何共享的东西。它们可以各自在容器内的 80 端口运行 Apache 而不冲突原因在于每个容器都拥有自己的**虚拟以太网接口veth**和独立的网络命名空间容器内的端口 80 只属于它自己的私有网络世界真正需要避免冲突的是宿主机上被发布的端口。-p 8800:80与-p 8801:80会让 Linux 主机的iptables分别把host-ip:8800、host-ip:8801的流量路由到对应容器的container-ip:80。就像任何监听 IP 端口的进程一样两个进程永远无法同时监听同一个 IP:PORT 组合。所以当你发布端口时必须为每个容器选择不同的宿主端口否则宿主机上会报 port already in use端口已被占用错误。从两个容器延伸开去logs、exec 与镜像标签有了运行中的容器就可以开始探索更丰富的操作docker logs id查看某个容器的输出日志。对于 httpd 这类 Web 服务器日志中会记录每一次 HTTP 请求是排查问题的最直接手段。docker exec id在运行中的容器内部再执行额外的命令例如进入容器的 Shell 查看进程、检查配置文件等。课程 S04 中的docker container exec -it mysql bash就是这一能力的典型用法——无需 SSH容器本身就是可进入的环境。不同版本的同一应用通过给镜像名追加版本标签可以运行同一应用的多个版本。例如执行docker run -d -p 8802:80 httpd:2.4.52Docker 会额外下载httpd:2.4.52这个标签对应的镜像并与latest版本并存。仓库中的 compose-sample-2/docker-compose.yml 也展示了同样的标签实践image: httpd:2使用 Apache v2 的最新版以及image: nginx:1.23使用 1.23 系列最新版。这条docker run命令在任何系统上运行结果都一样——无论是 Linux、macOS 还是 Windows无论是 x86_64、arm64 还是 i386 平台。这正是容器时代解决 Works on My Machine 环境问题的核心价值把 N1 种环境差异收敛为一种可复现的运行方式详见 Why Docker? Why Now?。小结你刚刚体验了什么短短几分钟内你在浏览器里完成了 Docker 的第一次完整实战操作命令学到什么检查安装docker versionClient 与 Server 的双组件架构、Docker API后台运行容器docker run -d -p 8800:80 httpd镜像拉取、标签默认值、端口发布、容器 ID验证服务curl localhost:8800发布端口与容器端口的关系查看容器docker ps容器状态、端口映射、随机名称并行运行docker run -d -p 8801:80 httpd容器隔离、veth、iptables 路由、端口占用约束后续操作docker logs/docker exec/ 版本标签日志、进入容器、多版本并存后面的课程会逐步覆盖更丰富的命令与特性网络管理、镜像构建、Compose、Swarm 等但你现在已经能看到这种软件运行方式的核心价值一次构建、随处运行、互不干扰。等你在本机安装好 Docker 后本节所有命令都可以原样执行——它们不会因为换了一台机器而有所不同。赞分享示例工程【免费下载链接】udemy-docker-masteryDocker Mastery Udemy course to build, compose, deploy, and manage containers from local development to high-availability in the cloud项目地址https://gitcode.com/gh_mirrors/ud/udemy-docker-mastery点击查看免费下载相关推荐Docker快速入门使用Play With Docker运行容器Docker快速入门使用Play With Docker运行容器 前言 在学习Docker技术时最令人兴奋的部分莫过于能够快速启动并体验容器技术。本文将介绍示例工程Docker Mastery 入门篇三大创新、Play with Docker 快速上手与容器的时代必然性Docker Mastery 入门篇三大创新、Play with Docker 快速上手与容器的时代必然性 本指南对应 udemy docker master示例工程Duix.Avatar本地部署指南用10秒素材做出第一条数字人口播视频Duix.Avatar本地部署指南用10秒素材做出第一条数字人口播视频 Duix.Avatar 是一个可以完全本地部署的开源数字人项目部署完成之后生成视频人工智能AI 应用数字人媒体生成桌面应用上一篇如何快速激活Windows和OfficeKMS_VL_ALL_AIO智能激活终极指南下一篇NodeGui 中 QAbstractItemViewSelectionBehavior 枚举详解控制 Item 视图的行、列与项选择行为创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考