在 Puppet Blog 提到一篇「The challenges of container configuration」怎麼用 Puppet 來佈署 Docker images
裡面主要是透過 image_build 這個 module 讓 Puppet 支援 docker,這篇講的是 build Docker image 的方式
使用 module install image_build
$ puppet module install puppetlabs/image_build
實作 Docker by puppet
以 nginx 為例
檔案結構會像這樣:
nginx ├── manifests │ └── init.pp ├── metadata.yaml └── Puppetfile
manifests/init.pp 就是用 Puppet 寫 nginx 的安裝方式
Service { provider => dummy } class { 'nginx': } nginx::resource::vhost { 'default': www_root => '/var/www/html', } file { '/var/www/html/index.html': ensure => present, content => 'Hello Puppet and Docker', } exec { 'Disable Nginx daemon mode': path => '/bin', command => 'echo "daemon off;" >> /etc/nginx/nginx.conf', unless => 'grep "daemon off" /etc/nginx/nginx.conf', }
而 Docker metadata 的部份則要寫在 metadata.yaml
cmd: nginx expose: 80 image_name: puppet/nginx
相依性的 module 是用 Puppetfile 處理
forge 'https://forgeapi.puppetlabs.com' mod 'jfryman/nginx' mod 'puppetlabs/stdlib' mod 'puppetlabs/concat' mod 'puppetlabs/apt' mod 'puppetlabs/dummy_service'
然後就可以 build Docker
$ puppet docker build
如果你沒有安裝 image_build 的話,puppet 不支援 docker 這個 subcommand
查看是不是真的有 build 起來
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE puppet/nginx latest e6000c720ef3 39 minutes ago 356.6 MB
Puppet 也可以輸出 Dockerfile
$ puppet docker dockerfile > Dockerfile
Puppet 跑 Docker run
$ puppet docker
除此之外還有 tag、expose、volume … 等等,Docker 有的在 image_build 都有支援,而且也能用 Hiera 存放 data
除了 image_build,另一個 puppetlabs-docker_platform 也是用來管理 Docker,支援 cluster、compose、registry。