使用OpenStack管理Docker容器(二)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本文讲的是使用OpenStack管理Docker容器(二),【编者的话】本文将讲述如何使用OpenStack创建并管理Docker,有3种流行的使用方法,使用的分别是Nova Docker驱动,Heat Docker插件,以及Magnum。
本文讲的是使用OpenStack管理Docker容器(二) 【编者的话】本文将讲述如何使用OpenStack创建并管理Docker,有3种流行的使用方法,使用的分别是Nova Docker驱动,Heat Docker插件,以及Magnum。这篇文章分成2部分,第一部分,将主要介绍Nova Docker驱动的用法,第二部分,是关于Heat Docker插件和Magnum。这是序列文章的第二部分,即最后一部分。

这篇文章是之前的那篇 《如何使用OpenStack管理Docker容器》 的后续,在这篇文章中,我将使用OpenStack Docker的Heat plugin,以及Magnum。
下面是一些Nova Docker驱动目前所不具备的功能:
1. 传递环境变量
2. 连接容器
3. 指定volumes
4. 编排和调度容器
Heat Docker插件可以解决1-3的问题,第4个问题无法完美解决。下面是我在OpenStack Docker wiki上查找的,关于Heat的架构示意图。
odocker2.png

  • 这里不涉及Nova。OpenStack Heat在主机上使用Docker插件与Docker代理对话。
  • 主机是由VM催生的。VM可以由Nova催生,也可以让Heat使用Nova驱动催生。
  • 这里不需要Glance。因为容器镜像可以保存在Docker Registry。
  • 这种Heat方法允许我们指定环境变量,连接容器,指定volumes,以及编排运行Docker的主机。

使用Heat插件

Heat插件与OpenStack Kilo一同工作时,我遇到了一些问题。因为OpenStack Icehouse可以完美地工作,所以我将持续地使用OpenStack Icehouse。我参考 wiki 上的方法,在Devstack上使用OpenStack Icehouse集成Heat插件。

我的环境

在Virtualbox上运行Ubuntu 14.04,这个Virtualbox之前已经安装了Devstack Icehouse发行版。我的localrc文件在 这里 。localrc使用Nova网络而不是Neutron。

进行堆叠并安装Heat插件:

进行堆叠。成功堆叠后,我按照wiki提及的方法,安装Heat docker插件。插件安装完成后,需要重启Heat engine service。打开screen会话,进入Heat service的screen会话,关闭会话(ctrl-c),并重启这个特殊的service。完成重启Heat engine后,我们可以检查插件是否正确安装,并运行。
$ heat resource-type-list | grep Docker
| DockerInc::Docker::Container   

使用Heat启动本地容器

我 们将在主机上运行Docker代理,然后,使用OpenStack Heat插件创建容器。为了完成上述目标,第一步是在主机上安装Docker,并允许http访问,以便让Docker客户端进行连接。关于Docker的安装,使用的是 这里 的步骤。默认下,Docker不允许额外的http访问,为了让Docker在端口2376上允许额外的http访问,执行下列命令:
$ sudo /usr/bin/docker -d --host=tcp://0.0.0.0:2376

下面是一个简单的Heat的YML文件,这个文件是用来在本地创建nginx容器。
heat_template_version: 2013-05-23
description: >
Heat template to deploy Docker containers to an existing host
resources:
nginx-01:
type: DockerInc::Docker::Container
properties:
  image: nginx
  docker_endpoint: 'tcp://192.168.56.102:2376'

使用上述模板,创建Heat堆栈。
$ heat stack-create -f ~/heat/docker_temp.yml nginxheat1

检查堆栈是否创建成功:
$ heat stack-list
+--------------------------------------+---------------+-----------------+----------------------+
| id                                   | stack_name    | stack_status    | creation_time        |
+--------------------------------------+---------------+-----------------+----------------------+
| d878d8c1-ce17-4f29-9203-febd37bd8b7d | nginxheat1    | CREATE_COMPLETE | 2015-06-14T13:27:54Z |
+--------------------------------------+---------------+-----------------+----------------------

检查容器是否在本地运行:
$ docker -H :2376 ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
624ff5de9240        nginx:latest        "nginx -g 'daemon of   2 minutes ago       Up 2 minutes        80/tcp, 443/tcp     trusting_pasteur    

到这里,我们就可以在本地容器上访问web服务器。

使用Heat启动远程容器

