我們執行了一些容器,但是這些容器是否能夠進行連通呢?那我們就來試一下。
我們檢視一下MySQL容器的詳細資訊:
主要關注,Networks.bridge.IPAddress屬性
資訊:
docker inspect mysql
# 或者過濾一些資訊
docker inspect --format='{{range .NetworkSettings.Networks}}{{println .IPAddress}}{{end}}' mysql
可以看到ip地址為:172.17.0.2
同理,可以nginx容器ip為:172.17.0.3
可以看到他們有相同網段,他們都有相同的閘道器。
預設情況下,所有容器都是以bridge方式連線到Docker的一個虛擬網橋上:
/16
表示ip地址的前16位元不能動,也就是前兩段不能動;也就是這裡不能動。
容器的網路IP其實是一個虛擬的IP,其值並不固定與某一個容器繫結,如果我們在開發時寫死某個IP,而在部署時很可能MySQL容器的IP會發生變化,連線會失敗。
所以,我們必須藉助於docker的網路功能來解決這個問題,官方檔案:
https://docs.docker.com/engine/reference/commandline/network/
常見命令有:
命令 | 說明 | 檔案地址 |
---|---|---|
docker network create | 建立一個網路 | docker network create |
docker network ls | 檢視所有網路 | docs.docker.com |
docker network rm | 刪除指定網路 | docs.docker.com |
docker network prune | 清除未使用的網路 | docs.docker.com |
docker network connect | 使指定容器連線加入某網路 | docs.docker.com |
docker network disconnect | 使指定容器連線離開某網路 | docker network disconnect |
docker network inspect | 檢視網路詳細資訊 | docker network inspect |
docker network ls
docker network create sjdwz_network
再次檢視網路:
通過
ip addr
檢視如下:
可以看到多出來一個網路卡;
讓MySQL容器加入網路,並指定別名db
# mysql容器,指定別名為db,另外每一個容器都有一個別名是容器名
docker network connect sjdwz_network mysql --alias db
把我們的dd容器也加入到網路,不指定別名
docker network connect sjdwz_network dd
注意 容器建立時連線網路可以如下操作:可以加--network 網路名
加入,比如:
docker run -d --name dd -p 8080:8080 --network sjdwz_network docker-demo:1.0
進入到dd容器
docker exec -it dd bash
ping Mysql
ping mysql
驗證可以連通:
所以: