想象一下,无需在笔记本电脑上安装任何东西,就能在几秒钟内启动一个多节点 Docker Swarm 集群。多年来,我看到开发者为 Docker 安装头疼不已,陷入系统依赖的泥潭、处理权限错误,并担心他们老旧的硬件是否扛得住资源消耗。
直到我发现了 Play with Docker,这彻底改变了我教授和学习容器化的方式。
Play with Docker 是一个免费的、基于浏览器的沙盒,您可以即时获取 Alpine Linux 虚拟机,用来构建和运行 Docker 容器。无论您是刚开始接触容器化的新手数据从业者,还是想快速测试新 Docker 功能的资深专业人士,PWD 都能提供一个易于上手、零风险的环境。
在这篇完整教程中,我会带您从第一个容器一路走到使用 Docker Compose 进行多容器编排。结束时,您将在不离开浏览器的情况下,运行起一个容器化的 Web 服务器。
如果您是 Docker 及其概念的新手,建议先学习我们的Docker 入门课程,或先学习容器化与虚拟化概念。
什么是 Play With Docker?
Play with Docker(PWD)是一个免费、临时的 Docker 实验环境,直接在您的浏览器中运行。它由 Docker Captains Marcos Liljedhal 和 Jonathan Leibiusky 创建,源自一次黑客松项目,并迅速成为 Docker 社区的关键工具。
PWD 的核心是 Docker-in-Docker(dind)技术,即在 Docker 容器内运行 Docker 容器。这个嵌套架构听起来可能很复杂,但正是它让您可以完整体验 Docker 功能,包括多节点 Swarm 集群等高级特性,而不会影响本地机器。
平台将所有复杂性都隐藏在幕后,呈现给您一个干净的终端界面。它提供 Alpine Linux 实例,这是一种非常适合容器工作负载的轻量级 Linux 发行版。Alpine 刻意保持极简,基础镜像尺寸仅约 5 MB,而 Ubuntu 则超过 100 MB。
这种高效意味着更快的下载和更短的启动时间。每个实例都提供完整的终端体验,与本地安装时相同的命令行能力,包括 shell、Docker CLI,以及Docker Compose。
PWD 为初学者消除了安装门槛,同时为高级用户提供了测试 Docker Swarm 等编排功能的空间。您可以创建多节点集群、尝试网络配置并测试容器调度,而无需管理虚拟机或云实例的开销。
Play With Docker 与 Docker Desktop 对比
在了解了 PWD 的能力后,您可能会好奇什么时候该用它,什么时候该在本地安装 Docker Desktop。搞清楚两者的适用场景可以为您省去时间和烦恼。
Play with Docker 可在浏览器中即时使用,无需安装,不占用本地资源,且完全免费并原生支持 Docker Swarm。不过,会话仅持续两小时,之后一切都会被删除;性能有限,且会话到期后没有持久化存储。
注意:尽管PWD 文档显示会话时长为四小时,但我测试时实际只有两小时。看起来文档尚未更新。
Docker Desktop 在本地机器上运行,提供持久化存储、更好的性能,并与 Visual Studio Code 等开发工具无缝集成。您可以在没有会话超时的情况下处理长期项目。
|
Feature
|
Play with Docker
|
Docker Desktop
|
|
Setup
|
Zero installation, browser-based
|
Requires installation
|
|
Session duration
|
2-hour limit
|
No time limits
|
|
Performance
|
Shared resources, limited
|
Full system resources
|
|
Storage
|
Temporary, deleted after the session
|
Persistent on local disk
|
|
Cost
|
Free
|
Free for personal use; paid for enterprise
|
|
System impact
|
None (cloud-based)
|
Uses local CPU and memory
|
|
Swarm support
|
Native support
|
Requires additional setup
|
|
IDE integration
|
None
|
Excellent (VS Code, etc.)
|
何时使用 Play With Docker
以下场景中,Play with Docker 表现出色:
- 一次性测试
- 跟着教程练习
- 在低配笔记本或 Chromebook 上工作
- 与团队成员共享实时会话 URL 进行调试或演示
何时使用 Docker Desktop
Docker Desktop 在以下情况下必不可少:
- 日常开发工作
- IDE 集成
- 持续数周或数月的持久化项目
- 需要自定义网络和卷的资源密集型工作负载
开始使用 Play With Docker
既然您已经知道何时该用 PWD,下面就来设置并运行您的第一个会话。
设置 Play with Docker
开始之前,您需要一个 Docker Hub 账号。访问Docker Hub创建一个。如果您还没有,只需提供邮箱和密码即可。

