前回はdocker for macにansible-containerを使ってdockerコンテナを作成しましたが、今回はvagrant上のdockerにdockerコンテナを立ち上げます。
ポイントはdocker apiを使っているので、ホストからvagrantのdockerにアクセスできるようにするところです。
環境
- vagrant
- ansible-container 0.9.2(0.9.1はうまくいかないので注意)
ansible-containerのインストール
$ pip install ansible-container[docker]
ソースコード
作成するのは以下のファイルです。
- Vagrantfile
- hosts
- docker.yml
- container.yml
Vagrantfile
Vagrant.configure("2") do |config|
config.vm.box = "centos72"
config.vm.network "private_network", ip: "192.168.33.10"
end
hosts
[vagrants]
192.168.33.10 ansible_ssh_user=vagrant ansible_ssh_private_key_file=.vagrant/machines/default/virtualbox/private_key
ホスト側からdocker apiにアクセスできるようにするため、
ansibleのreplaceコマンドでdocker.serviceを編集しています。
How do I expose the docker API over TCP?
replace: dest=/lib/systemd/system/docker.service regexp='^ExecStart.*$' replace='ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock' backup=yes
設定をしていないと以下のようなエラーが出ました。
192:ansible-container-remote us$ ansible-container build
ERROR The connection to Docker was refused. Check your Docker environment configuration.
docker.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: replace ExecStart
replace: dest=/lib/systemd/system/docker.service regexp='^ExecStart.*$' replace='ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock' backup=yes
- name: restart docker
systemd:
name: docker.service
state: restarted
daemon_reload: yes
enabled: yes
container.yml
version: "2"
settings:
conductor_base: centos:7
services:
db:
from: "mysql:latest"
ports:
- "13306:3306"
environment:
MYSQL_MAJOR: 5.7
MYSQL_VERSION: 5.7.17
MYSQL_DATABASE: sample
MYSQL_USER: sample
MYSQL_PASSWORD: password
MYSQL_ROOT_PASSWORD: password
registries: {}
実行
2つ目のポイントです。
環境変数 DOCKER_HOST にdockerのipを設定しています。
$ vagrant up
$ export DOCKER_HOST="tcp://192.168.33.10:2375"
$ ansible-playbook -i hosts docker.yml
$ ansible-container build
$ ansible-container run
確認
MySQL Workbenchでtcp over SSHで接続して確認します。
これでdocker上のMySQLに接続確認ができました。
確認コマンド
$ curl -vvv http://192.168.33.10:2375/version
$ vagrant ssh
[vagrant@10 ~]$ docker exec -it ansiblecontainerremote_db_1 bash
[vagrant@10 ~]$ docker network ls
[vagrant@10 ~]$ docker network inspect ansiblecontainerremote_default
[vagrant@10 ~]$ docker logs ansiblecontainerremote_db_1