我的Docker容器没有IP地址.为什么?

Dam*_*men 14 docker

rethinkDB使用该命令启动了一个docker容器

docker pull rethinkdb:2.3
docker run --rm --name rethinkdb -v /srv/rethinkdb:/data --net host rethinkdb:2.3 rethinkdb --bind all --cache-size 8192 --no-update-check
Run Code Online (Sandbox Code Playgroud)

现在容器已成功启动.我做到了docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
f288961ef376        rethinkdb:2.3       "rethinkdb --bind ..."   9 minutes ago       Up 9 minutes                            rethinkdb
1f71722698ae        sorccu/adb:latest   "/sbin/tini -- adb..."   14 minutes ago      Up 14 minutes                           adbd
Run Code Online (Sandbox Code Playgroud)

现在我想找出这个容器的IP地址.所以我做了

docker inspect --format '{{ .NetworkSettings.IPAddress }}' f288961ef376
Run Code Online (Sandbox Code Playgroud)

它什么也没归我.我找不到这个容器的IP地址.

我检查了rethinkDB配置页是否已启动http://localhost:8080,我看到它已启动并运行.

为什么这个容器没有任何IP地址?

输出docker inspect如下

[
    {
        "Id": "f288961ef376531c97d2264cb8ef3c6077a6a75107905d6a47734303adfcb117",
        "Created": "2017-05-05T11:13:45.382460184Z",
        "Path": "rethinkdb",
        "Args": [
            "--bind",
            "all",
            "--cache-size",
            "8192",
            "--no-update-check"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 8157,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2017-05-05T11:13:45.774035358Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:c5ed876750b40cde4725ea9eb9d8503f4d1419a2f23ac2ef8e4cc1d535e2c3a2",
        "ResolvConfPath": "/var/lib/docker/containers/f288961ef376531c97d2264cb8ef3c6077a6a75107905d6a47734303adfcb117/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/f288961ef376531c97d2264cb8ef3c6077a6a75107905d6a47734303adfcb117/hostname",
        "HostsPath": "/var/lib/docker/containers/f288961ef376531c97d2264cb8ef3c6077a6a75107905d6a47734303adfcb117/hosts",
        "LogPath": "/var/lib/docker/containers/f288961ef376531c97d2264cb8ef3c6077a6a75107905d6a47734303adfcb117/f288961ef376531c97d2264cb8ef3c6077a6a75107905d6a47734303adfcb117-json.log",
        "Name": "/rethinkdb",
        "RestartCount": 0,
        "Driver": "aufs",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "docker-default",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": [
                "/srv/rethinkdb:/data"
            ],
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "host",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": true,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "",
            "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": null,
            "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": -1,
            "OomKillDisable": false,
            "PidsLimit": 0,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0
        },
        "GraphDriver": {
            "Data": null,
            "Name": "aufs"
        },
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/srv/rethinkdb",
                "Destination": "/data",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
        "Config": {
            "Hostname": "dev-machine",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": true,
            "AttachStderr": true,
            "ExposedPorts": {
                "28015/tcp": {},
                "29015/tcp": {},
                "8080/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "RETHINKDB_PACKAGE_VERSION=2.3.5~0jessie"
            ],
            "Cmd": [
                "rethinkdb",
                "--bind",
                "all",
                "--cache-size",
                "8192",
                "--no-update-check"
            ],
            "Image": "rethinkdb:2.3",
            "Volumes": {
                "/data": {}
            },
            "WorkingDir": "/data",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "bd17bf8e1663ff18f6674a1a3a1665c4e1bf65283d358ffc97dc238ef4a79088",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/default",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "",
            "Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "",
            "Networks": {
                "host": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "30b6150968580d33aae0e45f7d850b9e67ae2aa29e1bb837ca4fa74f2b0d4d42",
                    "EndpointID": "05e93ec514ee6694e57d344f3e4362252104347c3cc48c607708d125715ed6ec",
                    "Gateway": "",
                    "IPAddress": "",
                    "IPPrefixLen": 0,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": ""
                }
            }
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

lvt*_*llo 11

您正在使用--net host选项启动容器,这意味着您的容器将在主机网络上运行.点击此处了解更多信息.因此,您的容器可以通过主机的IP访问.

一个非常基本的例子:

$ docker run --net=host -d jenkins
Run Code Online (Sandbox Code Playgroud)

这将在您的真实主机网络上运行jenkins.因此,当您打开防火墙(jenkins在8080上运行)时,您将立即访问您的容器.所以我打开防火墙:

$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 8080 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

我检查了我的eth0(主机网络)的真实IP ifconfig.(我在VM上这样做).这是不合适的192.168.140.7.我在浏览器中访问192.168.140.7:8080,我看到了jenkins.所以你的容器没有自己的IP.它在您的主机网络和主机IP上运行.

如果保留该--net host选项,则将在具有范围的默认docker bridge网络中创建容器"172.17.0.0/16".现在,您的容器将从该网络的范围内获取IP.要从外部访问容器,您必须在主机网络上映射端口(请参阅更多信息).您可以使用该-p选项执行此操作.

所以对于詹金斯的例子:

$ docker run -d -p 8888:8080 jenkins
Run Code Online (Sandbox Code Playgroud)

当我表演时,docker inspect我看到:

"IPAddress": "172.17.0.4",
Run Code Online (Sandbox Code Playgroud)

所以我的容器在172.17.0.4:8080的桥接网络中运行.现在有了-p选项我正在我的主机网络的8888上映射我的桥接网络的端口8080:所以host-IP:8888.现在它可以从外面访问.

  • 这个答案很好,但就我而言,我没有使用任何 --net 选项! (2认同)

Ber*_*ard 3

你的容器ip与主机相同。host基本上是说您的容器使用与主机相同的网络接口。由于没有桥接但速度有限,所以速度很快;您必须确保您的容器不会侦听同一端口以避免冲突。

最好坚持使用默认bridge网络并指定要向主机公开的端口。例如:

docker run --rm --name rethinkdb -v /srv/rethinkdb:/data -p 8080:8080 \
    rethinkdb:2.3 rethinkdb --bind all --cache-size 8192 --no-update-check
Run Code Online (Sandbox Code Playgroud)

顺便说一句,在 Docker 的更高版本中--net已被重命名。--network