tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

【Docker】任意で作成したdriver=bridgeネットワークを設定してdocker runしてみるメモ

はじめに

ちょこちょこDockerを触っているのですがネットワーク設定まわりについての自分用メモ
以下の書籍を参考にしています。

アジェンダ

  1. やりたいこと
  2. Dockerコンテナのネットワークのプチ基礎
  3. ネットワークを作成する
  4. 複数のContainer同士で繋いでみる
  5. ネットワークを削除する

1. やりたいこと

やりたい事は以下です

  • dockerのネットワークを作成する
  • 複数のcontainerを作成した同一ネットワークに接続
  • container同士でアクセスする

2. Dockerコンテナのネットワークのプチ基礎

Dockerはデフォルトでbridge/host/noneの3つのネットワークを作成します

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
b917ccb08e42        bridge              bridge              local
45c4f50ef8dd        host                host                local
e1785a610499        none                null                local

明示的にネットワークを指定せずにDockerコンテナを起動すると、
デフォルトのbridgeネットワークにDockerコンテナを起動します。

# 適当に立ち上げてみる
$ docker container run -itd --name=sample ubuntu:latest

# .NetworkSettings.Networks}}を確認するとbridgeになっている
$ docker container inspect sample --format="{{json .NetworkSettings.Networks}}"
{"bridge":{"IPAMConfig":null,"Links":null,"Aliases":null,"NetworkID":"b917ccb08e42a549dd85213c3e705a3ab03295656d760340ab04781ffe8f98da","EndpointID":"9fd096a5ff16be1542c1154baeebce92bc3b5abf6723f9d05ecbc5c36a6ff7c9","Gateway":"172.17.0.1","IPAddress":"172.17.0.2","IPPrefixLen":16,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:11:00:02","DriverOpts":null}}
プログラマのためのDocker教科書 第2版 インフラの基礎知識&コードによる環境構築の自動化
WINGSプロジェクト 阿佐 志保
翔泳社
売り上げランキング: 4,789

3. ネットワークを作成する

ネットワークの作成は以下のコマンドで行います

docker network create [オプション] ネットワーク

オプションは以下が指定可能です。

オプション 説明
--driver, d ネットワークブリッジまたはオーバーレイ(デフォルトはbridge)
--ip-range コンテナに割り当てるIPアドレスのレンジを指定
--subnet サブネットをCIDR形式で指定
--ipv6 IPv6ネットワークを有効にするかどうか(true/false)
-label ネットワークに設定するラベル

今回は--driver=bridgeweb-networkというネットワークを作成してみます。

$ docker network create --driver=bridge web-network
fe7f79487aa87cf03e03c857fc0013d3b85656fad9fb4417f9abfb2402f17c60

# 作成したネットワークを確認
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
b917ccb08e42        bridge              bridge              local
45c4f50ef8dd        host                host                local
e1785a610499        none                null                local
fe7f79487aa8        web-network         bridge              local

$ docker network ls --filter driver=bridge
NETWORK ID          NAME                DRIVER              SCOPE
b917ccb08e42        bridge              bridge              local
fe7f79487aa8        web-network         bridge              local

4. 複数のContainer同士で繋いでみる

ネットワークへの接続

ネットワークへの接続は
docker networkで接続する方法と、
docker run時に接続する方法があります。

docker networkでcontainerをネットワークに接続するには以下のコマンドを使います

docker network connect [オプション] ネットワーク名 コンテナ名

docker runで接続するには以下のコマンドを使います

docker container run オプション --name=コンテナ名 --net=ネットワーク名 コンテナイメージ

今回はdocker runのほうで試します。

1つめのcontainer

バックグラウンドでwebappという名前のcontainerを
ネットワークweb-networkにつないで立ち上げます。

また、ポートはホストOS:8001からcontainerの80につなげます。

$ docker container run -itd -p 8001:80 --name=webapp --net=web-network nginx
8296c047ebf6e8f7d3755dec287903e5d7afee93cf96a47c7ef4b1c3ef04ded7
ブラウザでアクセスしてみる

ブラウザで確認すると当然こんな感じ

f:id:tweeeety:20180625215059p:plain

2つめのcontainer

webfrontという名前のcontainerを
ネットワークweb-networkにつないで立ち上げてbashで起動。

また、container1 -> container2から繋いでみる際は、curlでポート80で繋ぎます。

$ docker container run -it --name=webfront --net=web-network centos /bin/bash

# 1つめのcontainerにcurlしてみる
# nginxの結果が帰ってくる
[root@c1170773ec3c /]# curl webapp:80
<!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>

うまくいきました!

inspectで確認

containerをinspectで確認してみると、
.NetworkSettings.Networksにてweb-networkに繋がっている事が確認できます。

$ docker container inspect webfront webapp
[
    {
        "Id": "e312f6dfd7659b82474dca68f5f991ce3135cd5ab840bb53d998149e79b0dcb2",
        "Created": "2018-06-23T22:36:49.8513111Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 8326,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2018-06-23T22:41:17.7127242Z",
            "FinishedAt": "2018-06-23T22:38:05.4488807Z"
        },
        "Image": "sha256:49f7960eb7e4cb46f1a02c1f8174c6fac07ebf1eb6d8deffbcb5c695f1c9edd5",
        "ResolvConfPath": "/var/lib/docker/containers/e312f6dfd7659b82474dca68f5f991ce3135cd5ab840bb53d998149e79b0dcb2/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/e312f6dfd7659b82474dca68f5f991ce3135cd5ab840bb53d998149e79b0dcb2/hostname",
        "HostsPath": "/var/lib/docker/containers/e312f6dfd7659b82474dca68f5f991ce3135cd5ab840bb53d998149e79b0dcb2/hosts",
        "LogPath": "/var/lib/docker/containers/e312f6dfd7659b82474dca68f5f991ce3135cd5ab840bb53d998149e79b0dcb2/e312f6dfd7659b82474dca68f5f991ce3135cd5ab840bb53d998149e79b0dcb2-json.log",
        "Name": "/webfront",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "web-network",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "shareable",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DiskQuota": 0,
            "KernelMemory": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": 0,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/df845a28b18ea7627b098493ad76fadf0be29ba2c0ddd6788cf513f878fc0116-init/diff:/var/lib/docker/overlay2/1809e038beecc1e66692da14e5b8028149a73b1566a6f04597889ae8c6d916f4/diff",
                "MergedDir": "/var/lib/docker/overlay2/df845a28b18ea7627b098493ad76fadf0be29ba2c0ddd6788cf513f878fc0116/merged",
                "UpperDir": "/var/lib/docker/overlay2/df845a28b18ea7627b098493ad76fadf0be29ba2c0ddd6788cf513f878fc0116/diff",
                "WorkDir": "/var/lib/docker/overlay2/df845a28b18ea7627b098493ad76fadf0be29ba2c0ddd6788cf513f878fc0116/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "e312f6dfd765",
            "Domainname": "",
            "User": "",
            "AttachStdin": true,
            "AttachStdout": true,
            "AttachStderr": true,
            "Tty": true,
            "OpenStdin": true,
            "StdinOnce": true,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "centos@sha256:b67d21dfe609ddacf404589e04631d90a342921e81c40aeaf3391f6717fa5322",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.schema-version": "= 1.0     org.label-schema.name=CentOS Base Image     org.label-schema.vendor=CentOS     org.label-schema.license=GPLv2     org.label-schema.build-date=20180531"
            }
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "372311e1ac5caebcc8f4a45c12a2f19437093f6421254c82bcae38ca1bff94dd",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/372311e1ac5c",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "",
            "Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "",
            "Networks": {
                "web-network": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": [
                        "e312f6dfd765"
                    ],
                    "NetworkID": "fe7f79487aa87cf03e03c857fc0013d3b85656fad9fb4417f9abfb2402f17c60",
                    "EndpointID": "45f3d2f47b8f4aec8dce2cc70f1d0ca003714ff76a9a28dfac5a332c14b65ad0",
                    "Gateway": "172.18.0.1",
                    "IPAddress": "172.18.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:12:00:03",
                    "DriverOpts": null
                }
            }
        }
    },
    {
        "Id": "8296c047ebf6e8f7d3755dec287903e5d7afee93cf96a47c7ef4b1c3ef04ded7",
        "Created": "2018-06-23T22:33:09.6325018Z",
        "Path": "nginx",
        "Args": [
            "-g",
            "daemon off;"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 8012,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2018-06-23T22:33:10.1810925Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:cd5239a0906a6ccf0562354852fae04bc5b52d72a2aff9a871ddb6bd57553569",
        "ResolvConfPath": "/var/lib/docker/containers/8296c047ebf6e8f7d3755dec287903e5d7afee93cf96a47c7ef4b1c3ef04ded7/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/8296c047ebf6e8f7d3755dec287903e5d7afee93cf96a47c7ef4b1c3ef04ded7/hostname",
        "HostsPath": "/var/lib/docker/containers/8296c047ebf6e8f7d3755dec287903e5d7afee93cf96a47c7ef4b1c3ef04ded7/hosts",
        "LogPath": "/var/lib/docker/containers/8296c047ebf6e8f7d3755dec287903e5d7afee93cf96a47c7ef4b1c3ef04ded7/8296c047ebf6e8f7d3755dec287903e5d7afee93cf96a47c7ef4b1c3ef04ded7-json.log",
        "Name": "/webapp",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "web-network",
            "PortBindings": {
                "80/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "8001"
                    }
                ]
            },
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "shareable",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DiskQuota": 0,
            "KernelMemory": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": 0,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/feb0bfb05649a7787b78ce5e6134d30a2a7e7555964026c50bfd3a4af1e2a03e-init/diff:/var/lib/docker/overlay2/2ed039f41684788abb90840539ada301341751824b0112729e02b67b196226d7/diff:/var/lib/docker/overlay2/617a2b41e640cd527fdb39453e022b25eb04b5967ec1f4ed74e4b952fffb4005/diff:/var/lib/docker/overlay2/6bd654f2fa5d21d58a7ffcb989da07153dcaf6755e44952114e067baf7ccdba6/diff",
                "MergedDir": "/var/lib/docker/overlay2/feb0bfb05649a7787b78ce5e6134d30a2a7e7555964026c50bfd3a4af1e2a03e/merged",
                "UpperDir": "/var/lib/docker/overlay2/feb0bfb05649a7787b78ce5e6134d30a2a7e7555964026c50bfd3a4af1e2a03e/diff",
                "WorkDir": "/var/lib/docker/overlay2/feb0bfb05649a7787b78ce5e6134d30a2a7e7555964026c50bfd3a4af1e2a03e/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "8296c047ebf6",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": true,
            "OpenStdin": true,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.15.0-1~stretch",
                "NJS_VERSION=1.15.0.0.2.1-1~stretch"
            ],
            "Cmd": [
                "nginx",
                "-g",
                "daemon off;"
            ],
            "ArgsEscaped": true,
            "Image": "nginx@sha256:3e2ffcf0edca2a4e9b24ca442d227baea7b7f0e33ad654ef1eb806fbd9bedcf0",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGTERM"
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "aed26e0cedb3000e6bcdf02f2a45446ae2c81eddbd6f53a30d34992e17f01611",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "80/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "8001"
                    }
                ]
            },
            "SandboxKey": "/var/run/docker/netns/aed26e0cedb3",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "",
            "Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "",
            "Networks": {
                "web-network": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": [
                        "8296c047ebf6"
                    ],
                    "NetworkID": "fe7f79487aa87cf03e03c857fc0013d3b85656fad9fb4417f9abfb2402f17c60",
                    "EndpointID": "cfe083931723d5689088deb5869d3caabe9360b22bbef908fb538041e0c58c7c",
                    "Gateway": "172.18.0.1",
                    "IPAddress": "172.18.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:12:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]

