Docker on Vagrant on Ubuntu on VirtualBoxにCentOS7.1の開発環境を構築する

# Docker on Vagrant on Ubuntu on VirtualBoxにCentOS7.1の開発環境を構築する

## 前提

前回の下記の記事の続きになります。

[Ansible - Docker on Vagrant on Ubuntu on VirtualBoxのLAMP(LAPP)開発環境を構築する - Qiita](http://qiita.com/sadapon2008/items/0a8613a95eb3539cebcc)

前回のCentOS6と同様にApache+PHP+PostgreSQLのLAPP開発環境をCentOS7.1で構築してみます。
なお今回のDockerfileはこちらを参考にしました。

[Docker Hub | centos](https://hub.docker.com/_/centos/)

## 準備

今回は以下のようなディレクトリ構成を準備します。ここでは、fooユーザ(パスワードもfoo)を作成し、コンテナ内の「/vagrant」以下にApacheとPostgreSQLのデータを保存するようにしてみます。コンテナ内の「/vagrant」は「vm2/data」とリンクしているため、ホストからSamba経由でここにアクセスすることでソースの編集などが可能です。(PostgreSQLのユーザとパスワードはpostgresとpostgresになります。)

```
└── vm2
    ├── build
    └── data
```

## Vagrantfile

「vm2/Vagrantfile」を以下の内容で作成します。前回と異なるのは「ip_alias_index」、「ip_alias_address」あたりとDocker Providerの設定内容になります。

```
ip_alias_dev = "eth1"
ip_alias_index = "2"
ip_alias_address = "192.168.77.202"
ip_alias_netmask = "24"

Vagrant.configure("2") do |config|
  config.vm.synced_folder "./data", "/vagrant"
  config.vm.provider "docker" do |d|
    d.name = "vm2"
    d.build_dir = "./build"
    d.cmd = [ "/usr/lib/systemd/systemd" ]
    d.has_ssh = true
    d.ports = []
    for p in [ 22, 80, 443, 3306, 5432 ] do
      d.ports.push(ip_alias_address + ":" + p.to_s + ":" + p.to_s)
    end
    d.create_args = ["--privileged"]
    d.volumes = ["/sys/fs/cgroup:/sys/fs/cgroup:ro"]
  end
  config.trigger.before [:up] do
    info 'Setting up ip alias ' + ip_alias_dev + ':' + ip_alias_index + ' ' + ip_alias_address + '/' + ip_alias_netmask
    cmd = '/sbin/ip addr show ' + ip_alias_dev + ' >/dev/null 2>&1 && ((/sbin/ip addr show ' + ip_alias_dev + ' | grep -F \'inet ' + ip_alias_address + '/' + ip_alias_netmask + '\' >/dev/null 2>&1) || /usr/bin/sudo /sbin/ip addr add ' + ip_alias_address + '/' + ip_alias_netmask + ' dev ' + ip_alias_dev + ' label ' + ip_alias_dev + ':' + ip_alias_index + ')'
    `#{cmd}`
  end
  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "playbook.yml"
    ansible.extra_vars = {
      main_username: 'foo',
      main_password: `openssl passwd -salt salty -1 foo`,
      docroot: '/vagrant/www/html/htdocs',
      cake_env_mode: 'development',
      dbroot: '/vagrant/lib/pgsql/9.4',
      permit_network: '192.168.77.0/24'
    }
  end
end
```

## Dockerfile

「vm2/build/Dockerfile」を以下の内容で作成します。

```
FROM centos:centos7.1.1503
MAINTAINER sadapon2008 <sadapon2008@gmail.com>
ENV container docker

RUN echo 'include_only=.jp' >>/etc/yum/pluginconf.d/fastestmirror.conf

RUN yum -y swap -- remove fakesystemd -- install systemd systemd-libs
RUN yum -y update; yum clean all; \
(cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;

RUN yum -y install rsyslog

RUN echo -n 'root:vagrant' | chpasswd

RUN groupadd -g 500 vagrant
RUN useradd -g vagrant -u 500 vagrant
RUN echo -n 'vagrant:vagrant' | chpasswd

RUN mkdir -p /home/vagrant/.ssh
RUN echo 'ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key' > /home/vagrant/.ssh/authorized_keys
RUN chown -R vagrant:vagrant /home/vagrant/.ssh
RUN chmod 700 /home/vagrant/.ssh
RUN chmod 600 /home/vagrant/.ssh/authorized_keys

RUN yum -y install sudo
RUN echo 'vagrant ALL=(ALL) NOPASSWD:ALL' >>/etc/sudoers.d/vagrant

RUN yum -y install openssh-server openssh-clients initscript
RUN sed -ri 's/^#AddressFamily any/AddressFamily inet/' /etc/ssh/sshd_config
RUN sed -ri 's/^#UseDNS yes/UseDNS no/' /etc/ssh/sshd_config
RUN sed -ri 's/^GSSAPIAuthentication yes/GSSAPIAuthentication no/' /etc/ssh/sshd_config
RUN sed -ri 's/^UsePrivilegeSeparation sandbox/UsePrivilegeSeparation no/' /etc/ssh/sshd_config
RUN sed -ri 's/^UsePAM yes/UsePAM no/' /etc/ssh/sshd_config
RUN systemctl enable sshd.service

RUN yum -y clean all

EXPOSE 22

VOLUME ["/sys/fs/cgroup"]

CMD ["/usr/lib/systemd/systemd"]
```

## playbook.yml

まず拙作のリポジトリからロールをcloneします。

```
$ sudo apt-get -y install git
$ cd ~/vm2
$ git clone https://github.com/sadapon2008/ansible-roles roles
```

「vm2/playbook.yml」を以下の内容で作成します。

```
---
- name: for
  hosts: all
  sudo: yes
  roles:
    - { role: centos7-docker-common, main_username: "{{ main_username }}", main_password: "{{ main_password }}" }
    - { role: centos7-apache, main_username: "{{ main_username }}", docroot: "{{ docroot }}", cake_env_mode: "{{ cake_env_mode }}" }
    - { role: centos7-remi-php56 }
    - { role: centos7-pgdg-postgresql94, dbroot: "{{ dbroot }}", permit_network: "{{ permit_network }}" }
```

## コンテナ起動とプロビジョニング

「vagrant up --provider=docker」するとプロビジョニングも実行されます。

```
$ cd ~/vm2
$ vagrant up --provider=docker
```

プロビジョニングが成功すると、ホストのブラウザなどから「 http://192.168.77.202/ 」にアクセスしたり、pgAdmin IIIなどで192.168.77.202:5432にアクセスしたりできます。sshもアクセス可能です。