Dockerでdocker0ネットワークのIPアドレスを変更する

## **環境**
 - Dockerホストマシン: CentOS 7.2
 - Docker : version 1.12 

## **経緯**
Dockerのデフォルトのネットワーク`docker0`には初期設定だと`172.17.0.0/16`が設定されます。
今回Dockerホストマシンのネットワークアドレス帯に`172.x.0.0/16`を使っていたため、Dockerホストマシンにアクセス出来ない問題が発生していたので`docker0`の設定を変更する必要がありました。

## **やったこと**
### 1.Dockerの停止とネットワークの確認・破棄
Dockerが起動している場合にはDockerサービスを停止させます。

```
$ sudo systemctl stop docker   
$ sudo systemctl status docker
```

Dockerサービスが停止しているのを確認したら、現在のホストマシンのネットワーク設定を確認してみます。

```
$ route

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    100    0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
gateway         0.0.0.0         255.255.255.255 UH    100    0        

$ brctl show

bridge name	bridge id		STP enabled	interfaces
docker0		8000.024249a6703e	no		veth089452c
```

Dockerサービスを再起動するときのために一旦`docker0`のブリッジを破棄しておきます。

```
$ ip link set dev docker0 down
$ brctl delbr docker0
```


### 2.Docker起動時のオプション設定
ホストマシンがCentOS7なのでDockerはsystemd管理下にあります。
Dockerの起動時のオプションを設定するために`/lib/systemd/system/docker.service`の`ExecStart`設定を変更します
`Service`の設定内に`--bip`オプションを追記します。IPは都合のいい値に自由に変更できます。（ただしホストマシンのネットワークで使用していないIPに限ります。）

```docker.service

[Service]
Type=notify
NotifyAccess=all
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
Environment=GOTRACEBACK=crash
Environment=DOCKER_HTTP_HOST_COMPAT=1
Environment=PATH=/usr/libexec/docker:/usr/bin:/usr/sbin
ExecStart=/usr/bin/dockerd-current \
          --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
          --default-runtime=docker-runc \
          --exec-opt native.cgroupdriver=systemd \
          --userland-proxy-path=/usr/libexec/docker/docker-proxy-current \


↓

[Service]
Type=notify
NotifyAccess=all
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
Environment=GOTRACEBACK=crash
Environment=DOCKER_HTTP_HOST_COMPAT=1
Environment=PATH=/usr/libexec/docker:/usr/bin:/usr/sbin
ExecStart=/usr/bin/dockerd-current \
          --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
          --default-runtime=docker-runc \
          --exec-opt native.cgroupdriver=systemd \
          --userland-proxy-path=/usr/libexec/docker/docker-proxy-current \
          --bip=182.17.0.1/16 \
```

（追記）
`/lib/systemd/system/docker.service`を変更するのちょっと気持ち悪かったので別の方法探していたら`/etc/sysconfig/docker`に設定するのがよさそうでした。
下記のように追記すると上の方法と同じようにIPアドレスを変更できます。

```/etc/sysconfig/docker
OPTIONS="--bip=180.17.0.1/16"
```

### 3.Dockerの起動
Dockerを起動させます。 起動時のオプションを変更したのでdaemonを読み込み直しておきます。

```
$ sudo systemctl daemon-reload
$ sudo systemctl start docker
```

Dockerの起動後、設定した内容が反映されているか確認します。

```
$ route

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    100    0        0 eth0
180.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
gateway         0.0.0.0         255.255.255.255 UH    100    0        0 eth0 
```

## **注意点**
起動オプションで設定出来るのはいまのところ`docker0`の設定だけのようです。
`docker network create`実行時のIPアドレスの範囲を指定しておきたかったのですがいい方法が見つかりませんでした。
新しく自分でネットワーク作る際にIPアドレスなどを指定するコマンドは下記になります。
`docker network create --driver [brige|hostなど] --gateway=[IPアドレス] --subnet=[IPアドレス] [ネットワーク名]`

```
$ docker network create --driver bridge --gateway=180.18.0.1/16 --subnet=180.18.0.0/16 default_network
```

https://github.com/docker/docker/pull/29376
このようなPRが出ているのでそのうち実装されそうな気がしてます。

## **参考にした資料**
[Docker公式ドキュメント](http://docs.docker.jp/engine/reference/commandline/dockerd.html)
[【Docker】Bridge IPアドレスの変更でハマる](http://tigertaizo.hatenablog.com/entry/2016/08/06/173101)