一,使用 --link容器互聯
docker 默認使允許container 互通的(通過-icc=false 關閉互通)同一個宿主機上的多個docker容器之間如果想進行通信,可以通過使用容器的ip地址來通信,也可以通過宿主機的ip加上容器暴露出的端口號來通信,前者會導致ip地址的硬編碼,不方便遷移,並且容器重啟后ip地址會改變,除非使用固定的ip,后者的通信方式比較單一,只能依靠監聽在暴露出的端口的進程來進行有限的通信。通過docker的link機制可以通過一個name來和另一個容器通信,link機制方便了容器去發現其它的容器並且可以安全的傳遞一些連接信息給其它的容器。
格式 -link name:alias 命令連接指定container
1,創建並啟動一個被連接的容器
docker run --name mypostgres_merry -d -p 5432:5432 -e POSTGRES_PASSWORD=123456 -e PGDATA=/data/ -e POSTGRES_USER=admin -e POSTGRES_DB=my_db postgres
查看容器名稱 docker ps

2,修改主程序配置文件
# 生產配置 server: port: 8081 spring: jpa: show-sql: true hibernate: ddl-auto: update properties: hibernate: jdbc: lob: non_contextual_creation: true datasource: driverClassName: org.postgresql.Driver url: jdbc:postgresql://db:5432/my_db username: admin password: 123456 initialization-mode: always #執行根目錄下面data.sql初始化數據 continue-on-error: false
3,啟動主程序並連接到另一個容器
docker run -d --name web --link mypostgres_merry:db -p 8081:8081 ejiyuan/demo-docker
注意,link后面的名字要必須是一個存在的容器名稱(與上圖中NAMES一致)冒號后面的別名為容器內部識別名稱,別名要與主程序配置文件一致
4,驗證
登錄到容器
docker exec -it node /bin/sh
執行 env 查看環境變量(或者使用: docker exec 16087e0f620a env),包含db相關配置參數

執行 ping db 可以ping通

使用了link機制后,可以通過指定的名字來和目標容器通信,這其實是通過給/etc/hosts中加入名稱和IP的解析關系來實現的,下面是名為web的容器中的/etc/hosts信息.

二,使用network互聯
1,查看docker網絡說明:
docker network ls

Docker內置這三個網絡,運行容器時,你可以使用該--network標志來指定容器應連接到哪些網絡。
1.1 Host:host相當於Vmware中的橋接模式,與宿主機在同一個網絡中,但沒有獨立IP地址
1.2 Container:在理解了host模式后,這個模式也就好理解了。這個模式指定新創建的容器和已經存在的一個容器共享一個Network Namespace,而不是和宿主機共享。新創建的容器不會創建自己的網卡,配置自己的IP,而是和一個指定的容器共享IP、端口范圍等。同樣,兩個容器除了網絡方面,其他的如文件系統、進程列表等還是隔離的。兩個容器的進程可以通過lo網卡設備通信。
1.3 None:該模式將容器放置在它自己的網絡棧中,但是並不進行任何配置。在容器並不需要網絡(例如只需要寫磁盤卷的批處理任務)使用該模式關閉了容器的網絡功能。
1.4 Bridge:相當於Vmware中的Nat模式,容器使用獨立network Namespace,並連接到docker0虛擬網卡(默認模式)。通過docker0網橋以及Iptables nat表配置與宿主機通信;bridge模式是Docker默認的網絡設置,此模式會為每一個容器分配Network Namespace、設置IP等,並將一個主機上的Docker容器連接到一個虛擬網橋上,除非你使用該docker run --network=<NETWORK>選項指定,否則Docker守護程序默認將容器連接到此網絡。
2,查看容器網絡配置
docker inspect 容器id
查看networks段配置

查看brigdge 網絡配置
docker network inspect bridge
結果如下:

3,創建網絡
docker network create --driver bridge new_net_1
--driver為網絡類型,后面“new_net_1”為網絡名稱,默認為bridge可以不指定--driver bridge
通過network inspect再次查看網絡

通過 inspect 查看,分配了一個新的ip段

4,啟動服務加入網絡
docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=123456 -e PGDATA=/data/ -e POSTGRES_USER=admin -e POSTGRES_DB=my_db --network new_net_1 postgres
使用inspect 查看網絡設置
docker inspect ba5e1d752bc9

5,啟動另一個程序服務加入網絡另一個網絡
docker run -d -t --name web -p 8081:8081 ejiyuan/demo-docker
- 默認加入到 bridge
- ejiyuan/demo-docker配置文件數據庫連接字符串為:jdbc:postgresql://172.25.0.2:5432/my_db 即上面啟動數據庫容器加入到new_net_1網絡的ip地址
因為不在一個網段,無法訪問,通過docker logs xxxx 輸出日志發現

6,修改配置文件連接字符串jdbc:postgresql://db:5432/my_db使用 --link連接
修改啟動參數
docker run -d -t --name web --link gracious_mcnulty:db -p 8081:8081 ejiyuan/demo-docker
服務無法啟動,錯誤如下:
Error response from daemon: Cannot link to /gracious_mcnulty, as it does not belong to the default network.
7,修改啟動參數加入同一個網絡
docker run -d -t --name web --net new_net_1 -p 8081:8081 ejiyuan/demo-docker
使用inspect查看網絡設置

驗證可以正常訪問的
三,總結
- 通過驗證發現docker network作用為分組隔離不同網絡環境中的各組應用
- 在都加入到“new_net_1”的情情況下,使用--link無法進行互通,在默認不指定網絡的情況下可以使用 --link 互通,介於下面參考資料1中尾部所訴,這里具體原因就不做研究了
四,參考資料
