Introduction

備忘録。

Resolution

そのものずばりな記事がこちら。すごく丁寧。

ネットワークを作成

ここが大事。
既定のネットワークであるBridgeでは固定IPが使えない。

1
$ docker network create --subnet=<ネットワークアドレス>/<サブネットマスク> <新しいネットワーク名> 

1
$ docker network create --subnet=172.16.0.0/16 mynet

作成したネットワークは下記で確認。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
a4a7dc12da84 bridge bridge local
b2e97ac5fc42 host host local
ecaf2a1b55d3 mynet bridge local
c6d5386a2054 none null local

$ docker network inspect mynet
[
{
"Name": "mynet",
"Id": "ecaf2a1b55d3be072f58c5629e0a0b5081af0769a43fb40824f032e5361f9355",
"Created": "2018-11-10T13:28:59.340134Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.16.0.0/16"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]

ネットワークに追加

コンテナ実行時にネットワークを指定してIPも指定します。
当然、IPはネットワークで指定したネットワークアドレスの範囲内であること。

例えば下記のように指定します。

1
2
3
4
5
6
7
8
$ docker run --name mysql ^
-e MYSQL_ROOT_PASSWORD=password ^
-d ^
-v /d/virtualMachines/docker/volume/mysql:/var/lib/mysql ^
-p 3306:3306 ^
--net=mynet ^
--ip=172.16.0.2 ^
mysql:5.7

–netを省略すると、下記のように怒られます。

1
docker: Error response from daemon: user specified IP address is supported on user defined networks only. 

ネットワークの確認

コンテナの中に入って確認してみます。

1
2
3
4
5
6
7
8
9
$ docker exec -it mysql /bin/bash
# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.16.0.2 4055c6c61419

dockerコンテナの既定のIPアドレスは172.17.0.0/16なので、きちんと変わっていますね。

疎通確認

コンテナ起動時にポート転送設定(-p オプション)がしてあるなら、ホストOSからでもつながります。
逆に設定がしていないなら、同一のdockerネットワークを経由しないとつながらなくなります。