首先我們需要知道:兩個容器要能通信,必須要有屬於同一個網絡的網卡。
先來看下正常情況下我們的容器默認是否是能通信的,這里運行兩個測試容器:
docker run -it --name=bbox1 busybox
docker run -it --name=bbox2 busybox
然后我們進入bbox2容器中,並ping容器bbox1:
可以發現無法ping通,這是因為容器默認的隔離原因導致的。
從 Docker 1.10 版本開始,docker daemon 實現了一個內嵌的 DNS server,使容器可以直接通過“容器名”通信。方法很簡單,只要在啟動時用 --name
為容器命名就可以了。
首先我們需要創建一個bridge類型的網橋:docker network create --driver bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 my_net2
創建的同時為這個網橋指定了IP段,當然也可以不指定。
創建完成后可以通過 docker network ls查看:
然后我們重新運行前面的兩個容器,並為他們指定netwoek:
docker run -it --network=my_net2 --name=bbox1 busybox
docker run -it --network=my_net2 --name=bbox2 busybox
然后在bbox2容器中ping容器bbox1:
使用 docker DNS 有個限制:只能在 user-defined 網絡中使用。也就是說,默認的 bridge 網絡是無法使用 DNS 的,這個我們在開始的時候就已經驗證過了。
好了,大功告成!