5. Docker 容器通信實例

文章目錄

概述

問題描述:
現有 mongo, explorer 兩個實例分別使用 docker-compose.yml 啓動,這兩個實例在同一臺宿主機上,其中 explorer 需要與 mongo 通信,採用 DB_URL=host:port 是無法與 mongo 建立連接的。

問題分析:
每一個 docker-compose 啓動時,都會默認的使用一個 bridge 類型的網絡,由於 mongo 和 explorer 不是在同一個 docker-compose 中,所以這兩個實例是在兩個不同的網絡中,所以直接使用 DB_URL=host:port 是無法與 mongo 通信的。

解決方式:

方式一: 使 mongo 和 explorer 位於同一 network 中。

  1. 將 mongo 和 explorer 寫在同一個 docker-compose.yml 文件中,那麼這兩個實例就可以互相通信
  2. mongo 和 explorer 任可以不位於同一個 docker-compose 文件中,但在啓動時,需要顯示的聲明爲同一個 network。

方式二:更改 container 的 network_mode

將 mongo 和 exploer container 中的 network_mode 更改爲 host,在 explorer 中便可以使用 DB_URL=host:port 來和 mongo 通信。

但需注意,此種方式 container 是直接使用宿主機的 ip 和 port,有可能存在端口衝突的情況(容器內端口映射不再生效)

實例

1. 創建 network

docker network create net-erp

2. 需要相互通信的 container 使用同一 network

mongodb

version: '2'
services:
  erp-mongo:
    image: mongo
    container_name: erp-mongo
    ports:
      - "27217:27017"
    volumes:
      - /mnt/volumes/mongo-erp:/data/db
    networks:
      - net-mongo
    environment:
      MONGO_INITDB_ROOT_USERNAME: root_name
      MONGO_INITDB_ROOT_PASSWORD: root_password
networks:
  net-mongo:
    external:
      name: net-erp

explorer

version: "2"
services:
  erp-explorer:
    image: kaifei/erp_explorer:v1.0
    container_name: erp-explorer
    ports:
      - "9180:8080"
    networks:
      - net-explorer
    environment:
      - DB_URL=erp-mongo:27017
      - DB_USER=user
      - DB_PASSWORD=password
      - DB_DATABASE=db_name
      - CHAIN_ID=BEAN-eRp
networks:
  net-explorer:
    external:
      name: net-erp

說明:

  1. 同一 network 的 container 可以通過 container_name(或 ip) 互相通信,如 explorer 需要連接 mongodb,可通過如下方式:DB_URL=erp-mongo:27017
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章