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.
tasks:    - 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    yum:     name: python-docker     enablerepo: extras     state: latest    when: ansible_os_family == 'RedHat'  - name: Install python-docker on Debian based distribution    apt:      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      docker_container:        name: "{{ name }}"        image: "{{ image }}"        ports:          - "{{ src_port }}:{{ dest_port }}"        volumes:          - "{{ 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
[Unit] Description={{ name }} Docker Container Requires=docker.service After=docker.service [Service] Restart=always ExecStart=/usr/bin/docker start -a {{ name }} ExecStop=/usr/bin/docker stop -t 2 {{ name }} [Install] WantedBy=default.target
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     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