見にくい場合はformatやjqを使ってみると見やすいです

$ docker container inspect webfront webapp --format "{{json .HostConfig}}" | jq .
{
  "Binds": null,
  "ContainerIDFile": "",
  "LogConfig": {
    "Type": "json-file",
    "Config": {}
  },
  "NetworkMode": "web-network",
  "PortBindings": {},
  "RestartPolicy": {
    "Name": "no",
    "MaximumRetryCount": 0
  },
  "AutoRemove": false,
  "VolumeDriver": "",
  "VolumesFrom": null,
  "CapAdd": null,
  "CapDrop": null,
  "Dns": [],
  "DnsOptions": [],
  "DnsSearch": [],
  "ExtraHosts": null,
  "GroupAdd": null,
  "IpcMode": "shareable",
  "Cgroup": "",
  "Links": null,
  "OomScoreAdj": 0,
  "PidMode": "",
  "Privileged": false,
  "PublishAllPorts": false,
  "ReadonlyRootfs": false,
  "SecurityOpt": null,
  "UTSMode": "",
  "UsernsMode": "",
  "ShmSize": 67108864,
  "Runtime": "runc",
  "ConsoleSize": [
    0,
    0
  ],
  "Isolation": "",
  "CpuShares": 0,
  "Memory": 0,
  "NanoCpus": 0,
  "CgroupParent": "",
  "BlkioWeight": 0,
  "BlkioWeightDevice": [],
  "BlkioDeviceReadBps": null,
  "BlkioDeviceWriteBps": null,
  "BlkioDeviceReadIOps": null,
  "BlkioDeviceWriteIOps": null,
  "CpuPeriod": 0,
  "CpuQuota": 0,
  "CpuRealtimePeriod": 0,
  "CpuRealtimeRuntime": 0,
  "CpusetCpus": "",
  "CpusetMems": "",
  "Devices": [],
  "DeviceCgroupRules": null,
  "DiskQuota": 0,
  "KernelMemory": 0,
  "MemoryReservation": 0,
  "MemorySwap": 0,
  "MemorySwappiness": null,
  "OomKillDisable": false,
  "PidsLimit": 0,
  "Ulimits": null,
  "CpuCount": 0,
  "CpuPercent": 0,
  "IOMaximumIOps": 0,
  "IOMaximumBandwidth": 0
}
{
  "Binds": null,
  "ContainerIDFile": "",
  "LogConfig": {
    "Type": "json-file",
    "Config": {}
  },
  "NetworkMode": "web-network",
  "PortBindings": {
    "80/tcp": [
      {
        "HostIp": "",
        "HostPort": "8001"
      }
    ]
  },
  "RestartPolicy": {
    "Name": "no",
    "MaximumRetryCount": 0
  },
  "AutoRemove": false,
  "VolumeDriver": "",
  "VolumesFrom": null,
  "CapAdd": null,
  "CapDrop": null,
  "Dns": [],
  "DnsOptions": [],
  "DnsSearch": [],
  "ExtraHosts": null,
  "GroupAdd": null,
  "IpcMode": "shareable",
  "Cgroup": "",
  "Links": null,
  "OomScoreAdj": 0,
  "PidMode": "",
  "Privileged": false,
  "PublishAllPorts": false,
  "ReadonlyRootfs": false,
  "SecurityOpt": null,
  "UTSMode": "",
  "UsernsMode": "",
  "ShmSize": 67108864,
  "Runtime": "runc",
  "ConsoleSize": [
    0,
    0
  ],
  "Isolation": "",
  "CpuShares": 0,
  "Memory": 0,
  "NanoCpus": 0,
  "CgroupParent": "",
  "BlkioWeight": 0,
  "BlkioWeightDevice": [],
  "BlkioDeviceReadBps": null,
  "BlkioDeviceWriteBps": null,
  "BlkioDeviceReadIOps": null,
  "BlkioDeviceWriteIOps": null,
  "CpuPeriod": 0,
  "CpuQuota": 0,
  "CpuRealtimePeriod": 0,
  "CpuRealtimeRuntime": 0,
  "CpusetCpus": "",
  "CpusetMems": "",
  "Devices": [],
  "DeviceCgroupRules": null,
  "DiskQuota": 0,
  "KernelMemory": 0,
  "MemoryReservation": 0,
  "MemorySwap": 0,
  "MemorySwappiness": null,
  "OomKillDisable": false,
  "PidsLimit": 0,
  "Ulimits": null,
  "CpuCount": 0,
  "CpuPercent": 0,
  "IOMaximumIOps": 0,
  "IOMaximumBandwidth": 0
}

