一,使用 --link容器互聯 html
docker 默認使容許container 互通的(經過-icc=false 關閉互通)同一個宿主機上的多個docker容器之間若是想進行通訊,能夠經過使用容器的ip地址來通訊,也能夠經過宿主機的ip加上容器暴露出的端口號來通訊,前者會致使ip地址的硬編碼,不方便遷移,而且容器重啓後ip地址會改變,除非使用固定的ip,後者的通訊方式比較單一,只能依靠監聽在暴露出的端口的進程來進行有限的通訊。經過docker的link機制能夠經過一個name來和另外一個容器通訊,link機制方便了容器去發現其它的容器而且能夠安全的傳遞一些鏈接信息給其它的容器。 node
格式 -link name:alias 命令鏈接指定container web
1,建立並啓動一個被鏈接的容器spring
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 pssql
2,修改主程序配置文件docker
# 生產配置 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一致)冒號後面的別名爲容器內部識別名稱,別名要與主程序配置文件一致json
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
由於不在一個網段,沒法訪問,經過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查看網絡設置
驗證能夠正常訪問的
三,總結
四,參考資料