前面都一直專注在外部要來存取某一容器服務的存取行為,但現實生活並不會只有單一容器獨立的生存,容器與容器之間相互間也會需要溝通的,就跟我們一直熟知多台虛擬機器之間的網路服務溝通行為一樣。
本次的實作會在來源容器和目的容器間透過linking
建立一個隧道,讓目的端容器可以接收到來源容器而給予相對回應。
但本次是單台Host(Ununtu宿主機上)多個容器
間通訊,如下圖所示,這樣就很好理解。
系統互相連接主要是依容器的命名來對應執行,所以首要就需要自訂一組容器名稱,而自訂容器名稱有以下兩點好處:
docker run -d -P --name prodecweb training/webapp python app.py
docker ps -l
docker inspect -f "{{ .Name }}" ff9a8930a47c
docker rm -f prodecweb
建立網站並把網站自動隨機指派一組連接埠公開
檢視一下建立好的網站容器名稱
正式綁定Link前,目的端資料庫因為還沒有建立就把網站給先建了,故移除等資料庫建立好再綁定建立
docker run -d --name prodecdb training/postgres
docker ps -l
docker inspect -f "{{ .Name }}" 7fa95ede5ab8
建立資料庫但是不把連接埠對外公開
同樣檢視一下建立好的資料庫容器名稱
docker run -d -P --name prodecweb --link prodecdb:prodecdb training/webapp python app.py
docker ps
前端網站容器和資料庫容器就互相建立關聯綁定,Docker在兩個容器間建立了一組安全通道,而不對外暴露連接埠到宿主機上。
故在啟動執行資料庫容器時並沒有用-p或-P讓服務對外網路,保持一個合規的安全環境。
docker exec -it 049b92528e27 /bin/bash
awk 'END{print $1}' /etc/hosts 查看自己的IP位址
apt-get install -yqq inetutils-ping 預設沒有Ping模組,透過此指令安裝
ping prodecweb 直接ping資料庫名稱是有通的
cat /etc/hosts
檢視正式環境的網站容器的確有兩筆,除了自己外還綁定了資料庫容器並顯示IP位址
我們來驗證一下如果不透過Link實際綁定是否在同個宿主機上下的容器其實互相網路仍然就是互通的。
docker run -d -P --name uatecweb training/webapp python app.py
docker ps
cat /etc/hosts
ping prodecdb
透過進入到uatecweb容器內檢視並無任何預設的Link紀錄綁定,如法泡製ping prodecdb的確是完全網路隔離的環境,無法解析,這樣就沒錯了。