How to Create Docker container using Ansible

How to Create Docker container using Ansible

Ansible and Docker getting occupy vest place in DevOps environment and getting more famous now a day. Let’s see how to create a docker container using ansible.

Let’s start our playbook by giving it a name of Creating Docker Container. This playbook will be executed on host localhost with connection type as local using user root. You can change it based on your requirement.

- name: Creating Docker Container
  hosts: localhost
  connection: local 
  remote_user: root

Start with our tasks. First one is to include our variables. This will make this playbook more generic.

    - name: include variables
      include_vars: vars.yml

Lets have a look at the vars.yml file

image: motoskia/apache-php 
name: andoc-web
src_port: 81
dest_port: 80 
src_vol: /mnt/www 
dest_vol: /var/www/html

privileged: true

This is just an example; you can modify it based on your requirement. Below is the description about each varialbes;

  • motoskia/apache-php docker images will be used, which is based on CentOS+Apache2+PHP5+mod_ssl
  • name of the container will be andoc-web
  • port 81 from host running the container will be forwarded to port 80 of container.
  • port 443 from host running the container will be forwarded to port 443 of container.
  • folder /mnt/www from the host will be mapped as /var/www/html in the container. This will make you web-root persistent.

Next task will install python-docker to support docker modules available with Ansible 2.2

  - name: Install python-docker on Red Hat based distribution
     name: python-docker
     enablerepo: extras
     state: latest
    when: ansible_os_family == 'RedHat'
  - name: Install python-docker  on Debian based distribution
      name: python-docker
      update_cache: yes
    when: ansible_os_family == 'Debian'

docker_container module we can use it to create container. And using the variable defined in the vars.yml file

    - name: Create Container
        name: "{{ name }}"
        image: "{{ image }}"
          - "{{ src_port }}:{{ dest_port }}"
          - "{{ src_vol }}:{{ dest_vol }}"
        privileged: "{{ privileged }}"

I would recommend to refer docker-container module document to know more about it and what else it can do.

# ansible-doc docker_container

That’s not it, how about creating a systemd service and starting our container with system boot. For this I have used Jinja2 templates.

This is a jinja2 systemd unit file template.

# cat systemd.j2

Description={{ name }} Docker Container 
ExecStart=/usr/bin/docker start -a {{ name }} 
ExecStop=/usr/bin/docker stop -t 2 {{ name }}

We use template module in ansible to create this unit file using the name variable defined in vars.yml

  - name: Create Systemd Unit File as docker-{{ name }}.service
      template: src=systemd.j2 dest=/etc/systemd/system/docker-{{ name }}.service
  - name: reload systemd daemon
    command: systemctl daemon-reload

Next task will enable this service and start it, which should also start our container.

   - name: Start & Enable docker-{{ name }} service
       name: docker-{{ name }}
       state: started
       enabled: yes

And finally print the docker ps output

    - name: check container status
      command: docker ps
      register: result
    - debug: var=result.stdout

Refer our Repo for complete playbook

How to Run

# ansible-playbook playbook.yml

Learn More : How to write Ansible playbook