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

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

 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 

现在容器启动成功了。 我做了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 

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

 docker inspect --format '{{ .NetworkSettings.IPAddress }}' f288961ef376 

这没有任何回报。 我找不到这个容器的IP地址。

我检查了是否rethinkDBconfiguration页面是否打开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": "" } } } } ] 

您正在使用--net host选项启动容器,这意味着您的容器将在您的主机networking上运行。 点击这里查看更多信息。 所以你的容器可以在主机的IP上访问。

一个非常基本的例子:

 $ docker run --net=host -d jenkins 

这将在您的真实主机networking上运行jenkins。 所以,当你打开防火墙(jenkins在8080上运行),你将立即访问你的容器。 所以我打开防火墙:

 $ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 8080 -j ACCEPT 

我用ifconfig检查我的eth0(主机networking)的真实IP。 (我在VM上这样做)。 这是inet 192.168.140.7 。 我在我的浏览器去192.168.140.7:8080,我看到jenkins。 所以你的容器没有自己的IP。 它运行在你的主机networking和主机IP上。

如果您保留--net host选项,容器将在范围为"172.17.0.0/16"的默认泊坞网桥networking中创build。 现在你的容器将从该networking的范围内获得一个IP。 要从外部访问容器,必须在主机networking上映射端口(请参阅更多信息)。 你可以用-p选项来做到这一点。

所以对于jenkins的例子:

 $ docker run -d -p 8888:8080 jenkins 

当我进行docker inspect我看到:

 "IPAddress": "172.17.0.4", 

所以我的容器在172.17.0.4:8080的网桥上运行。 现在使用-p选项,我在我的主机networking的8888上映射了我的桥接networking的端口8080:so host-IP:8888 。 现在可以从外面访问了。

你的容器ip和主机一样。 host基本上说,你的容器使用与主机相同的networking接口。 这是因为没有桥梁,但是有限, 您必须确保您的容器不听相同的端口以避免冲突。

坚持使用默认bridgenetworking并指定您希望暴露给主机的端口更好。 例如:

 docker run --rm --name rethinkdb -v /srv/rethinkdb:/data -p 8080:8080 \ rethinkdb:2.3 rethinkdb --bind all --cache-size 8192 --no-update-check 

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