5. ネットワークを削除する

ネットワークを削除するには以下のコマンドです

docker network rm [オプション] ネットワーク名

containerが起動している状態だとエラーが出るのでstopしてから行います

# ネットワークに接続しているcontainerが起動しいるとエラー
$ docker network rm web-network
Error response from daemon: network web-network id fe7f79487aa87cf03e03c857fc0013d3b85656fad9fb4417f9abfb2402f17c60 has active endpoints

# stopする
$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
e312f6dfd765        centos              "/bin/bash"              34 minutes ago      Up 30 minutes                              webfront
8296c047ebf6        nginx               "nginx -g 'daemon of…"   38 minutes ago      Up 38 minutes       0.0.0.0:8001->80/tcp   webapp

$ docker container stop e312f6dfd765 8296c047ebf6
e312f6dfd765
8296c047ebf6

# stop後だと消せる
$ docker network rm web-network
web-network

おわり

docker便利だけどまだ使いこなせてない\(^o^)/

プログラマのためのDocker教科書 第2版 インフラの基礎知識&コードによる環境構築の自動化
WINGSプロジェクト 阿佐 志保
翔泳社
売り上げランキング: 4,789

【VirtualBox】CentOS@VirtualBoxでホストOSとゲストOSでsshするときのネットワーク設定メモ - NAT、ホストオンリーアダプターを設定してeth0、eth1を有効にする