Play with Docker 登录
前往Play with Docker 网站,使用 Docker Hub 凭据登录。验证后,点击绿色的“Start”按钮生成您的会话。几秒钟内,PWD 会在您的浏览器中提供一个全新的 Alpine Linux 环境,并显示一个倒计时计时器,提示您剩余的两小时会话时间。
浏览 Play with Docker 仪表板
PWD 界面简单却强大。点击“Add New Instance”可创建新的 Alpine Linux 实例。您最多可同时运行 5 个实例,用于测试多节点集群。主终端窗口提供完整的 bash shell,并预装了 Docker。
留意倒计时计时器。当它归零时,所有内容都会被删除,而且无法延长会话。

Play with Docker 中的仪表板
提示:标准的 Ctrl+V 粘贴在 PWD 中常常不起作用。请使用 Ctrl+Insert 复制、Shift+Insert 粘贴。请立即测试您的粘贴快捷键,以免影响体验。
Play With Docker 中的核心操作
准备好 PWD 环境并熟悉界面后,就可以运行您的第一个容器并学习基本的 Docker 命令了。
运行您的第一个容器
我们来部署一个 Nginx Web 服务器,以理解镜像与容器。执行以下命令:
docker run -d -p 80:80 nginx技术支持
会发生什么:docker run 会创建并启动一个新容器。-d 标志让它以分离模式(后台)运行。-p 80:80 将主机的 80 端口映射到容器的 80 端口。nginx 是 Docker 镜像名称。
可以把 Docker 镜像看作“食谱”,这里就是 Nginx 的食谱。正在运行的容器就像按这份食谱烤出来的蛋糕。您可以用同一份食谱(镜像)烤出多个蛋糕(容器)。
管理容器:
docker ps
docker stop <id>
docker rm <id> 技术支持
您只需输入容器 ID 的前几个字符,Docker 就能识别您指的是哪一个。
Play with Docker 中的端口转发
PWD 的端口转发与本地端口转发有所不同。当您暴露一个端口时,PWD 会自动创建一个可访问的动态 URL。
运行 Nginx 容器后,查看 PWD 界面顶部的 IP 区域。点击“Open Port”,添加“80”。它会在新浏览器标签页打开一个唯一的 URL,例如 http://ip<numbers>-<session-id>.direct.labs.play-with-docker.com。

Play with Docker 中的端口转发
这里并不是访问 localhost。PWD 会创建特殊 URL,将互联网流量路由到您的特定容器。这意味着您可以将这些 URL 分享给同事,实时展示您的工作。
调试与检查
如果结果不如预期,您需要工具来查看容器内部发生了什么。
排查问题时,这些命令可以帮助您窥视容器内部:
docker logs <container-id>
docker ps
docker inspect <container-id> 技术支持
点击 80 端口的链接后运行 docker logs,您会在 Nginx 访问日志中看到浏览器请求。这种实时反馈有助于您理解请求在应用中的流转。

Play with Docker 中的 Docker 日志
掌握这些核心操作后,您就可以从运行预构建镜像,迈向创建自己的自定义容器。
在 Play With Docker 中构建镜像与管理数据
既然我们已经覆盖了容器的基本操作,接下来深入创建自定义镜像。这正是 Docker 真正的力量所在:将应用及其全部依赖打包为可移植、可复现的镜像。
编写基础 Dockerfile
Dockerfile 通过基于文本的指令来自动化镜像构建。与其每次手动配置容器,不如只写一次 Dockerfile,剩下的交给 Docker。

在 Play with Docker 中创建 Dockerfile
首先,在终端创建 Dockerfile:
touch Dockerfile技术支持
然后在 PWD 中点击“Editor”按钮,添加一个简单的镜像:
FROM alpine
CMD ["echo", "Hello DataCamp"]技术支持
最后,构建并运行该 Dockerfile。-t 标志用于给镜像命名(或“打标签”),便于引用。. 表示使用当前目录作为构建上下文,也就是 Docker 查找 Dockerfile 及所需文件的位置。您会看到 Docker 执行每条指令并输出各层的 ID。
docker build -t my-first-image .
docker run my-first-image技术支持

