デフォルトのDockerネットワーク
- デフォルトでは下記の3つのネットワークが自動作成される
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
f433f1dfac43 bridge bridge local
c2f065689fd5 host host local
b132c28e9f49 none null local
- Dockerをインストールしたホストには
docker0
というブリッジネットワークが作成されている
$ ip a
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
link/ether 02:42:fc:e3:1b:95 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:fcff:fee3:1b95/64 scope link
valid_lft forever preferred_lft forever
- 普通にコンテナ起動するとこのネットワーク(docker0(172.17.0.0/16))に接続される
$ docker run -it debian ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
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
119: eth0@if120: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
- 別のネットワークに接続する場合は
--net
を使用(none or host)
$ docker run --net none -it debian ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
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
$ docker run --net host -it debian ip a
- bridgeネットワークの詳細表示。そのネットワークに接続してるコンテナもわかる。
$ docker network inspect bridge
[
{
"Name": "bridge",
"Id": "f433f1dfac439af1587c40ecb2bea097bb3c59c26a029dca74f4ee8322f79ed7",
"Created": "2018-04-18T14:58:41.83225518Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"3dd255bcca13516b66d2dc9aa8d059f7d3baa11b3710c549e86663aef53e57e2": {
"Name": "container2",
"EndpointID": "109152e47a6f33e18a13d6a040bd76be74756fd3a65986759c2adddc135ce93f",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"f4ae87aaa3c34a975482e6967a9ddaff870a16e3b5f11afb6376bb556fa608db": {
"Name": "container1",
"EndpointID": "e7d7e3e61a28e921552fc7b01c1b72398e9fb17b27867a297d4c9d4f7abf613f",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
コンテナに外部から接続
外部からホスト上のコンテナに接続する方法
ホスト側のポートをコンテナのポートにフォワード
- ホストの8000番ポートをコンテナの80番ポートにフォワードする。(-pオプション)
- ホストの8000に繋ぐとコンテナの80に繋がるようになる。
$ docker run -d -p 8000:80 nginx
712892d72abc212e7c7fa38df7e817fc1188db0c72bf0750b5e9b8860b5fc6f5
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
712892d72abc nginx "nginx -g 'daemon of…" 15 seconds ago Up 14 seconds 0.0.0.0:8000->80/tcp elastic_kare
$ sudo netstat -lpn | grep 8000
tcp6 0 0 :::8000
$ curl http://localhost:8000
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
- ホスト側のポートを指定せずに空いてるポートを自動でフォワードする。(-Pオプション)
- ホストの空いてるポート(32768)がコンテナの80ポートにフォワードされる。
docker port
コマンドで割り当てるポートの確認できる。
$ docker run -d -P nginx
0ffba9a8d23e61952ac0ddb7bf13af266b99ee6c8ad3e692b7c084dfe01ca070
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0ffba9a8d23e nginx "nginx -g 'daemon of…" About a minute ago Up About a minute 0.0.0.0:32768->80/tcp zen_poincare
$ docker port 0ffba9a8d23e61952ac0ddb7bf13af266b99ee6c8ad3e692b7c084dfe01ca070
80/tcp -> 0.0.0.0:32768
$ curl http://localhost:32768
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
コンテナ間の接続
同じホスト上のコンテナ同士で通信させる方法
コンテナのリンク
- Dockerの内部ネットワークを通じてコンテナ間で通信を行う。
- 通信はホストのネットワークからは見えない。
--link CONTAINER:ALIAS
を指定することで 起動したコンテナの/etc/hosts
に設定が追加される/etc/hosts
に追加されることで指定したALIAS名でアクセスが可能/etc/hosts
以外に色々な環境変数も追加される- リンクされていなくてもIPが分かれば通信することは可能(デフォルト)
- コンテナ間の通信をリンクされてる場合のみに制限するには、
--icc=false
--iptables
オプション指定する - リンクされたコンテナが再起動された場合、リンクは更新されない(動的に更新されない)ので、再設定が必要
- redisコンテナをバックグランドで立ち上げる
$ docker run -d --name myredis redis
Unable to find image 'redis:latest' locally
latest: Pulling from library/redis
4d0d76e05f3c: Pull complete
cfbf30a55ec9: Pull complete
82648e31640d: Pull complete
fb7ace35d550: Pull complete
497bf119bebf: Pull complete
89340f6074da: Pull complete
Digest: sha256:4aed8ea5a5fc4cf05c8d5341b4ae4a4f7c0f9301082a74f6f9a5f321140e0cd3
Status: Downloaded newer image for redis:latest
fae50329a01430eef066a3e4dd1f77c852328ca98c85b52bb54228fa8b70b135
- さっき立ち上げたredisコンテナにリンクする形でdebianコンテナを起動して接続
$ docker run -it --link myredis:redis debian /bin/bash
- /etc/hosts に redisコンテナのIPが追加されてる
root@bf07579a69ea:/# 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.17.0.2 redis fae50329a014 myredis
172.17.0.3 bf07579a69ea
- alias名で通信が可能
root@bf07579a69ea:/# ping -c3 redis
PING redis (172.17.0.2) 56(84) bytes of data.
64 bytes from redis (172.17.0.2): icmp_seq=1 ttl=64 time=0.071 ms
64 bytes from redis (172.17.0.2): icmp_seq=2 ttl=64 time=0.072 ms
64 bytes from redis (172.17.0.2): icmp_seq=3 ttl=64 time=0.083 ms
--- redis ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2007ms
rtt min/avg/max/mdev = 0.071/0.075/0.083/0.008 ms
- 環境変数確認
root@bf07579a69ea:/# env
REDIS_PORT_6379_TCP_PROTO=tcp
REDIS_PORT=tcp://172.17.0.2:6379
REDIS_NAME=/wonderful_mirzakhani/redis
HOSTNAME=bf07579a69ea
REDIS_PORT_6379_TCP_ADDR=172.17.0.2
REDIS_PORT_6379_TCP=tcp://172.17.0.2:6379
REDIS_ENV_REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-4.0.9.tar.gz
PWD=/
HOME=/root
REDIS_PORT_6379_TCP_PORT=6379
TERM=xterm
REDIS_ENV_REDIS_DOWNLOAD_SHA=df4f73bc318e2f9ffb2d169a922dec57ec7c73dd07bccf875695dbeecd5ec510
REDIS_ENV_GOSU_VERSION=1.10
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
REDIS_ENV_REDIS_VERSION=4.0.9
_=/usr/bin/env