文章目录
  1. 1. 利用Puppet安装Docker
  • 安装docker
  • download the registry image
  • don’t download all ubuntu,
  • just ‘precise’
  • Run containers
  • 编写Dockerfile
  • 编写Dockerfile
  • Docker and Puppet (1+1=3)

    还记得很早之前,应该是Docker刚开始火的时候,很多人都认为Docker会替代Puppet,持有这一观点的大多数应该是程序员。个人猜想。

    1. Dockerfile可以自动构建一个image,包括软件包及依赖。
    2. 程序员只需要快速构建一个测试环境。

    真是一句道破天机呀,Dockerfile的确是很强大,语法也很简单,以至于大家马上就爱上它了。这正是因为如此,大家脑海里都会有一个疑问,Puppet与Docker的关系到底如何?

    一直以来,我也没有找到很多的理由来解释两者之关的关系,我们到底要如何好好利用这两款软件?最开始我就认为把Puppet客户端部署在Docker容器里,是不太现实的问题,Docker的特点就是快,创建快,销毁也快。如果还需要再维护一套Puppet来做配置管理,适得其反。并且Docker网络方案并不成熟,无法有效地管理Puppet在容器中的客户端。

    前2天有幸看到@jpetazzo 大神在Puppetcamp上的分享《Docker and Puppet (1+1=3)》深有体会,特此分享给大家。

    PPT的几个要点:

    1. Dockerfile vs Shell Scripts
    2. Dockerfile vs Configureation management
    3. Dockerfile and Puppet

    针对几个要点总结如下:

    1. Shell脚本处理异常比较繁琐,重新构建时都需要再次选择,并且它永远是从头开始执行,整体性能比较低下。
    2. 配置软件的优点:它能确保所有的操作系统都收敛到一个已知状态、编写的模块可以重复使用、可以任意组合模板库。
    3. 配置软件的缺点:学习路线曲折,需要配置一个agent客户端、除非你使用puppet appley来执行、资源集中。
    4. 以前使用Puppet:管理系统或虚拟机的软件包安装、部署代码、启动服务。
    5. 现在使用Puppet:管理系统或虚拟机的Docker安装、容器运行。
    6. 现在使用Dockerfiles:安装软件包、部署代码、启动服务。

    最关键的点就是最后3条。为什么说在容器之外运行Puppet更为方便?

    利用Puppet安装Docker

    配置代码参考如下:

    ‘’’

    安装docker

    include ‘docker’
    class { ‘docker’:
    version => ‘1.2.0’
    }

    download the registry image

    docker::image { ‘stackbrew/registry’:
    }

    don’t download all ubuntu,

    just ‘precise’

    docker::image { ‘ubuntu’:
    image_tag => ‘precise’
    }

    Run containers

    docker::run { ‘slavedb’:
    image => ‘jpetazzo/postgresql’
    command => ‘…’
    ports => [‘5432’, ‘22’],
    links => [‘masterdb:master’],
    use_name => true,
    volumes => [‘/var/lib/postgresql’],
    volumes_from => ‘420fc7e8aa20’,
    memory_limit => 100000000, # bytes
    username => ‘postgres’,
    hostname => ‘sdb.prod.dckr.io’,
    env => [‘FUZZINESS=42’, FOO=BAR’, ‘FOO2=BAR2’],
    dns => [‘8.8.8.8’, ‘8.8.4.4’],
    restart_service => true
    }
    ‘’’

    可以看到,使用Puppet来管理Docker是非常轻松的事,如果我们把Puppet运行在container里面呢?

    ’‘’

    编写Dockerfile

    FROM ubuntu:12.04
    RUN apt-get install -qy wget
    RUN mkdir /puppet
    WORKDIR /puppet
    RUN wget -q http://apt.puppetlabs.com/puppetlabs-release-precise.deb RUN dpkg -i puppetlabs-release-precise.deb
    RUN apt-get update -q
    RUN apt-get install -qy puppet-common
    CMD puppet agent —no-daemonize —verbose
    ‘’’

    安装完成后,我们是以daemon的形式在运行Puppet,如果不想启用后台进程,可以采用puppet apply的方式来运行,不过后续如果有更新,我们还需要调用Docker外部命令,dockerfile参考如下:

    ‘’’

    编写Dockerfile

    FROM ubuntu:12.04
    RUN apt-get install -qy wget
    RUN mkdir /puppet
    WORKDIR /puppet
    RUN wget -q http://apt.puppetlabs.com/puppetlabs-release-precise.deb RUN dpkg -i puppetlabs-release-precise.deb
    RUN apt-get update -q
    RUN apt-get install -qy puppet-common
    ENV FACTER_HOSTNAME database42
    ADD ./site.pp /puppet/site.pp
    RUN puppet apply site.pp
    ‘’’

    其实两者在实现上没有本质上的区别,但是很多人肯定会问,它们之间的本质区别到底在那里?
    这里有一个理解,那就是Puppet,到底用来做什么?

    更多的时候:Puppet是用来做系统初始化的工作。那么,更多的运维变更,都是交给其它工具来完成。因此,在这里我们就不难理解两者的差异了。

    利用Dockerfile安装启动Puppet来做系统初始化,例如:sshd、syslogd、crond等等,这些又有什么用呢?Docker images本身就已经实现了基础信息的标准化。

    在Container中能使用Puppet做变更管理吗?答案是肯定的。但是,我没有这么做过,我也不清楚是否有人这么实现。因此这么做,会带来外部管理Container中Puppet agent的问题,难道你想全采用Dockerfile来管理吗?

    总结:其实说了这么说,只有一句话:”利用Puppet安装管理Docker,剩下的事情交给Dockerfile”。

    PPT地址:http://www.slideshare.net/PuppetLabs/2014-0819puppetcampchicago-1?qid=457b9364-17ab-42d9-b0ca-22544ce8dfcd&v=qf1&b=&from_search=10

    最后请各位推荐并关注本人公众账号:

    文章目录
    1. 1. 利用Puppet安装Docker
  • 安装docker
  • download the registry image
  • don’t download all ubuntu,
  • just ‘precise’
  • Run containers
  • 编写Dockerfile
  • 编写Dockerfile