Docker使用Link與newwork在容器之間創建鏈接

一,使用 --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
  • 默認加入到 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中尾部所訴,這裏具體緣由就不作研究了

四,參考資料

深刻理解docker的link機制

docker 基於link 的互聯

關於對docker run --link的理解

Docker網絡設置

問題&解決:Docker之DOCKER_OPTS參數不生效

Docker:網絡模式詳解

Docker基本命令與使用 —— Docker容器的網絡鏈接(四)

Docker系列教程16-network命令

docker network基礎

相關文章
相關標籤/搜索