Docker是目前比較流行的容器化技術,通過它我們可以很方便地打包、部署、運行應用程序,而不需要考慮環境配置等問題。但是,在使用Docker時,有時會碰到Docker容器不顯示IP的問題,這一點很讓人頭疼。那么,這個問題到底是怎么回事呢?下面我們就一起來探討。
$ docker inspect container_name
我們平時在使用Docker中,會用到 inspect 指令,查看一個正在運行的容器的信息。但是,有時在我們查看完容器的詳細信息后,卻發現并沒有顯示該容器的 IP 地址,就像下面這樣:
"Networks": { "bridge": { "NetworkID": "xxxxxxxxxxxxxxxxxxxxxxxxxxx", "EndpointID": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "Gateway": "172.17.0.1", "IPAddress": "", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "xxxxxxxxxxxxx", "DriverOpts": null }
從神秘地以空著的 IPAddress 值,可以看得出 IP 地址被卡在哪兒了。但是,我們又該如何解決呢?
首先,要明確一個概念,Docker為每個容器分配一個IP地址是通過網絡驅動實現的。如果我們在創建容器時沒有指定網絡驅動,它會默認使用bridge網絡驅動,這時候就可能導致容器無法獲取IP地址。
解決方法是使用下列命令給容器新增網絡驅動:
$ docker network create --driver=bridge mynet
接下來,我們可以指定容器使用這個網絡,使它不再使用默認的bridge驅動:
$ docker run --net mynet --name container_name image_name
再次使用 inspect 指令查看該容器的信息時,我們會發現現在它已經有了 IP 地址:
"Networks": { "mynet": { "NetworkID": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "EndpointID": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "Gateway": "172.18.0.1", "IPAddress": "172.18.0.3", "IPPrefixLen": 24, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "xxxxxxxxxxxxxxxxxxxxx", "DriverOpts": null } }
通過這種方法我們可以快速解決容器無法獲取IP地址的問題。當然,這只是其中一種原因和解決方案,對于其它引起這個問題的原因,我們也需要根據實際情況來不斷地尋找和解決。