我们将使用Nova创建一个VM,开启VM上的Docker代理,然后在VM上,使用OpenStack Heat插件创建容器。

首先,创建一个Fedora镜像,并上传到Glance,我所使用的步骤来自 这里 ,完成上述步骤后,查看Glance里面的镜像。
$ glance image-list
+--------------------------------------+---------------------------------+-------------+------------------+-----------+--------+
| ID                                   | Name                            | Disk Format | Container Format | Size      | Status |
+--------------------------------------+---------------------------------+-------------+------------------+-----------+--------+
| 17239070-5aef-4bab-85df-1f9f72b6370b | cirros-0.3.1-x86_64-uec         | ami         | ami              | 25165824  | active |
| ea6eb351-7268-4b2e-91cd-806a67c4e9fe | fedora-software-config          | qcow2       | bare             | 610140160 | active |
+--------------------------------------+---------------------------------+-------------+------------------+-----------+--------+

接下来,我使用下面的脚本,创建ssh需要的密钥,并设置合适的安全组。
# Create key and upload
ssh-keygen
nova keypair-add --pub-key ~/.ssh/id_rsa.pub key1
# Permit ICMP (ping):
nova secgroup-add-rule default icmp -1 -1 0.0.0.0/0
# Permit secure shell (SSH) access:
nova secgroup-add-rule default tcp 22 22 0.0.0.0/0
# Permit 2375 port access (Docker endpoint):
nova secgroup-add-rule default tcp 2375 2375 0.0.0.0/0

现在,我们使用Nova创建Fedora VM。
nova boot --flavor m1.medium --image fedora-software-config --security-groups default --key-name key1 --max-count 1 fedoratest

为了下载Docker镜像,这个实例需要额外的网络连接。为此,我们需要在与Nova联网时调整iptables,以便创建NAT filter。第一条规则是删除默认的filter,第二条是创建eth0地址的filter。、
sudo iptables -t nat -D nova-network-snat -o br100 -s 10.0.0.0/24 -j SNAT --to-source 
sudo iptables -t nat -A nova-network-snat -o br100 -s 10.0.0.0/24 -j SNAT --to-source 

检查实例的创建:
$ nova list
+--------------------------------------+------------+--------+------------+-------------+------------------+
| ID                                   | Name       | Status | Task State | Power State | Networks         |
+--------------------------------------+------------+--------+------------+-------------+------------------+
| ab701808-98fb-4cba-907f-663fd762cf2a | fedoratest | ACTIVE | -          | Running     | private=10.0.0.2 |
+--------------------------------------+------------+--------+------------+-------------+------------------+

为了登录Fedora VM,我们需要使用密钥,这个密钥是创建VM时使用的。
ssh -i ~/.ssh/id_rsa fedora@

fedora镜像上已经创建完成了,并且安装了Docker代理。为了可以与OpenStack Heat对话,我们需要启动Docker,并让Docker监听2375端口。
sudo cp /usr/lib/systemd/system/docker.service /etc/systemd/system/
Edit /etc/sysconfig/docker:
OPTIONS=--host=tcp://0.0.0.0:2375
sudo systemctl start docker.service

现在,我们可以在远程VM上创建容器了。现在,为了在远程VM上创建nginx容器,我们要指定Heat模板。docker文件的末尾是远程VM的ip地址。
heat_template_version: 2013-05-23
description: >
Heat template to deploy Docker containers to an existing host
resources:
nginx-01:
type: DockerInc::Docker::Container
properties:
  image: nginx
  docker_endpoint: 'tcp://10.0.0.2:2375'

使用上面的模板开启Heat堆叠。
$ heat stack-create -f docker_stack1.yml docker_stack2

事前,我们需要抓取nginx的Docker镜像。利用Heat,我们可以使这个过程自动化。
现在,我们可以检查到容器已经在VM上创建了。
[fedora@fedoratest ~]$ docker -H :2375 ps
CONTAINER ID        IMAGE               COMMAND                CREATED              STATUS              PORTS               NAMES
18a7ed8f5b00        nginx:latest        "nginx -g 'daemon of   About a minute ago   Up About a minute   80/tcp, 443/tcp     tender_morse  

这里 有一份Heat模板,这个模板文件可以创建VM,抓取Apache和Mysql容器,并连接它们。下面是另外一份优秀的 wiki ,这份wiki为Docker容器详细地解释了Heat模板,并列出了一个优秀的例子。不幸的是,在我的Devstack环境下,这些脚本无法正常工作。实例催生了,但容器创建失败。我花了许多时间,但仍无法解决。

