30、Docker Compose与Docker Machine实战指南

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 这些工具,用户可以更高效地管理容器和构建分布式系统,为企业的数字化转型提供有力支持。在实际应用中,建议根据具体的需求和场景选择合适的工具和技术,以达到最佳的效果。

【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器模拟器的研究展开,重点介绍了基于Matlab的建模仿真方法。通过对四轴飞行器的动力学特性进行分析,构建了非线性状态空间模型,并实现了姿态位置的动态模拟。研究涵盖了飞行器运动方程的建立、控制系统设计及数值仿真验证等环节,突出非线性系统的精确建模仿真优势,有助于深入理解飞行器在复杂工况下的行为特征。此外,文中还提到了多种配套技术如PID控制、状态估计路径规划等,展示了Matlab在航空航天仿真中的综合应用能力。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及从事无人机系统开发的工程技术人员,尤其适合研究生及以上层次的研究者。; 使用场景及目标:①用于四轴飞行器控制系统的设计验证,支持算法快速原型开发;②作为教学工具帮助理解非线性动力学系统建模仿真过程;③支撑科研项目中对飞行器姿态控制、轨迹跟踪等问题的深入研究; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注动力学建模控制模块的实现细节,同时可延伸学习文档中提及的PID控制、状态估计等相关技术内容,以全面提升系统仿真分析能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值