Skip to content

Instantly share code, notes, and snippets.

@mapk0y
Last active July 13, 2020 06:46
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mapk0y/3dd5d270e9c058ef3ab9 to your computer and use it in GitHub Desktop.
Save mapk0y/3dd5d270e9c058ef3ab9 to your computer and use it in GitHub Desktop.
docker v1.10 から追加される docker run 時の ip指定オプションに関して

version の確認

jessie:~# docker version
Client:
 Version:      1.10.0-dev
 API version:  1.22
 Go version:   go1.5.3
 Git commit:   7a44265
 Built:        Thu Jan 14 20:52:45 2016
 OS/Arch:      linux/amd64
 Experimental: true

Server:
 Version:      1.10.0-dev
 API version:  1.22
 Go version:   go1.5.3
 Git commit:   7a44265
 Built:        Thu Jan 14 20:52:45 2016
 OS/Arch:      linux/amd64
 Experimental: true

デフォルトネットワークの IP の確認

jessie:~# docker network ls
NETWORK ID          NAME                DRIVER
1b32fa4cd468        none                null                
5e4199bd6c79        host                host                
d63290b470a4        bridge              bridge              
jessie:~# docker network inspect -f '{{ .IPAM.Config }}' bridge
[{172.17.0.0/16   map[]}]

172.17.0.0/16 だとわかる

172.17.0.0/16 の範囲で IP を指定して実行

jessie:~# docker run -it --rm --ip=172.17.0.30 debian 
docker: Error response from daemon: network default not found.
jessie:~# # Network を指定
jessie:~# docker run -it --rm --ip=172.17.0.30 --net=bridge debian 
docker: Error response from daemon: User specified IP address is supported on user defined networks only.

作った Network じゃないとダメな模様

Network の作成

jessie:~# docker network create b0
c3571183a425c426f37a3da35912689e9e7eb1c5411588344076272d13fe97fd
jessie:~# docker network ls
NETWORK ID          NAME                DRIVER
5e4199bd6c79        host                host                
d63290b470a4        bridge              bridge              
c3571183a425        b0                  bridge              
1b32fa4cd468        none                null                
jessie:~# docker network inspect -f '{{ .IPAM.Config }}' b0
[{   map[]}]
jessie:~# ip a 
~~snip~~
11: br-c3571183a425: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:cc:04:57:85 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 scope global br-c3571183a425
       valid_lft forever preferred_lft forever

ip を指定しないと inspect ではわからないので ip addr show(ip a) で確認

172.18.0.0/16 の範囲で IP を指定して実行

jessie:~# docker run -it --rm --ip=172.18.0.30 --net=b0 debian 
docker: Error response from daemon: User specified IP address is supported only when connecting to networks with user configured subnets.

IP範囲を指定したネットワークじゃダメっぽい

IP範囲を指定したネットワークの作り直し

jessie:~# # 今回は削除して
jessie:~# docker network rm b0
jessie:~# # 作り直し
jessie:~# docker network create --subnet=172.18.0.0/16 b0
07395c268eba278279125ec802be118493bdab81e6c1661429bba496e001ca2a
jessie:~# docker network inspect -f '{{ .IPAM.Config }}' b0
[{172.18.0.0/16   map[]}]

172.18.0.0/16 の範囲で IP を指定してもっかい実行

jessie:~# docker run -it --rm --ip=172.18.0.30 --net=b0 debian 
root@4f7c2cc51f9a:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
13: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:12:00:1e brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.30/16 scope global eth0
       valid_lft forever preferred_lft forever

良い感じ(上記に追加して --net=bridge としてデフォの bridge を指定することは出来なかった)

以下 docker network の挙動だが -p を使った時の挙動

jessie:~# docker run -it --rm -p 80:80 --ip=172.18.0.30 --net=b0 debian 
# 別コンソール
jessie:~# iptables -L DOCKER -n
Chain DOCKER (3 references)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            172.18.0.30          tcp dpt:80

ちゃんと設定されてる。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment