Puppet 发布 Blueshift 项目中专门针对 Docker 的特性

  • John Okoro
  • 谢丽

2016 年 7 月 22 日

话题:DevOps

Blueshift 项目为背景,Puppet 新增了一组Docker镜像,用于运行发布到 Docker Hub的 Puppet 软件。

这些新 Docker 镜像的例子里包含一个让用户可以运行 Puppet Server(可以独立运行,也可以和PuppetDB同时运行)的Puppet Server 镜像和一个附带PostgreSQL镜像的 PuppetDB 镜像。其中还包含两个代理镜像,一个基于 Ubuntu Xenial Puppet 代理程序包,另一个基于简化版的 Alpine

Blueshift 演示了异构软件管理问题的解决方案,使用 Puppet 作为新软件栈的统一管理方式。Blueshift 包含 Puppet 社区中关于如何集成ConsulCoreOSMesos等技术的信息。Blueshift 还包含 Puppet 的内部工程。

Puppet 还提供了如何在 Docker 中使用 Puppet的例子。目前,这些例子展示了如何在 VMware Photon OS、Red Hat CentOS Atomic上的 Docker 容器中和 CoreOS 上使用 Puppet。还有例子展示了如何使用 Docker Compose 搭建一个 Puppet 基础设施。

Blueshift 项目的一个例子中,Gareth Rushgrove演示了如何使用 Puppet 管理 Docker 容器。Puppet Docker 模块大约是和 Docker 同时发布的,自此以后,社区一直致力于这方面的工作。

第一步是安装 Puppet Docker 示例模块:

# puppet module install garethr-docker

简单来说,Docker 模块允许你使用清单文件中的一行代码安装 Docker:

include 'docker'

你可以在清单文件中声明任意多的镜像。这个例子使用了一个 Ubuntu 镜像:

docker::image { ‘ubuntu':
  image => 'trusty',
}

这些简单的 Docker 容器现在可以通过 Puppet 轻松地应用了。Docker version 会显示 Docker 已经安装了,并且会显示详细的版本信息:

# puppet apply /vagrant/docker_example.pp

# docker version
Client version: 1.5.0
Client API version: 1.17
Go version (client): go1.4.1
Git commit (client):a8a31ef
OS/Arch (client): linux/amd64
Server version: 1.5.0
Server API version: 1.17
Go version (server): go1.4.1
Git commit (server): a8a31ef
#

Docker ps 会显示当前没有任何东西在运行:

# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
#

Docker images 会显示 Docker 镜像已经创建:

# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
Ubuntu trusty d0955f21bf24 3 weeks ago 188.3 MB
Ubuntu trusty-20150320 d0955f21bf24 3 weeks ago 188.3 MB
Ubuntu latest d0955f21bf24 3 weeks ago 188.3 MB
Ubuntu 14.04 d0955f21bf24 3 weeks ago 188.3 MB
Ubuntu 14.04.2 d0955f21bf24 3 weeks ago 188.3 MB #

Docker 模块支持运行和管理各种 Docker 容器。容器可以在主机的 init 系统(如systemdsysvinit)下运行,也可以使用 Docker 内置的进程管理器。下面的代码增加了两个简单的 Docker run 资源:

docker::run { 'helloworld':
  image   => 'ubuntu',
  command => '/bin/sh -c "while true; do echo hello world; sleep 1; done"',
}

docker::run { 'goodbyecruelworld':
  image   => 'ubuntu',
  command => '/bin/sh -c "while true; do echo goodbye cruel world; sleep 1; done"',
}

使用 puppet apply,我们可以快速将更新应用到这两个将要在 Docker 容器中运行的服务上。现在,Docker ps 会显示,当前有两个简单的服务正在运行:

# Puppet apply /vagrant/docker_example.pp
Notice: Compiled catalog for localhost in environment production in 0.93 seconds
Notice: /Stage[main]/Main/Docker::Run[helloworld]/File[/etc/init.d/docker-helloworld]/ensure: created
Notice: /Stage[main]/Main/Docker::Run[helloworld]/Service[docker-helloworld]/ensure: ensure changed ‘stopped’to ‘running’
Notice: /Stage[main]/Main/Docker::Run[goodbyecruelworld]/File[/etc/init.d/docker-goodbyecruelworld]/ensure: created 
Notice: /Stage[main]/Main/Docker::Run[goodbyecruelworld]/Service[docker-goodbyecruelworld]/ensure: ensure changed ‘stopped’ to ‘running’
Notice: Finished catalog run in 1.11 seconds

# docker ps 
CONTAINER ID   IMAGE      COMMAND               CREATED         STATUS         PORTS  NAMES
27b9ca786f9b   ubuntu:14.04 “/bin/sh -c ‘while t  18 seconds ago  Up 17 seconds         jolly_wright
4ec0c0225714   ubuntu:14.04 “/bin/sh -c ‘while t  18 seconds ago  Up 17 seconds         focused_wright
#

使用 docker attach 和容器 ID 连接到其中一个服务上会显示正在 Docker 中执行的服务:

# docker attach 27b9ca786f9b
goodbye cruel world
goodbye cruel world
goodbye cruel world 
^C#
#
# docker attach 4ec0c0225714
hello world
hello world
hello world 
^C#
# 

Docker 模块还支持类似挂载卷、设置环境变量、运行特权容器和暴露端口这样的动作。Puppet 还可以使用 docker exec 特性在运行中的容器环境中执行命令:

docker::exec { 'helloworld-uptime':
  detach => true,
  container => 'helloworld',
  command => 'uptime',
  tty => true,
}

查看英文原文:Puppet Releases Docker-Focused Features in Project Blueshift

DevOps