前回はvagrant上のdockerにansible-containerを使ってdockerコンテナを作成しましたが、今回はvagrant上のdockerにdocker-composeを使ってdockerコンテナを立ち上げます。
ansible-containerはdocker apiを必要とするのに対して、docker_serviceはsshで起動できるので、こちらの方がportなどの管理が楽です。
docker-composeはansibleのdocker_serviceを使って起動します。
ポイントはdockerをインストールしたサーバにdocker-composeをインストールすることと、docker-compose.ymlファイルをdockerがインストールしているサーバに転送することです。
環境
- vagrant
- ansible 2.4(2.3は要注意)
ソースコード
├── docker-compose-install.yml
├── docker-install.yml
├── docker-service.yml
├── hosts
├── site.yml
├── Vagrantfile
└── transfer
├── docker-compose.yml
└── db
├── Dockerfile
└── conf
└── custom.cnf
Vagrant.configure("2") do |config|
config.vm.box = "centos72"
config.vm.network "private_network", ip: "192.168.33.10"
end
[vagrants]
192.168.33.10 ansible_ssh_user=vagrant ansible_ssh_private_key_file=.vagrant/machines/default/virtualbox/private_key
- import_playbook: docker-install.yml
- import_playbook: docker-compose-install.yml
- import_playbook: docker-service.yml
- hosts: vagrants
user: vagrant
become: yes
tasks:
- name: install yum-utils
yum: name=yum-utils state=present
- name: add docker repo
shell: "yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo"
args:
chdir: "/etc/yum.repos.d"
creates: docker-ce.repo
- name: install docker-ce
yum: name=docker-ce state=present
- name: Docker グループにユーザー追加
user: name=vagrant groups=docker append=yes
tags: dockerhost
become: True
- name: restart docker
systemd:
name: docker.service
state: restarted
daemon_reload: yes
enabled: yes
ポイントはdocker-pyをインストールしないことです。
もうひとつのポイントは、ansible2.3とdocker-compose 1.16は相性問題があるのも要注意です。
詳しくはansibleでdocker_serviceを使った時に Error: cannot import name splitdrive が出た時の対応にまとめました。
- name: "install docker-compose"
hosts: vagrants
user: vagrant
become: yes
tasks:
- name: Installing packages
action: "{{ ansible_pkg_mgr }} pkg={{ item }} state=present"
with_items:
- python-setuptools
- name: Installing dependencies
easy_install:
name: pip
# - name: "install docker-py"
# pip:
# name: "docker-py"
# version: 1.7.1
# state: present
- name: Installing docker compose
pip:
name: docker-compose
# ansible 2.3 と docker-compose 1.16 は 相性問題がある
#version: 1.15.0
state: present
ここのポイントはファイルをdockerがインストールされているvagrantに転送していることです。
project_src は転送先の絶対パスにしました。
- name: "docker service execute"
hosts: vagrants
user: vagrant
become: yes
vars:
ansible_python_interpreter: python2
tasks:
- name: copy docker-compose file
copy: src=./transfer dest=/home/vagrant
- name: "Up db server"
docker_service:
project_src: "/home/vagrant/transfer"
state: present
よくあるdocker-compose.ymlファイルです。
version: '2'
services:
db:
build: ./db
image: sample/db:1.0.0
container_name: sample-db
privileged: true
environment:
MYSQL_ROOT_PASSWORD: "password"
volumes:
- ./data/mysql:/var/lib/mysql
FROM mysql:5.7.17
COPY ./conf/custom.cnf /etc/mysql/mysql.conf.d/custom.cnf
[mysqld]
transaction-isolation = READ-COMMITTED
character-set-server = utf8mb4
collation-server = utf8mb4_bin
skip-character-set-client-handshake
実行
$ vagrant up
$ ansible-playbook -i hosts site.yml
確認
MySQL Workbenchでtcp over SSHで接続して確認します。
これでdocker上のMySQLに接続確認ができました。
ansible-containerはより、こっちの方が楽ですね。