docker 環境を ansible で構築する(centos7を対象)

# 概要

centos7 上に docker 環境を構築する playbook (ansible の設定ファイル）を作成しました。
docker0 インタフェースのIPアドレス帯の指定や、docker の root ディレクトリの変更といった、実運用で気にしたい項目の設定を含んでいます。

## インストールするツール

* docker-engine
* docker-compose
* command completion

## 設定しているもの

* docker コンテナのIPアドレス帯
* docker の root ディレクトリ
* private registry server の自己証明書（docker hub しか使わない、または private registry server に正当な証明書を導入している場合は不要）

# 準備

## ansible のインストール

ansible は yum でインストールできますが、バージョンが 1.9.4 になります。（2016/02 時点）
このバージョンは SNI に対応していないため、docker-compose などを WEB から取得する際にエラーになります。 

ansible v2、および python 2.7.9 以上が必要です。
インストール方法は[こちら](http://qiita.com/sugiyasu-qr/items/db25c5233d98f4fd5e63)を参考にしてください。


# ディレクトリ構成

```
playbook.yml   ※playbook
hosts          ※hosts 一覧（localhost のみ指定）
docker.repo    ※docker repository の設定ファイル
option.conf    ※docker の起動オプション指定ファイル
```

# ファイル詳細

## playbook.yml

```yaml
- hosts: all
  connection: local
  environment:
    https_proxy: "{{ lookup('env', 'https_proxy') }}"
  tasks:
    - name: Yum update packages
      yum:
        name: "*"
        state: latest
    - name: Set docker repo
      copy:
        src: docker.repo
        dest: /etc/yum.repos.d/docker.repo
        owner: root
        group: root
        mode: 0755
    - name: Install docker
      yum:
        name: docker-engine
        state: present
    - name: docker setting mkdir
      file: 
        path: /etc/systemd/system/docker.service.d
        state: directory
        owner: root
        group: root
        mode: 0755
    - name: docker setting option file
      copy:
        src: option.conf
        dest: /etc/systemd/system/docker.service.d/option.conf
    - name: set ansible_python_interpreter
      set_fact: ansible_python_interpreter="/opt/python/bin/python"
    - name: Get docker-compose
      get_url:
        url: "https://github.com/docker/compose/releases/download/1.5.1/docker-compose-{{ansible_system}}-{{ansible_machine}}"
        dest: /usr/local/bin/docker-compose
      register: get_compose
    - name: chmod docker-compose
      file:
        path: /usr/local/bin/docker-compose
        mode: "a+x"
      when: get_compose.changed
    - name: Get docker-compose ver
      shell: docker-compose --version | awk 'NR==1{print $NF}'
      register: docker_compose_ver
      changed_when: false
    - name: Install command completion
      get_url:
        url: "https://raw.githubusercontent.com/docker/compose/{{docker_compose_ver.stdout}}/contrib/completion/bash/docker-compose"
        dest: /etc/bash_completion.d/docker-compose
    # private docker registry の証明書設定: ディレクトリ作成
    - name: Set self-signed certificate mkdir
      file:
        path: /etc/docker/certs.d/your_private_registry_host:your_private_registry_port/
        state: directory
        owner: root
        group: root
        mode: 0755
    # private docker registry の証明書設定: 証明書を配置　※ここでは wget で取得可能としている
    - name: Set self-signed certificate get crt
      get_url:
        url: your_self_cert_url
        dest: /etc/docker/certs.d/your_private_registry_host:your_private_registry_port/ca.crt
      notify: restart docker
    - name: Start docker daemon
      service:
        name: docker
        state: started
        enabled: yes
  handlers:
    - name: restart docker
      service:
        name: docker
        state: restarted
```

* your_private_registry_host:your_private_registry_port は、private registry server のパスに変更してください。
* your_self_cert_url は、自己証明書のパスに変更してください。



## hosts

```
localhost
```

本記事ではローカルホストに docker をインストールします。

## docker.repo

```
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
```

docker 公式サイトから持ってきただけです。

## option.conf

```
[Service]
Environment="http_proxy=http://<プロキシサーバのIP>:<ポート>/"
Environment="https_proxy=http://<プロキシサーバのIP>:<ポート>/"
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// -g /data/docker --bip="172.100.42.1/16"
```

* docker の root ディレクトリを /data/docker に指定しています。root ディレクトリ以下にはイメージファイルなどが蓄積されるため、容量が大きくなります。※デフォルトは /var/lib/docker 
* docker コンテナの IP アドレス帯を指定しています。指定しておかないと、社内ネットワークのIPアドレス帯と競合したりします。競合すると、ホストマシンと対象ネットワークの通信ができなくなります。


# playbook を実行

root で実行します。

```bash
$ ansible-playbook -i hosts playbook.yml
```

実行後、docker ps と打って応答があれば成功です。

root 以外のユーザで docker を使用したい場合、当該ユーザを docker グループに入れてください。


# お試し環境を構築する Vagrantfile

上記を実行するための、centos7 ansible2.0 環境を構築する Vagrantfile を[こちら](http://qiita.com/sugiyasu-qr/items/cd9690d937be1a3bfaf9)に公開しています。



# 感想

ansible は始めて使いましたが、敷居はとても低いですね。localhost 一台でも使えますし、簡単な構成ならすぐに作れちゃいます。