Top Banner
Bootstrapping containers with confd Michael Richardson @m_richo
34

bootstrapping containers with confd

Feb 12, 2017

Download

Technology

m_richardson
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: bootstrapping containers with confd

Bootstrapping containers with

confd

Michael Richardson @m_richo

Page 2: bootstrapping containers with confd

Who’s heard of

Page 3: bootstrapping containers with confd

Common methods for configuring containers

Page 4: bootstrapping containers with confd

Common methods for configuring containers

1.Environment variables2.Data volumes3.External Systems

Page 5: bootstrapping containers with confd

1. Environment variables

Page 6: bootstrapping containers with confd

1. Environment variables

docker run -d --hostname my-rabbit \--name some-rabbit \-e RABBITMQ_DEFAULT_USER=user \-e RABBITMQ_DEFAULT_PASS=password \-e RABBITMQ_DEFAULT_VHOST=my_vhost \rabbitmq:3-management

Page 7: bootstrapping containers with confd

1. Environment variables

docker run -d --hostname my-rabbit \--name some-rabbit \-e RABBITMQ_DEFAULT_USER=user \-e RABBITMQ_DEFAULT_PASS=password \-e RABBITMQ_DEFAULT_VHOST=my_vhost \rabbitmq:3-management

Page 8: bootstrapping containers with confd

1. Environment variables

• super easy to set

• Most applications are configured by config files rather than env vars.

Page 9: bootstrapping containers with confd

2. Data volumes

Page 10: bootstrapping containers with confd

2. Data volumesdocker run -d \--name some-nginx \-v /some/nginx.conf:/etc/nginx/nginx.conf:ro nginx

Page 11: bootstrapping containers with confd

2. Data volumesdocker run -d \--name some-nginx \-v /some/nginx.conf:/etc/nginx/nginx.conf:ro nginx

Page 12: bootstrapping containers with confd

2. Data volumes• easily pass any configuration files

from docker host to containers.

• Doesn’t scale too well

Page 13: bootstrapping containers with confd

3. External Systems

Page 14: bootstrapping containers with confd

3. External Systems

Page 15: bootstrapping containers with confd

3. External Systems

• Strong feature list and benefits

• More complexity

Page 16: bootstrapping containers with confd

What do I want?

Page 17: bootstrapping containers with confd

What do I want?

Simple method to set config files when

bootstrapping containers

Page 18: bootstrapping containers with confd

What do I want?

Simple method to set config files when

bootstrapping containers

Page 19: bootstrapping containers with confd

Say hi to

confd

Page 20: bootstrapping containers with confd

confdUses templates and data to render local configuration files.

https://github.com/kelseyhightower/confd

Page 21: bootstrapping containers with confd

confdSource of data• etcd• consul• dynamodb• Redis• Zookeeper• environment variables

Page 22: bootstrapping containers with confd

confdSource of data• etcd• consul• dynamodb• Redis• Zookeeper• environment variables

Page 23: bootstrapping containers with confd

Confd exampleconfd Nginx template /etc/confd/templates/nginx.conf.tmpl

server { server_name {{ getenv "proxy_domain" }}; location / { proxy_pass http://{{ getenv "backend_host" }}; proxy_redirect off; }}

Page 24: bootstrapping containers with confd

Confd exampleconfd Nginx config/etc/confd/conf.d/nginx.conf.toml

[template]src = "proxy.conf.tmpl”dest = "/etc/nginx/conf.d/proxy.conf”

Page 25: bootstrapping containers with confd

Confd example$ export proxy_domain=mydomain$ export backend_host=www.mricho.com$ /usr/local/bin/confd -onetime -backend env

$ cat /etc/nginx/conf.d/proxy.confserver { server_name mydomain; location / { proxy_pass http://www.mricho.com; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}

Page 26: bootstrapping containers with confd

Confd example$ export proxy_domain=mydomain$ export backend_host=www.mricho.com$ /usr/local/bin/confd -onetime -backend env

$ cat /etc/nginx/conf.d/proxy.confserver { server_name mydomain; location / { proxy_pass http://www.mricho.com; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}

Page 27: bootstrapping containers with confd

Confd appied to containers

Page 28: bootstrapping containers with confd

Confd appied to containers1. Install confd binary to docker images (Dockerfile)2. Add confd templates and config to docker images (Dockerfile)3. Create a bootstrap script for your container at runtime

Page 29: bootstrapping containers with confd

Confd appied to containers1. Install confd binary to docker images (Dockerfile)2. Add confd templates and config to docker images (Dockerfile)3. Create a bootstrap script for your container at runtime

#!/bin/bashset -e export proxy_domain=${proxy_domain:-$HOSTNAME}test $backend_host

/usr/local/bin/confd -onetime -backend env

echo "Starting Nginx”exec /usr/sbin/nginx -c /etc/nginx/nginx.conf

Page 30: bootstrapping containers with confd

Confd appied to containers1. Install confd binary to docker images (Dockerfile)2. Add confd templates and config to docker images (Dockerfile)3. Create a bootstrap script for your container at runtime4. Run a container

docker run -it -p 80:80 \-e proxy_domain=mydomain \-e backend_host=www.mricho.com \confd-test

Page 31: bootstrapping containers with confd

More than ‘strings’

Page 32: bootstrapping containers with confd

More than ‘strings’upstream backend_hosts {{{ $nodes := split (getenv "app_servers") ":" }}{{range $nodes}} server {{.}};{{end}}}

app_servers="myapp01.local:myapp02.local:myapp03.local:myapp04.local"

upstream backend_hosts { server myapp01.local; server myapp02.local; server myapp03.local; server myapp04.local;}

Page 33: bootstrapping containers with confd

confd

Configure container config files at runtime

with environment variables