DEV Community

Pierangelo
Pierangelo

Posted on

Docker Nginx with Chef Server

In the last couple of weeks, I started to study Chef; install Docker with Chef was one of my first steps into the wide world of server automation.

From your chef-server you must download your chef-repo.

Go inside the chef-repo folder and generate a cookbook named mydocker:

generate cookbook cookbooks/mydocker
Enter fullscreen mode Exit fullscreen mode

edit the file metadata.rb in cookbooks/mydocker/ and add this:

depends 'docker', '~> 2.0'
Enter fullscreen mode Exit fullscreen mode

in cookbooks/mydocker/recipes edit the file default.rb and add this:

docker_service 'default' do
  action [:create, :start]
end


# Pull latest image
docker_image 'nginx' do
  tag 'latest'
  action :pull
end


# Run container exposing ports
docker_container 'my_nginx' do
  repo 'nginx'
  tag 'latest'
  port '80:80'
  volumes "/home/docker/default.conf:/etc/nginx/conf.d/default.conf:ro"
  volumes "/home/docker/html:/usr/share/nginx/html"
end

# create file default.conf for volumes doccker
template "/home/docker/default.conf" do
  source "default.conf.erb"
  #notifies :reload, "service[default]"
end

# create file index.html for volumes docker
template '/home/docker/html/index.html' do
  source 'index.html.erb'
  variables(
    :ambiente => node.chef_environment
  )
  action :create
  #notifies :restart, 'service[httpd]', :immediately
end
Enter fullscreen mode Exit fullscreen mode

Now we must create two template named index.html.erb and default.conf.erb

chef generate template index.html
Enter fullscreen mode Exit fullscreen mode
chef generate template default.conf
Enter fullscreen mode Exit fullscreen mode

edit index.html.erb in /cookbooks/mydocker/templates

<html>
  <body>
    <h1>Hello, World!</h1>
    <h3>HOSTNAME: <%= node['hostname'] %></h3>
    <h3>IPADDRESS: <%= node['ipaddress'] %></h3>
    <p><hr></p>
    <h3>ENVIRONMENT: <%= @ambiente %></h3>
</body>
</html>
Enter fullscreen mode Exit fullscreen mode

edit default.conf in /cookbooks/mydocker/templates:

server {
    listen       80;
    server_name  localhost;
    #ssl
    # ssl    on;
    #ssl_certificate    /etc/nginx/ssl/nginx.crt;
    #ssl_certificate_key    /etc/nginx/ssl/nginx.key;
    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    #error_page  404              /404.html;
    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}
    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
    }
Enter fullscreen mode Exit fullscreen mode

link the cookbook to the node (your machine…)

knife node run_list add docker1 "recipe[mydocker]"
Enter fullscreen mode Exit fullscreen mode

(for know how connect chef to your server take a look here)

Now from inside the mydocker (/cookbooks/mydocker) folder we can upload the new cookbook on the chef-server:

berks install
Enter fullscreen mode Exit fullscreen mode
berks upload
Enter fullscreen mode Exit fullscreen mode

Now, you can go on your server, and launch chef-client for update your machine with the new configuration.

sudo chef-client
Enter fullscreen mode Exit fullscreen mode

Good Luck!

Top comments (0)