はじめに

VirtualBoxを久しぶりに使ったら全然覚えてない...
特にネットワークまわり。

やりたいことは単純でおおざっぱに言うと以下2点だけ

  • 前提
  • 1.ホストOSからゲストOSにターミナルでsshしたい
    • 外からゲストOSにはアクセスできなくて良い
  • 2.ゲストOSからホストOSを経由して外のネットワークにつなぎたい
    • ゲストOSからgit pullやらpushできればok

そんな時の自分メモ

f:id:tweeeety:20180622000833p:plain

アジェンダ

  1. 今回の環境
  2. やりたいこと
  3. 何をすれば良いか
  4. どうやるか
  5. ネットワークを確認してみる

1. 今回の環境

ホストOS情報

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.13.5
BuildVersion:   17F77
$ VBoxManage -v
5.2.12r122591

ゲストOS情報

$ cat /etc/redhat-release
CentOS release 6.5 (Final)

2. やりたいこと

はじめにに記載したことがやりたい事ですが再掲です。

  • 前提
  • 1.ホストOSからゲストOSにターミナルでsshしたい
    • 外からゲストOSにはアクセスできなくて良い
  • 2.ゲストOSからホストOSを経由して外のネットワークにつなぎたい
    • ゲストOSからgit pullやらpushできればok

