Docker Compose与Docker Machine实战指南
1. Docker Compose环境管理
1.1 清理环境
在使用
docker-compose
管理环境时,执行某些命令后,日志会显示哪些实例正在被停止和移除。可以使用
docker-compose ps
命令再次验证环境状态,示例输出如下:
| Name | Command | State | Ports |
| — | — | — | — |
| ch11coffeeapi_coffee_1 | ./entrypoint.sh | Up | 0.0.0.0:32807->3000/tcp |
在学习持久状态之前,建议使用
docker-compose rm
清理环境,以便重新开始。
1.2 迭代与持久状态
1.2.1 管理卷
卷是状态管理的重要方面。在迭代环境中,Compose 使得管理卷变得简单。当重建服务时,附加的管理卷不会被移除,而是会重新附加到替换的容器上,这意味着可以自由迭代而不会丢失数据。只有在使用
docker-compose rm -v
移除最后一个容器时,管理卷才会被清理。
1.2.2 环境状态问题
在高度迭代的环境中,更改环境配置可能会引发问题。例如,在
docker-compose.yml
中重命名或删除服务定义,会导致 Compose 无法管理该服务。以 Coffee API 为例,开发过程中
coffee
服务曾被命名为
api
,重命名后,Compose 不再识别
api
服务,该服务成为孤立服务。可以通过
docker ps
发现这种状态,恢复方法有两种:
- 使用
docker
命令直接清理环境。
- 将孤立服务定义添加回
docker-compose.yml
,然后使用 Compose 清理。
1.3 链接问题与网络
在使用 Compose 管理服务系统时,需要注意容器链接限制的影响。在 Coffee API 示例项目中,
proxy
服务依赖于
coffee
服务。Docker 通过创建防火墙规则并将服务发现信息注入依赖容器的环境变量和
/etc/hosts
文件来构建容器链接。
在高度迭代的环境中,仅重新启动特定服务可能会导致问题。例如,启动 Coffee API 环境后选择性地重新启动
coffee
服务,
proxy
服务将无法访问其上游依赖。因为容器重新创建或重启后,IP 地址会改变,导致注入
proxy
服务的信息过时。
在没有动态服务发现的环境中,处理此问题的最佳方法是重新启动整个环境,至少针对不充当上游依赖的服务。而使用动态服务发现机制或覆盖网络的健壮系统则不存在此问题。
1.4 新项目启动:Compose YAML 示例
1.4.1 预启动构建、环境、元数据和网络
以
coffee
服务为例,其服务定义如下:
coffee:
build: ./coffee
user: 777:777
restart: always
expose:
- 3000
ports:
- "0:3000"
links:
- db:db
environment:
- COFFEEFINDER_DB_URI=postgresql://postgres:development@db:5432/po...
- COFFEEFINDER_CONFIG=development
- SERVICE_NAME=coffee
labels:
com.dockerinaction.chapter: "11"
com.dockerinaction.example: "Coffee API"
com.dockerinaction.role: "Application Logic"
-
构建
:
build键指定用于构建的 Dockerfile 所在目录,可使用相对路径,也可使用dockerfile键指定替代的 Dockerfile 名称。 -
环境变量
:使用
environment键以列表或字典形式设置服务的环境变量,也可使用env_file键指定包含环境变量定义的文件。 -
元数据
:使用
labels键以列表或字典形式设置容器元数据,Compose 会使用标签存储服务会计信息。 -
网络配置
:
expose键指定应通过防火墙规则暴露的容器端口,ports键指定端口映射,links键指定链接依赖。
1.4.2 已知工件和绑定挂载卷
Coffee API 示例中的
proxy
和
db
服务使用从 Docker Hub 下载的镜像,建议在敏感环境中部署第三方镜像前进行拉取和检查。使用
image
键可以从任何镜像启动服务,这两个服务使用内容可寻址镜像:
db:
image: postgres@sha256:66ba100bc635be17...
volumes_from:
- dbstate
environment:
- PGDATA=/var/lib/postgresql/data/pgdata
- POSTGRES_PASSWORD=development
labels:
com.dockerinaction.chapter: "11"
com.dockerinaction.example: "Coffee API"
com.dockerinaction.role: "Database"
proxy:
image: nginx@sha256:a2b8bef333864317...
restart: always
volumes:
- ./proxy/app.conf:/etc/nginx/conf.d/app.conf
ports:
- "8080:8080"
links:
- coffee
labels:
com.dockerinaction.chapter: "11"
com.dockerinaction.example: "Coffee API"
com.dockerinaction.role: "Load Balancer"
proxy
服务使用卷将本地配置文件绑定挂载到 NGINX 动态配置位置,
db
服务使用
volumes_from
键指定依赖的
dbstate
服务。
1.4.3 卷容器和扩展服务
有时会遇到常见的服务原型,如 NodeJS 服务、Java 服务、基于 NGINX 的负载均衡器或卷容器。可以将这些原型定义为父服务,并为特定实例进行扩展和定制。
Coffee API 示例项目定义了一个名为
data
的卷容器原型:
data:
image: gliderlabs/alpine
command: echo Data Container
user: 999:999
labels:
com.dockerinaction.chapter: "11"
com.dockerinaction.example: "Coffee API"
com.dockerinaction.role: "Volume Container"
dbstate
服务扩展了
data
服务:
dbstate:
extends:
file: docker-compose.yml
service: data
volumes:
- /var/lib/postgresql/data/pgdata
服务扩展必须指定扩展的文件和服务名称,子容器继承父容器的所有属性,包括元数据。
dbstate
服务使用
volumes
键定义挂载的管理卷。
1.5 Docker Compose 总结
- Docker Compose 是定义、启动和管理服务的工具,服务是一个或多个 Docker 容器的副本。
- Compose 使用 YAML 配置文件定义环境。
-
使用
docker-compose命令行程序可以构建镜像、启动和管理服务、扩展服务以及查看日志。 -
Compose 管理环境和迭代项目的命令与
docker命令行命令类似。 - 可以使用单个命令扩展运行服务的容器数量。
- 使用 YAML 声明环境配置可实现环境版本控制、共享、迭代和一致性。
2. Docker Machine 介绍
2.1 驱动选择
Docker Machine 自带多个驱动,每个驱动将 Docker Machine 与不同的虚拟机技术或基于云的虚拟计算提供商集成。从 Docker 客户端的角度来看,本地主机和远程主机没有区别。
使用本地虚拟机驱动(如 VirtualBox)可以降低运行示例的成本,但建议选择首选云提供商的驱动,因为这样可以管理真实世界的资源。如果选择云提供商,需要使用特定于提供商的信息(如访问密钥和秘密密钥)配置环境,并在命令中替换特定于驱动的标志。可以通过运行
docker-machine help create
命令或查阅在线文档获取详细信息。
2.2 构建和管理 Docker 机器
2.2.1 创建 Docker 主机
使用 Docker Machine 创建 Docker 主机的示例命令如下:
docker-machine create --driver virtualbox host1
docker-machine create --driver virtualbox host2
docker-machine create --driver virtualbox host3
运行这些命令后,将创建三个由 Docker Machine 管理的 Docker 主机。Docker Machine 使用主目录下的一组文件(
~/.docker/machine/
)跟踪这些机器,这些文件描述了创建的主机、用于建立安全通信的证书颁发机构证书以及基于 VirtualBox 的主机使用的磁盘映像。
2.2.2 列出和检查机器
使用
docker-machine ls
命令列出管理的机器,示例输出如下:
| NAME | ACTIVE | DRIVER | STATE | URL | SWARM |
| — | — | — | — | — | — |
| host1 | | virtualbox | Running | tcp://192.168.99.100:2376 | |
| host2 | | virtualbox | Running | tcp://192.168.99.101:2376 | |
| host3 | | virtualbox | Running | tcp://192.168.99.102:2376 | |
使用
docker-machine inspect
命令检查特定机器的详细信息,也可以使用 Go 模板语法转换描述机器的原始 JSON 文档。例如,获取机器的 IP 地址:
docker-machine inspect --format "{{.Driver.IPAddress}}" host1
更简单的方法是使用
docker-machine ip
命令:
docker-machine ip host1
2.2.3 升级机器
可以使用
docker-machine upgrade
命令升级任何管理的机器:
docker-machine upgrade host3
升级过程会停止机器,下载软件的更新版本,然后重新启动机器。使用此命令可以轻松执行滚动升级。
2.2.4 文件操作和终端访问
可以使用
docker-machine ssh
命令连接到机器的终端,例如在
host1
上创建文件:
docker-machine ssh host1
touch dog.file
exit
如果不需要完全交互式终端,可以将命令作为额外参数传递给
ssh
子命令:
docker-machine ssh host1 "echo spot > dog.file"
使用
docker-machine scp
命令可以安全地复制文件,该命令接受两个参数:源文件和目标文件。
通过 Docker Compose 和 Docker Machine,可以更高效地管理容器和构建分布式系统。Docker Compose 简化了单个主机上的服务管理,而 Docker Machine 则帮助创建和管理多个 Docker 主机,为构建大规模服务器软件提供了有力支持。
3. Docker Swarm 简介
3.1 分布式系统面临的问题
在实际应用中,通常需要同时操作多台机器。Docker 是构建大规模服务器软件的优秀基础,但 Docker 引擎本身无法直接解决分布式环境中出现的各种问题,例如:
- 如何在不同主机上启动不同服务的环境。
- 分布式环境中的服务如何定位其依赖项。
- 如何以与提供商无关的方式快速创建和管理大量 Docker 主机。
- 如何为服务的可用性和故障转移进行扩展。
- 当服务分布在多个主机上时,系统如何将负载均衡器的流量导向正确的服务。
3.2 Docker Swarm 的作用
Docker Machine 和 Docker Swarm 这两个工具可以解决 Docker 用户在配置机器、编排部署和运行集群服务器软件时遇到的问题。Docker Engine 和 Docker Compose 通过将主机与容器化软件分离,简化了开发人员和运维人员的工作。而 Docker Machine 和 Docker Swarm 则帮助系统管理员和基础设施工程师将这些抽象扩展到集群环境中。
3.3 构建分布式系统
学习和解决分布式系统问题的第一步是构建一个分布式系统。Docker Machine 可以在几秒钟内创建和销毁整个 Docker 主机群。对于想要在分布式云或本地虚拟环境中使用 Docker 的人来说,学习如何使用这个工具至关重要。
3.4 Docker Swarm 集群概述
Docker Swarm 是 Docker 官方提供的集群管理和编排工具,它可以将多个 Docker 主机组合成一个单一的虚拟主机,使得用户可以像管理单个主机一样管理整个集群。以下是 Docker Swarm 可以解决的一些关键问题:
-
容器调度
:根据资源可用性和约束条件,将容器分配到合适的节点上运行。
-
服务发现
:使服务能够自动发现和连接到它们所依赖的其他服务。
3.5 集群管理流程
下面是使用 Docker Machine 配置整个 Swarm 集群的简单流程图:
graph LR
A[创建 Docker 主机] --> B[初始化 Swarm 集群]
B --> C[添加节点到 Swarm 集群]
C --> D[部署服务到 Swarm 集群]
4. 实践操作:构建 Docker Swarm 集群
4.1 创建 Docker 主机
首先,使用 Docker Machine 创建多个 Docker 主机。这里我们使用 VirtualBox 驱动创建三个主机:
docker-machine create --driver virtualbox manager
docker-machine create --driver virtualbox worker1
docker-machine create --driver virtualbox worker2
运行上述命令后,会创建一个名为
manager
的管理节点和两个名为
worker1
和
worker2
的工作节点。
4.2 初始化 Swarm 集群
使用以下命令初始化 Swarm 集群:
docker-machine ssh manager "docker swarm init --advertise-addr $(docker-machine ip manager)"
该命令会在
manager
节点上初始化 Swarm 集群,并指定该节点的广告地址为其 IP 地址。初始化完成后,会输出加入集群的命令,类似于:
docker swarm join --token SWMTKN-1-xxxxxx-xxxxxx $(docker-machine ip manager):2377
4.3 添加节点到 Swarm 集群
将
worker1
和
worker2
节点加入到 Swarm 集群中:
docker-machine ssh worker1 "docker swarm join --token SWMTKN-1-xxxxxx-xxxxxx $(docker-machine ip manager):2377"
docker-machine ssh worker2 "docker swarm join --token SWMTKN-1-xxxxxx-xxxxxx $(docker-machine ip manager):2377"
将上述命令中的
SWMTKN-1-xxxxxx-xxxxxx
替换为实际的令牌。
4.4 验证集群状态
在
manager
节点上验证集群状态:
docker-machine ssh manager "docker node ls"
该命令会列出集群中的所有节点,输出类似于:
| ID | HOSTNAME | STATUS | AVAILABILITY | MANAGER STATUS | ENGINE VERSION |
| — | — | — | — | — | — |
| xxxxxxx | manager | Ready | Active | Leader | 20.10.17 |
| xxxxxxx | worker1 | Ready | Active | | 20.10.17 |
| xxxxxxx | worker2 | Ready | Active | | 20.10.17 |
4.5 部署服务到 Swarm 集群
在 Swarm 集群上部署一个简单的服务,例如 Nginx:
docker-machine ssh manager "docker service create --name my-nginx --replicas 3 -p 80:80 nginx"
上述命令会创建一个名为
my-nginx
的服务,该服务有 3 个副本,并将主机的 80 端口映射到容器的 80 端口。
4.6 查看服务状态
在
manager
节点上查看服务状态:
docker-machine ssh manager "docker service ls"
输出类似于:
| ID | NAME | MODE | REPLICAS | IMAGE | PORTS |
| — | — | — | — | — | — |
| xxxxxxx | my-nginx | replicated | 3/3 | nginx:latest | *:80->80/tcp |
5. 总结与建议
5.1 工具总结
- Docker Compose :用于定义、启动和管理单个主机上的服务,通过 YAML 配置文件简化了服务的管理和迭代。
- Docker Machine :可以创建和管理多个 Docker 主机,支持多种驱动,方便在不同环境中使用。
- Docker Swarm :将多个 Docker 主机组合成一个集群,解决了分布式环境中的容器调度和服务发现问题。
5.2 使用建议
- 在开发和测试环境中,可以使用 Docker Compose 快速搭建和迭代服务。
- 在需要多个 Docker 主机的场景下,使用 Docker Machine 创建和管理主机。
- 对于生产环境中的大规模集群,使用 Docker Swarm 进行集群管理和编排。
5.3 未来展望
随着容器技术的不断发展,Docker 生态系统也在不断完善。未来,这些工具可能会提供更多的功能和更好的性能,帮助用户更轻松地构建和管理分布式系统。同时,与其他容器编排工具(如 Kubernetes)的集成和竞争也将推动整个行业的发展。
通过掌握 Docker Compose、Docker Machine 和 Docker Swarm 这些工具,用户可以更高效地管理容器和构建分布式系统,为企业的数字化转型提供有力支持。在实际应用中,建议根据具体的需求和场景选择合适的工具和技术,以达到最佳的效果。
超级会员免费看
1458

被折叠的 条评论
为什么被折叠?



