サーバ構築

Dockerネットワーク基本

更新日:

デフォルトの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

-サーバ構築
-

Copyright© 明日から頑張ります。 , 2025 All Rights Reserved Powered by STINGER.