3. 何をすれば良いか

2. やりたいことを実現するために
VirtualBox何をすれば良いかを文章的にまとめるとこんな感じです。

  1. ホストOSからゲストOSにターミナルでsshしたい
    • ホストオンリーアダプタを設定する
  2. ゲストOSからホストOSを経由して外のネットワークにつなぎたい
    • NAT(DHCP)の設定をする

また、これを図にするとこんなイメージになります。
f:id:tweeeety:20180622001154p:plain

4. どうやるか

何をすれば良いか を実現するために具体的にやることは以下の4stepです。

VirtualBoxマネージャはこのGUIツールです

f:id:tweeeety:20180622002208p:plain

①. VirtualBoxマネージャでネットワークアダプタを作成&設定する

  • グローバルツール(G)を開きます。

f:id:tweeeety:20180622002227p:plain

  • 作成(C)を押します。
    vboxnet0というアダプタが作成されます。

f:id:tweeeety:20180622002239p:plain

  • vboxnet0を選択した状態でアダプタータブを開き
    アダプターを手動で設定にチェックが入っている事を確認します。

f:id:tweeeety:20180622002416p:plain

  • DHCPサーバタブを開きサーバを有効化にチェックします。
    設定値はそのままで大丈夫です。

f:id:tweeeety:20180622002505p:plain

②. VirtualBoxマネージャで仮想マシンのネットワーク設定をする

f:id:tweeeety:20180622002524p:plain

  • ネットワークを開いてアダプター1にNATが設定されている事を確認します。

f:id:tweeeety:20180622002539p:plain

  • アダプター2を選択してネットワークアダプターを有効化にチェックをします。

f:id:tweeeety:20180622002551p:plain

  • 割り当て:ホストオンンリーアダプターを選択して
    名前にさきほど作成したvboxnet0を選びます。
    (デフォルトvboxnet0になってる)

f:id:tweeeety:20180622002551p:plain

また、高度を押すと設定がさらに開くのでMACアドレスをメモっておきます。

f:id:tweeeety:20180622002655p:plain

今回の例でいうとMACアドレスは以下です

080027588378

最後にOKを押して設定を保存します。

③. ゲストOSでネットワークの設定をする

仮想マシンを起動するか、すでに起動していた場合は再起動します。

起動したら仮想マシンのターミナルで設定を行います。

rulesをcleanにする

MACアドレスeth*の対応づけを行なっているrulesの設定を綺麗にしておきます。
reboot後にeth0、eth1を元に自動で作成されるので大丈夫です。

$ rm /etc/udev/rules.d/70-persistent-net.rules

この辺のファイルが何かは以下をご参考ください

ifcfg-eth*を設定

vim/etc/sysconfig/network-scripts/ifcfg-eth0を設定します。
ファイルを開くともともと書かれてる場合がありますが、
他の行はコメントアウトしました。

DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=dhcp
PEERDNS=no

vim/etc/sysconfig/network-scripts/ifcfg-eth1を設定します。
ファイルがない場合は作成します。

DEVICE=eth1
HWADDR=08:00:27:58:83:78
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
PEERDNS=no
IPADDR=192.168.56.3
NETMASK=255.255.255.0

BOOTPROTOについては気になったので簡単に調べてみました。

再起動する
$ reboot
確認する

以下を確認します。

  • /etc/udev/rules.d/70-persistent-net.rulesが作成されている
  • ifconfigでeth0eth1が設定されている

このように表示されれば設定がされているはずです。

# 確認
# rulesが新しくできている
$ cat /etc/udev/rules.d/70-persistent-net.rules
# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.

# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="08:00:27:82:03:24", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# PCI device 0x8086:0x100e (e1000) (custom name provided by external tool)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="08:00:27:58:83:78", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

# ネットワークインターフェースの確認
$ ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:82:03:24
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe82:324/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:24 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1470 (1.4 KiB)  TX bytes:2262 (2.2 KiB)

eth1      Link encap:Ethernet  HWaddr 08:00:27:58:83:78
          inet addr:192.168.56.3  Bcast:192.168.56.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe58:8378/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:505 errors:0 dropped:0 overruns:0 frame:0
          TX packets:318 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:48536 (47.3 KiB)  TX bytes:73614 (71.8 KiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
疎通確認をする

次に、pingで外向けに通信してNAT(ゲストOS->ホストOSの通信)を確かめます。
packet lossがなければ成功です。

# Google Public DNS(8.8.8.8)に疎通確認
$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=63 time=4.17 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=63 time=5.32 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=63 time=5.54 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=63 time=4.29 ms
^C
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3155ms
rtt min/avg/max/mdev = 4.179/4.837/5.548/0.611 ms

# googleに疎通確認
$ ping google.com
PING google.com (172.217.24.142) 56(84) bytes of data.
64 bytes from nrt20s01-in-f14.1e100.net (172.217.24.142): icmp_seq=1 ttl=63 time=2.25 ms
64 bytes from nrt20s01-in-f14.1e100.net (172.217.24.142): icmp_seq=2 ttl=63 time=2.35 ms
64 bytes from nrt20s01-in-f14.1e100.net (172.217.24.142): icmp_seq=3 ttl=63 time=3.61 ms
64 bytes from nrt20s01-in-f14.1e100.net (172.217.24.142): icmp_seq=4 ttl=63 time=2.55 ms
^C
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3895ms
rtt min/avg/max/mdev = 2.259/2.695/3.612/0.540 ms

④. ホストOSからSSHしてみる

ここまでくればmacsshしてみます。
sshできればホストオンリーアダプタ(ホストOS->ゲストOSの通信)が成功です。

$ ssh root@192.168.65.3
root@192.168.56.3's password:
Last login: Thu Jun 21 22:30:49 2018 from 192.168.56.1

5. ネットワークを確認してみる

念のためもう少しネットワークを確認してみます。

ゲストOS

ゲストOS側でroute、netstat、tracerouteでネットワーク設定を確認します。
外に出れていれば以下のようになります。

route

routeコマンドでルーティングテーブルを確認します

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.2.0        *               255.255.255.0   U     0      0        0 eth0
192.168.56.0    *               255.255.255.0   U     0      0        0 eth1
link-local      *               255.255.0.0     U     1002   0        0 eth0
link-local      *               255.255.0.0     U     1003   0        0 eth1
default         10.0.2.2        0.0.0.0         UG    0      0        0 eth0
$ route 
netstat

netstatでネットワークインターフェース(NIC)の状態を確認します

# netstat
$ netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.0.2.0        0.0.0.0         255.255.255.0   U         0 0          0 eth0
192.168.56.0    0.0.0.0         255.255.255.0   U         0 0          0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth1
0.0.0.0         10.0.2.2        0.0.0.0         UG        0 0          0 eth0
traceroute

tracerouteでネットワークの経路を確認してみます。

# traceroute
$ traceroute -T -q 1 -w 1 google.com
traceroute to google.com (172.217.24.142), 30 hops max, 60 byte packets
 1  10.0.2.2 (10.0.2.2)  0.127 ms
 2  syd09s06-in-f14.1e100.net (172.217.24.142)  24.941 ms

今回利用しているオプションは以下の通りです

  • -T: TCP SYNパケットを用いる。デフォルトのポート番号は80
  • -q: 1つのホップにおける試行回数を指定する
  • -w: タイムアウト時間を指定する。単位は秒

ホストOSでifconfig

また、ホストOS側でifconfigを行うと、
仮想NICvboxnet0に付与されたIPアドレスを確認できます。

$ ifconfig | grep vboxnet0 -A 3 -B 3
    nd6 options=201<PERFORMNUD,DAD>
    media: autoselect
    status: active
vboxnet0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
    ether 0a:00:27:00:00:00
    inet 192.168.56.1 netmask 0xffffff00 broadcast 192.168.56.255

補足

10.0.2.2はどこで設定されてるか気になり別途調べてみました。

参考

おわり

\(^o^)/

【centos】CentOS@VirtualBoxで行うネットワーク設定のファイルについて

はじめに

VirtualBoxCentOS入れて使う場合、
たいてい最初に行うのがネットワークの設定ですよね。

いつもどのファイルだっけ?となるのでそんな自分のためのメモ

ネットワークに関する設定ファイル

以下のファイルがよく見るファイルです

  • /etc/sysconfig/network
  • /etc/sysconfig/network-scripts/ifcfg-eth0
  • /etc/hosts
  • /etc/resolv.conf

/etc/sysconfig/network

これはなに?

ネットワーク通信に必要とされる基本的な情報が記述されているファイル。

DHCPの設定例

NETWORKING=yes
HOSTNAME=hoge.local

参考

/etc/sysconfig/network-scripts/ifcfg-eth0

これはなに?

インターフェース設定ファイル。
システムの1番目のイーサネットのネットワークインターフェースカード または、NICを制御する。

NAT/DHCPとしてeth0を設定するときの例

DEVICE=eth0 
BOOTPROTO=dhcp 
ONBOOT=yes

ホストオンリーアダプタとしてeth1を設定するときの例

DEVICE=eth1
HWADDR=00:00:00:00:00:00
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.56.3
NETMASK=255.255.255.0

参考

/etc/hosts

これはなに?

IPアドレスとマシン名(ホスト名)を関連付ける設定ファイル

127.0.0.1 localhost.localdomain localhost
192.168.1.10 test1
192.168.1.20 test2

参考

/etc/resolve.conf

これはなに?

自分のマシンが利用するDNSサーバの情報(IPアドレス)を記述するファイル

search linux-beginner.com
nameserver 192.168.0.1
nameserver 192.168.0.2

参考

その他の参考

以下のサイトが全体的に説明してくれていてわかりやすかったです。

おわり

/etc/sysconfig/network-scripts/ifcfg-eth0の場所がほんとよくどこだっけなーとなる
\(^o^)/

【VirtualBox】CentOS@VirtualBoxのNAT設定での10.0.2.2

はじめに

CentOS@VirtualBoxでのネットワーク設定での話。

設定後にNATまわりを確認すると10.0.2.2が出てきます。

設定する過程で見かけた記憶がなかったのでどこで設定されているのか気になり調べてみたメモです。

f:id:tweeeety:20180622000002p:plain

結論

VirtualBoxの仕様らしい

VirtualBoxのNATネットワークアダプタに10.0.2.0/24が割り当てられ
ゲストOSから見えるホストOSのIPアドレスには10.0.2.2が設定される仕様  
ゲストOSから10.0.2.2に対してpingすると
ホストOSから応答がありますが、
ホストOSには10.0.2.0/24系のネットワークインタフェースが存在しないため、ゲストOSは見えません。  
* garbagetown - VirtualBox (3)

おわり

仕様ならまぁ、、、という感じで
物理的なファイルとしてどこで設定されてるかまでは諦めましたw
\(^o^)/

【linux】CentOSの/etc/sysconfig/network-scripts/ifcfg-eth0について - BOOTPROTOとか

はじめに

CentOSNIC周りの設定を触っていると
/etc/sysconfig/network-scripts/ifcfg-eth0
というファイルを見る or 設定することがあります。

その時に出てくるBOOTPROTOが気になったのでそのあたりの自分用メモ

f:id:tweeeety:20180621173752j:plain

/etc/sysconfig/network-scripts/ifcfg-eth0 とは

参考サイトからの引用です

最も一般的なインターフェースファイルの1つです。
これは、システムの一番目のイーサネット
ネットワークインターフェースカード または NIC を制御します。
 
* 参考: 9.2. インターフェース設定ファイル

BOOTPROTOとは

こちらも参考サイトから引用します。
他の項目についても説明がわかりやすいです。

DHCPの様に、IPアドレスを外部から設定情報を取得する場合のプロトコルを指定。
 
* 参考: Linux ネットワーク基本設定 其の三

設定できるの値は以下です。

説明
none インタフェース起動時にプロトコルを使用しない。( IPアドレスが固定などの場合に使用する )
staticと指定してもOK。
dhcp DHCP(Dynamic Host Configuration Protocol)を利用する場合に指定。
bootp BOOTP(BOOTstrap Protocol)を利用する場合に指定。

設定しないとどうなる?(コメントすると?)

設定値としてはbootpdhcpしかないようなので
noneでも設定しないでも好きな文字でも良いようですが、
慣習的にnoneと明示するようです。

# cat /etc/sysconfig/network-scripts/ifup | grep BOOTPROTO -A3 -B3 -n
141-
142-# Old BOOTP variable
143-if [ "${BOOTP}" = "yes" ]; then
144:    BOOTPROTO=bootp
145-fi
146-
147:if [ "${BOOTPROTO}" = "bootp" -o "${BOOTPROTO}" = "dhcp" ]; then
148-    DYNCONFIG=true
149-fi
150-

おわり

ネットワークまわりは何度やってもむずい\(^o^)/

【Mac】treeコマンドで文字化けするときのメモ

はじめに

日本語を含むdir/fileをtreeすると文字化けするときの自分用メモ

$ tree .
.
├── a
│   ├── a�\201��\201��\201\214�\203\225�\202��\202��\203�.txt
│   ├── a�\201��\201��\201\222�\203\225�\202��\202��\203�.txt
│   └── b�\201��\201��\201\214�\203\225�\202��\202��\203�.txt
├── b
└── c

tree -N

tree -N で文字化けせずに表示できます

$ tree -N .
.
├── a
│   ├── aのふがファイル.txt
│   ├── aのほげファイル.txt
│   └── bのふがファイル.txt
├── b
└── c

helpから抜粋

$ tree --help | grep "\-N"
  -N            Print non-printable characters as is.

参考

おわり

自分のサイト内を文字化けで検索したら出てきてくれさえすれば良いメモ
\(^o^)/

【gulp】gulp@4.0.0にしたら`The following tasks did not complete:`、`Did you forget to signal async completion?`と怒られる

はじめに

とあることで、gulpを3.x.x.から^4.0.0にあげる必要がありました。
f:id:tweeeety:20180618044056p:plain

あげてからgulpタスクを実行すると
以下のようなエラーが出たのでその対応方法をメモ

# defaultタスクを実行するとこんなエラーが...
$ ./node_modules/gulp/bin/gulp.js
[05:35:32] Using gulpfile ~/gulp-task-gulp4.0.0-sample2/gulpfile.js
[05:35:32] Starting 'default'...
[05:35:32] Starting 'hoge'...
i am hoge!!
[05:35:32] The following tasks did not complete: default, hoge
[05:35:32] Did you forget to signal async completion?

なぜ起こったか

The following tasks did not complete  
上記の実行時のログより

処理が終わってないよと言われてます。

4.x.xではgulpタスクで以下のことを行う必要があります

  • 明示的にtaskを終了する
    • callbackを呼び出す
    • streamを返却する
    • 単にreturnをつける

どうすればいいか

すでに書いてしまってますが、
明示的にtaskを終了をする必要があります。

gulp.task@3.x.x -> gulp.task@^4.x.x
に書き換える変える一例をあげます。

gulp.task@3.x.x

gulp.task('sass', function(){
  gulp.src('./sass/*.scss')
    .pipe(sass({outputStyle: 'expanded'}))
    .pipe(gulp.dest('./css/'));
});

gulp.task@^4.x.x

gulp.task('sass', function(){
  // streamをreturnする
  return gulp.src('./sass/*.scss')
    .pipe(sass({outputStyle: 'expanded'}))
    .pipe(gulp.dest('./css/'));
});

3.9.1^4.x.xを実際に動かして見比べてみる

そのまま試せる形でgithubに載せてみました。

https://github.com/tweeeety/gulp-task-gulp4.0.0-sample2

  • gulp@3.x.xの書き方
  • gulp@^4.x.xの書き方

をそれぞれ記載しています。

こちらも

こちらも合わせてご覧ください

参考

おわり

gulpを3.x.x->4.x.xからあげる場合は
書き直しになる場合が多いかもしれないので要注意
\(^o^)/