在 Play with Docker 中构建 Docker 镜像
您会看到打印出“Hello DataCamp”。恭喜!您已经构建了第一个自定义镜像!这个简单示例演示了核心流程:编写指令、构建镜像、运行容器。
但有一个关键问题需要解决:当容器停止或被删除时,您的数据会怎样?
Play with Docker 中的数据持久化
理解数据持久化对于高效使用容器至关重要。默认情况下,容器的设计是“短暂”的:当您删除一个容器时,每一次文件修改、每一条数据库记录、每一项日志都会立刻消失。
这看似有问题,但实际上是 Docker 的关键特性之一。短暂的容器易于替换、扩展和调试,因为它们是可丢弃的。
那么需要保留的数据怎么办?这就要用到Docker 卷(volume)。卷是由 Docker 管理、存在于容器文件系统之外的存储区域。把它想象成可以插到不同容器上的 U 盘。当您把它从一个容器“拔下”并“插到”另一个容器时,数据仍然保留其上。

Docker 容器 vs. Docker 卷
实际演示如下。创建并使用一个卷:
docker volume create mydata
docker run -it -v mydata:/data alpine sh技术支持
-v mydata:/data 标志将 mydata 卷挂载到容器内的 /data 路径。写入到 /data 的任何内容实际上都保存在卷中。创建一个测试文件:
echo "This data persists!" > /data/important.txt
echo "Container ID: $(hostname)" >> /data/important.txt
exit技术支持
容器已停止并消失。现在用同一卷启动一个全新的容器:
docker run -it -v mydata:/data alpine sh
cat /data/important.txt技术支持

