發現 Docker 的 IP 地址
使用Eclipse Che,我們用Docker容器編寫了很多實用程序。 它們占用空間且輕便,可以在許多不同的操作系統上運行,而無需用戶安裝附加軟件。
我們的許多實用程序還需要創建和管理Docker容器,所以當我們的代碼在Docker容器中運行時,我們需要與管理我們的Docker守護進程進行交互。 這意味著我們需要得到它的IP地址。
Docker有許多不同的風格——boot2docker,Docker for Windows / Mac和native for Linux。
你可以使用docker run -net = host codenvy / che-ip來測試實用程序。 這將下載Eclipse Che IP實用程序。 它的大小約為4.8 MB。
$ docker run — net=host codenvy/che-ip 192.168.65.2
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE codenvy/che-ip latest a6bbac2f56dc 5 weeks ago 4
Dockerfile很簡單——它添加了一個shell腳本并將其作為命令的一部分運行。
FROM alpine:3.4 COPY getip.sh /bin/getip.sh CMD [“/bin/getip.s
執行的腳本是一個簡單的腳本。 它首先確定docker綁定的網絡接口,然后使用該網絡接口獲取IP地址。 給定一個特定的網絡接口,docker容器使用ip實用程序獲取主機的IP地址(注意—net = host是 允許我們使用主機的網絡配置,而不是容器的網絡地址):
ip a show “${NETWORK_IF}” | grep ‘inet' | cut -d/ -f1 | awk ‘{print $2}'
Docker的不同實現將自己綁定到不同的網絡接口。 一些是可預測的,而另一些不是。 因此,我們需要根據底層的主機配置來確定使用的適當的網絡接口。
如果安裝的是Windows的 Docker 或Mac的 Docker ,那么我們要保證Docker在eth0上運行。
if uname -r | grep -q ‘moby’; then if [ -d “/sys/class/net/eth0” ]; then NETWORK_IF=eth0 fi fi
否則,檢查會有點棘手。在這種情況下,Docker可以綁定到不同的 Ethernet 接口。我們知道Docker在非系統管理的VM中運行,因此我們在/ sys / class / net目錄下查詢,然后遍歷所有返回的值,找到綁定在eth的第一個接口,然后這是Docker的網絡接口。我們將要使用到的。
# If the NETWORK_IF has not been set, then search for it if test -z ${NETWORK_IF}; then for i in $(ls /sys/class/net); do if [ ${i:0:3} = eth ]; then NETWORK_IF=${i} fi done fi
然而,如果這兩個函數都不返回有效的網絡接口,那么這是因為一些Linux發行版為其接口提供了專門的名稱,如CentOS的ensp0s3。在這種情況下,Docker通常綁定到docker0接口
# If the NETWORK_IF still not set, then search for docker0 if test -z ${NETWORK_IF} then if [ -d “/sys/class/net/docker0” ]; then NETWORK_IF=”docker0" fi fi
然而,如果該測試還是失敗,那么就無法確定當前的接口。我們實例程序搜索Docker的ip時,我們將獲取到位1的退出值,這個時候我們需要跟管理員交流,了解更多的信息。
Great work by Florent Benoit ,Florent Benoit開發的這個實用程序。 Dockerfile的相關腳本和源代碼在Che的GitHub庫上 Che’s GitHub repository 。
來自:https://www.oschina.net/translate/discovering-dockers-ip-address