OpenStack Magnum

OpenStack Heat插件解决了许多问题,这些问题是Nova Docker插件无法解决的。但是,它仍然无法解决动态编排和调度。Magnum是一个通用的容器管理解决方案,和其他容器技术一样,OpenStack开发的这个方案是可以用来管理Docker的。目前,Magnum支持Kubernetes和Docker。无论是在Kubernetes,还是Docker上,主机集群都可以被创建,并且在使用特殊的聚类算法和容器情况下,容器可以列入集群。Magnum仍然处在早期阶段,第一版本已经在几个月前和OpenStack kilo一起发行。
下面是Magnum的wiki上提及的Magnum架构示意图
odocker3.png

  • Magnum在任何需要管理容器的地方,使用其他的OpenStack组件,例如Nova, Heat, Neutron, Glance和Keystone 。
  • Nova用于创建micro VM实例,容器在其顶部运行,而Docker实例这时运行在每个micro VM实例上。
  • Heat用于整体编排,在使用Kubernetes的情况下,heat会创建Kubernetes代理,同步控制器,而对于Docker, Heat则会创建Docker Swarm集群,以及Swarm代理。
  • 所涉及的步骤是创建bay-model(Kubernetes,Docker),以及bay和容器的创建。

我试图按照 这里 提及的步骤,去创建Magnum集群。步骤一直进行到创建集群这里,但无法成功地完成这一步骤,总是卡在“CREATE_IN_PROGRESS”,我尝试过Kubernetes和Docker的bay-model,但仍没有成功。如果有人可以完成这个步骤,请告诉我。
容器编排仍然在发展中,并且有多种解决这一问题的技术仍在开发过程中。Docker正在开发自己的编排方案。对于那些已经在使用OpenStack的开发者,Magnum是一个比较完整的解决方案,因为它与其他OpenStack组件整合得较好。我觉得随着时间的推移,最好的技术会生存下来的。

参考:


备注:  上面的图片来自参考文章。

原文链接:OpenStack with Docker-part 2   (翻译:洪国安 审校:李颖杰)

============================================
译者介绍
洪国安,编程爱好者,目前是一名大三学生,希望通过帮社区翻译,提高自己的知识面。

原文发布时间为:2015-06-29
本文作者:Arthur 
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:使用OpenStack管理Docker容器(二)
相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
26天前
|
Docker 容器
进入Docker容器中
进入Docker容器中
34 2
|
1月前
|
Java Go 开发者
Docker容器技术简介及其与Go语言的结合点
【2月更文挑战第23天】本文首先概述了Docker容器技术的核心概念和优势,接着探讨了Go语言与Docker容器技术的结合点。通过阐述Docker的轻量级、可移植性和版本控制等特性,以及Go语言在容器化应用中的优势,本文旨在说明两者结合能够实现更高效、灵活的应用开发和部署。
|
1月前
|
Oracle 关系型数据库 数据库
|
6天前
|
存储 运维 监控
构建高效稳定的Docker容器监控体系
【4月更文挑战第18天】 在现代微服务架构中,Docker容器已成为部署和运行应用的标准环境。随之而来的挑战是如何有效监控这些容器的性能与健康状况,确保系统的稳定性和可靠性。本文将探讨构建一个高效稳定的Docker容器监控体系的关键技术和方法,包括日志管理、性能指标收集以及异常检测机制,旨在为运维人员提供实用的指导和建议。
11 0
|
15天前
|
Linux Docker 容器
docker 容器常用命令
docker 容器常用命令
13 0
|
15天前
|
Linux Shell 虚拟化
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
26 0
|
15天前
|
存储 Linux Shell
centos 部署docker容器 安装 、基本使用方法(一)
centos 部署docker容器 安装 、基本使用方法(一)
27 0
|
23天前
|
Kubernetes 网络协议 Docker
Docker 容器的DNS
Docker 容器的DNS
28 1
|
26天前
|
关系型数据库 MySQL Nacos
【深入浅出Nacos原理及调优】「实战开发专题」采用Docker容器进行部署和搭建Nacos服务以及“坑点”
【深入浅出Nacos原理及调优】「实战开发专题」采用Docker容器进行部署和搭建Nacos服务以及“坑点”
47 1
|
27天前
|
NoSQL 关系型数据库 MySQL
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
159 1