使用 Docker 卷实现数据持久化
文件仍在,且包含旧容器的 ID!数据之所以能保留,是因为它存储在卷中,而非容器的临时文件系统。您可以将同一个卷挂载到任意数量的容器,它们都会看到相同的数据。
不过,对于 PWD 用户来说,有一点至关重要:会话两小时到期后,即使是卷也会被删除。卷只在单个会话内持久化,跨会话不会保留。
理解数据持久化很重要,但大多数真实应用都涉及多个相互连接的服务。这时Docker Compose就变得必不可少。
使用 Docker Compose 进行容器编排
掌握了单个容器之后,是时候应对真实世界的应用了——它们很少只包含一个服务。现代应用通常包括多个组件:Web 前端、API 后端、数据库、缓存,甚至消息队列。用多个 docker run 命令管理这些组件,最终会变成一场协调噩梦。
为什么使用 Docker Compose?
想象这样一个场景:您要部署一个需要 Web 服务器、PostgreSQL 数据库和 Redis 缓存的应用。
如果没有 Compose,您需要分别运行三条 docker run 命令,每条命令还要带上用于网络、端口映射、卷挂载和环境变量的大量标志。您必须记住正确的启动顺序(先数据库,再缓存,最后 Web 服务器),一旦出问题,就得在多个终端窗口里到处找原因。
Docker Compose 优雅地解决了这一编排难题。您无需再 juggling 多条命令,而是在名为 docker-compose.yml 的单个 YAML 文件中定义整个多容器应用。该文件成为应用架构的单一事实来源,描述所有服务及其配置、相互连接方式,以及所用的卷。
使用 Compose,部署整个技术栈只需一个命令:docker-compose up。销毁同样简单:docker-compose down。这种声明式方法让基础设施可复现。任何人都可以克隆您的仓库,并用一条命令运行完整的应用栈,而不受操作系统或本地配置的影响。
Docker Compose 文件结构
我们来创建一个基础的 Docker Compose 文件。
首先在终端用 touch docker-compose.yml 创建文件,然后在 PWD 中点击“Editor”,将以下内容添加到文件中:
services:
web:
image: nginx
ports:
- "80:80"
redis:
image: redis技术支持
services 部分定义每个容器。服务名(如 web 和 redis)会成为 Docker 网络中的主机名。image 键指定要使用的 Docker Hub 镜像。部署如下:
docker-compose up -d技术支持
现在两个容器都在运行了,您可能会想:它们如何发现并相互通信?
网络与服务发现
Compose 会自动创建一个连接所有服务的网络,实现服务发现。容器之间使用服务名作为主机名进行通信。
在 web 容器内尝试 ping Redis 来测试:
docker-compose exec web sh
apt-get update && apt-get install -y iputils-ping
ping redis技术支持
能成功 ping 即证明容器可以通信!web 容器无需知道 redis 的 IP 地址即可访问它。Docker 的内部 DNS 会自动将服务名解析到正确的容器地址。
Play With Docker 的故障排查与最佳实践
随着您更多地使用 PWD,难免会遇到一些常见问题。以下是有效处理它们的方法。
“Session expired”
两小时限制是 PWD 最大的约束。计时归零时,一切都会消失,包括实例和数据。通过在本地提前准备代码再粘贴到 PWD,并做好备份来提高效率。在会话结束前将自定义镜像推送到 Docker Hub:
docker tag my-first-image yourusername/my-first-image
docker push yourusername/my-first-image技术支持
建议每个会话专注一个概念,而不是构建过于复杂的系统。两小时对于学习已经很充裕,可将工作拆分为离散的小块。
80/443 端口错误
与本地 Docker 通过 localhost 访问容器不同,PWD 使用动态 URL。不要尝试 localhost:80。请点击 PWD 界面顶部的端口徽章。如果徽章没有立即出现,请等待几秒或刷新浏览器。
最佳实践
此外,请牢记以下最佳实践:
- 使用像 Alpine 这样的微型基础镜像(5 MB,对比 Ubuntu 的 100+ MB)以节省带宽
- 非必要不要以 root 身份运行容器
- 切勿在 PWD 中使用真实凭据,因为它是公共平台
- 编写清晰的 Dockerfile,并用注释解释您的选择
- 让镜像专注于单一职责。
结语
在本教程中,您已经取得不小的进展。您了解了什么是 Play with Docker、何时使用它或 Docker Desktop,运行了第一个容器,理解了端口转发,并使用了调试命令。我们通过 Dockerfile 构建了自定义镜像,使用卷探索了数据持久化,并用 Docker Compose 编排了多容器应用。
Play with Docker 提供了一个零风险的环境,让您在无需本地安装的情况下学习 Docker 基础。您练习的技能——编写 Dockerfile、管理容器、配置网络——都可以直接应用到真实的 Docker 使用中。
既然已理解这些基础知识,请在本地安装 Docker Desktop。PWD 非常适合学习和快速测试,但严肃的开发工作需要本地安装所提供的持久性、性能和工具集成。您在 PWD 中学到的一切可直接用于 Docker Desktop:命令相同,概念一致。
继续在此基础上前进。尝试不同的基础镜像,探索 Docker 的网络功能,并练习编写可用于生产的 Dockerfile。持续学习、不断实验、不断构建。
我们的使用 Docker 和 Kubernetes 的容器化与虚拟化为使用容器提供了极佳的基础。若想继续学习,我还推荐以下资源:
想象一下,无需在笔记本电脑上安装任何东西,就能在几秒钟内启动一个多节点 Docker Swarm 集群。多年来,我看到开发者为 Docker 安装头疼不已,陷入系统依赖的泥潭、处理权限错误,并担心他们老旧的硬件是否扛得住资源消耗。
直到我发现了 Play with Docker,这彻底改变了我教授和学习容器化的方式。
Play with Docker 是一个免费的、基于浏览器的沙盒,您可以即时获取 Alpine Linux 虚拟机,用来构建和运行 Docker 容器。无论您是刚开始接触容器化的新手数据从业者,还是想快速测试新 Docker 功能的资深专业人士,PWD 都能提供一个易于上手、零风险的环境。
在这篇完整教程中,我会带您从第一个容器一路走到使用 Docker Compose 进行多容器编排。结束时,您将在不离开浏览器的情况下,运行起一个容器化的 Web 服务器。
如果您是 Docker 及其概念的新手,建议先学习我们的Docker 入门课程,或先学习容器化与虚拟化概念。
什么是 Play With Docker?
Play with Docker(PWD)是一个免费、临时的 Docker 实验环境,直接在您的浏览器中运行。它由 Docker Captains Marcos Liljedhal 和 Jonathan Leibiusky 创建,源自一次黑客松项目,并迅速成为 Docker 社区的关键工具。
PWD 的核心是 Docker-in-Docker(dind)技术,即在 Docker 容器内运行 Docker 容器。这个嵌套架构听起来可能很复杂,但正是它让您可以完整体验 Docker 功能,包括多节点 Swarm 集群等高级特性,而不会影响本地机器。
平台将所有复杂性都隐藏在幕后,呈现给您一个干净的终端界面。它提供 Alpine Linux 实例,这是一种非常适合容器工作负载的轻量级 Linux 发行版。Alpine 刻意保持极简,基础镜像尺寸仅约 5 MB,而 Ubuntu 则超过 100 MB。
这种高效意味着更快的下载和更短的启动时间。每个实例都提供完整的终端体验,与本地安装时相同的命令行能力,包括 shell、Docker CLI,以及Docker Compose。
PWD 为初学者消除了安装门槛,同时为高级用户提供了测试 Docker Swarm 等编排功能的空间。您可以创建多节点集群、尝试网络配置并测试容器调度,而无需管理虚拟机或云实例的开销。
Play With Docker 与 Docker Desktop 对比
在了解了 PWD 的能力后,您可能会好奇什么时候该用它,什么时候该在本地安装 Docker Desktop。搞清楚两者的适用场景可以为您省去时间和烦恼。
Play with Docker 可在浏览器中即时使用,无需安装,不占用本地资源,且完全免费并原生支持 Docker Swarm。不过,会话仅持续两小时,之后一切都会被删除;性能有限,且会话到期后没有持久化存储。
注意:尽管PWD 文档显示会话时长为四小时,但我测试时实际只有两小时。看起来文档尚未更新。
Docker Desktop 在本地机器上运行,提供持久化存储、更好的性能,并与 Visual Studio Code 等开发工具无缝集成。您可以在没有会话超时的情况下处理长期项目。
Feature
Play with Docker
Docker Desktop
Setup
Zero installation, browser-based
Requires installation
Session duration
2-hour limit
No time limits
Performance
Shared resources, limited
Full system resources
Storage
Temporary, deleted after the session
Persistent on local disk
Cost
Free
Free for personal use; paid for enterprise
System impact
None (cloud-based)
Uses local CPU and memory
Swarm support
Native support
Requires additional setup
IDE integration
None
Excellent (VS Code, etc.)
何时使用 Play With Docker
以下场景中,Play with Docker 表现出色:
何时使用 Docker Desktop
Docker Desktop 在以下情况下必不可少:
开始使用 Play With Docker
既然您已经知道何时该用 PWD,下面就来设置并运行您的第一个会话。
设置 Play with Docker
开始之前,您需要一个 Docker Hub 账号。访问Docker Hub创建一个。如果您还没有,只需提供邮箱和密码即可。
Play with Docker 登录
前往Play with Docker 网站,使用 Docker Hub 凭据登录。验证后,点击绿色的“Start”按钮生成您的会话。几秒钟内,PWD 会在您的浏览器中提供一个全新的 Alpine Linux 环境,并显示一个倒计时计时器,提示您剩余的两小时会话时间。
浏览 Play with Docker 仪表板
PWD 界面简单却强大。点击“Add New Instance”可创建新的 Alpine Linux 实例。您最多可同时运行 5 个实例,用于测试多节点集群。主终端窗口提供完整的 bash shell,并预装了 Docker。
留意倒计时计时器。当它归零时,所有内容都会被删除,而且无法延长会话。
Play with Docker 中的仪表板
提示:标准的
Ctrl+V粘贴在 PWD 中常常不起作用。请使用Ctrl+Insert复制、Shift+Insert粘贴。请立即测试您的粘贴快捷键,以免影响体验。Play With Docker 中的核心操作
准备好 PWD 环境并熟悉界面后,就可以运行您的第一个容器并学习基本的 Docker 命令了。
运行您的第一个容器
我们来部署一个 Nginx Web 服务器,以理解镜像与容器。执行以下命令:
会发生什么:
docker run会创建并启动一个新容器。-d标志让它以分离模式(后台)运行。-p 80:80将主机的 80 端口映射到容器的 80 端口。nginx是 Docker 镜像名称。可以把 Docker 镜像看作“食谱”,这里就是 Nginx 的食谱。正在运行的容器就像按这份食谱烤出来的蛋糕。您可以用同一份食谱(镜像)烤出多个蛋糕(容器)。
管理容器:
您只需输入容器 ID 的前几个字符,Docker 就能识别您指的是哪一个。
Play with Docker 中的端口转发
PWD 的端口转发与本地端口转发有所不同。当您暴露一个端口时,PWD 会自动创建一个可访问的动态 URL。
运行 Nginx 容器后,查看 PWD 界面顶部的 IP 区域。点击“Open Port”,添加“80”。它会在新浏览器标签页打开一个唯一的 URL,例如
http://ip<numbers>-<session-id>.direct.labs.play-with-docker.com。Play with Docker 中的端口转发
这里并不是访问 localhost。PWD 会创建特殊 URL,将互联网流量路由到您的特定容器。这意味着您可以将这些 URL 分享给同事,实时展示您的工作。
调试与检查
如果结果不如预期,您需要工具来查看容器内部发生了什么。
排查问题时,这些命令可以帮助您窥视容器内部:
点击 80 端口的链接后运行
docker logs,您会在 Nginx 访问日志中看到浏览器请求。这种实时反馈有助于您理解请求在应用中的流转。Play with Docker 中的 Docker 日志
掌握这些核心操作后,您就可以从运行预构建镜像,迈向创建自己的自定义容器。
在 Play With Docker 中构建镜像与管理数据
既然我们已经覆盖了容器的基本操作,接下来深入创建自定义镜像。这正是 Docker 真正的力量所在:将应用及其全部依赖打包为可移植、可复现的镜像。
编写基础 Dockerfile
Dockerfile 通过基于文本的指令来自动化镜像构建。与其每次手动配置容器,不如只写一次 Dockerfile,剩下的交给 Docker。
在 Play with Docker 中创建 Dockerfile
首先,在终端创建 Dockerfile:
然后在 PWD 中点击“Editor”按钮,添加一个简单的镜像:
最后,构建并运行该 Dockerfile。
-t标志用于给镜像命名(或“打标签”),便于引用。.表示使用当前目录作为构建上下文,也就是 Docker 查找 Dockerfile 及所需文件的位置。您会看到 Docker 执行每条指令并输出各层的 ID。在 Play with Docker 中构建 Docker 镜像
您会看到打印出“Hello DataCamp”。恭喜!您已经构建了第一个自定义镜像!这个简单示例演示了核心流程:编写指令、构建镜像、运行容器。
但有一个关键问题需要解决:当容器停止或被删除时,您的数据会怎样?
Play with Docker 中的数据持久化
理解数据持久化对于高效使用容器至关重要。默认情况下,容器的设计是“短暂”的:当您删除一个容器时,每一次文件修改、每一条数据库记录、每一项日志都会立刻消失。
这看似有问题,但实际上是 Docker 的关键特性之一。短暂的容器易于替换、扩展和调试,因为它们是可丢弃的。
那么需要保留的数据怎么办?这就要用到Docker 卷(volume)。卷是由 Docker 管理、存在于容器文件系统之外的存储区域。把它想象成可以插到不同容器上的 U 盘。当您把它从一个容器“拔下”并“插到”另一个容器时,数据仍然保留其上。
Docker 容器 vs. Docker 卷
实际演示如下。创建并使用一个卷:
-v mydata:/data标志将mydata卷挂载到容器内的/data路径。写入到/data的任何内容实际上都保存在卷中。创建一个测试文件:容器已停止并消失。现在用同一卷启动一个全新的容器:
使用 Docker 卷实现数据持久化
文件仍在,且包含旧容器的 ID!数据之所以能保留,是因为它存储在卷中,而非容器的临时文件系统。您可以将同一个卷挂载到任意数量的容器,它们都会看到相同的数据。
不过,对于 PWD 用户来说,有一点至关重要:会话两小时到期后,即使是卷也会被删除。卷只在单个会话内持久化,跨会话不会保留。
理解数据持久化很重要,但大多数真实应用都涉及多个相互连接的服务。这时Docker Compose就变得必不可少。
使用 Docker Compose 进行容器编排
掌握了单个容器之后,是时候应对真实世界的应用了——它们很少只包含一个服务。现代应用通常包括多个组件:Web 前端、API 后端、数据库、缓存,甚至消息队列。用多个
docker run命令管理这些组件,最终会变成一场协调噩梦。为什么使用 Docker Compose?
想象这样一个场景:您要部署一个需要 Web 服务器、PostgreSQL 数据库和 Redis 缓存的应用。
如果没有 Compose,您需要分别运行三条
docker run命令,每条命令还要带上用于网络、端口映射、卷挂载和环境变量的大量标志。您必须记住正确的启动顺序(先数据库,再缓存,最后 Web 服务器),一旦出问题,就得在多个终端窗口里到处找原因。Docker Compose 优雅地解决了这一编排难题。您无需再 juggling 多条命令,而是在名为
docker-compose.yml的单个 YAML 文件中定义整个多容器应用。该文件成为应用架构的单一事实来源,描述所有服务及其配置、相互连接方式,以及所用的卷。使用 Compose,部署整个技术栈只需一个命令:
docker-compose up。销毁同样简单:docker-compose down。这种声明式方法让基础设施可复现。任何人都可以克隆您的仓库,并用一条命令运行完整的应用栈,而不受操作系统或本地配置的影响。Docker Compose 文件结构
我们来创建一个基础的 Docker Compose 文件。
首先在终端用
touch docker-compose.yml创建文件,然后在 PWD 中点击“Editor”,将以下内容添加到文件中:services 部分定义每个容器。服务名(如 web 和 redis)会成为 Docker 网络中的主机名。image 键指定要使用的 Docker Hub 镜像。部署如下:
现在两个容器都在运行了,您可能会想:它们如何发现并相互通信?
网络与服务发现
Compose 会自动创建一个连接所有服务的网络,实现服务发现。容器之间使用服务名作为主机名进行通信。
在 web 容器内尝试 ping Redis 来测试:
能成功 ping 即证明容器可以通信!
web容器无需知道redis的 IP 地址即可访问它。Docker 的内部 DNS 会自动将服务名解析到正确的容器地址。Play With Docker 的故障排查与最佳实践
随着您更多地使用 PWD,难免会遇到一些常见问题。以下是有效处理它们的方法。
“Session expired”
两小时限制是 PWD 最大的约束。计时归零时,一切都会消失,包括实例和数据。通过在本地提前准备代码再粘贴到 PWD,并做好备份来提高效率。在会话结束前将自定义镜像推送到 Docker Hub:
建议每个会话专注一个概念,而不是构建过于复杂的系统。两小时对于学习已经很充裕,可将工作拆分为离散的小块。
80/443 端口错误
与本地 Docker 通过 localhost 访问容器不同,PWD 使用动态 URL。不要尝试
localhost:80。请点击 PWD 界面顶部的端口徽章。如果徽章没有立即出现,请等待几秒或刷新浏览器。最佳实践
此外,请牢记以下最佳实践:
结语
在本教程中,您已经取得不小的进展。您了解了什么是 Play with Docker、何时使用它或 Docker Desktop,运行了第一个容器,理解了端口转发,并使用了调试命令。我们通过 Dockerfile 构建了自定义镜像,使用卷探索了数据持久化,并用 Docker Compose 编排了多容器应用。
Play with Docker 提供了一个零风险的环境,让您在无需本地安装的情况下学习 Docker 基础。您练习的技能——编写 Dockerfile、管理容器、配置网络——都可以直接应用到真实的 Docker 使用中。
既然已理解这些基础知识,请在本地安装 Docker Desktop。PWD 非常适合学习和快速测试,但严肃的开发工作需要本地安装所提供的持久性、性能和工具集成。您在 PWD 中学到的一切可直接用于 Docker Desktop:命令相同,概念一致。
继续在此基础上前进。尝试不同的基础镜像,探索 Docker 的网络功能,并练习编写可用于生产的 Dockerfile。持续学习、不断实验、不断构建。
我们的使用 Docker 和 Kubernetes 的容器化与虚拟化为使用容器提供了极佳的基础。若想继续学习,我还推荐以下资源: