簡體   English   中英

docker-compose 和與 Mongo 容器的連接

[英]docker-compose and connection to Mongo container

我正在嘗試根據以下 docker-compose.yml 文件創建 2 個容器。 問題是,如果我啟動 mongo 數據庫容器,然后在本地運行我的代碼(達到 127.0.0.1),那么一切都很好,但是如果我嘗試運行我的 api 容器並點擊它(參見 yml 文件),那么我得到連接被拒絕IE

172.29.0.12:27117:[Errno 111] 連接被拒絕,超時:30 秒,拓撲描述:<TopologyDescription id:60437a460a3e0fa904650e35,topology_type:Single,服務器:[<ServerDescription('172.29.0.12',27117)server_type:未知,rtt:無,錯誤=AutoReconnect('172.29.0.12:27117: [Errno 111] 連接被拒絕')>]>

請注意:我已將 mongo 設置為使用端口 27117 而不是 27017 我的應用程序是 Python Flask 應用程序,我以下列方式使用 PyMongo:

    try:
        myclient = pymongo.MongoClient('mongodb://%s:%s@%s:%s/%s' % (username, password, hostName, port, database))
        mydb = myclient[database]
        cursor = mydb["temperatures"]
        app.logger.info('Database connected to: ' + database)  
    except:
        app.logger.error('Error connecting to database')

讓我發瘋的是它在本地運行並通過容器成功訪問 mongo,但是一旦我在容器中嘗試應用程序,它就會失敗。

docker-compose.yml如下:

version: '3.7'
services:
  hotbin-db:
    image: mongo
    container_name: hotbin-db
    restart: always
    ports:
      # <Port exposed> : < MySQL Port running inside container>
      - '27117:27017'
    expose:
      # Opens port 3306 on the container
      - '27117'
    command: [--auth]
    environment:
      MONGO_INITDB_ROOT_USERNAME: ***
      MONGO_INITDB_ROOT_PASSWORD: ***
      MONGO_INITDB_DATABASE: ***
      MONGODB_DATA_DIR: /data/db
      MONDODB_LOG_DIR: /dev/null
      # Where our data will be persisted
    volumes:
      - /home/simon/mongodb/database/hotbin-db/:/data/db
        #- my-db:/var/lib/mysql
    # env_file:
    #   - .env
    networks:
      hotbin-net:
        ipv4_address: 172.29.0.12

  hotbin-api:
    image: scsherlock/compost-api:latest
    container_name: hotbin-api
    environment:
      MONGODB_DATABASE: ***
      MONGODB_USERNAME: ***
      MONGODB_PASSWORD: ***
      MONGODB_HOSTNAME: 172.29.0.12
      MONGODB_PORT: '27117'
    depends_on: 
      - hotbin-db
    restart: always
    ports:
      # <Port exposed> : < MySQL Port running inside container>
      - '5050:5050'
    expose:
      - '5050'
    networks:
      hotbin-net:
        ipv4_address: 172.29.0.13  

# # Names our volume
volumes:
  my-db:  

networks:
  hotbin-net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.29.0.0/16

使用 mongo 容器的服務名稱和標准端口 27017 而不是 27117(即使這是 docker-compose 文件中定義的內容)有效。 我想了解為什么

您的 docker 撰寫文件未將MongoDB配置為在端口 27117 上運行。如果您想讓它在 27117 上運行,則必須在 Z05B6053C41A2140AFD6FC3BEZDAB158 中更改此行

command: mongod --auth --port 27117

由於您沒有指定端口,MongoDB 將在默認端口 27017 上運行。

您的expose部分將容器端口 27117 公開給主機,但 Mongo 並未在該端口上運行,因此該行實際上什么也沒做。

您的ports部分將主機端口 27117 映射到容器端口 27017。這意味着如果您從主機連接,則可以連接到端口 27117,但這是連接到容器上的端口 27017。

現在到您的 python 程序。 由於它在容器網絡中運行,因此要連接 docker-compose 網絡中的服務,您可以通過服務名稱引用它們。

將這些放在一起,您的連接字符串將是: mongodb://hotbin-db:27017/yourdb?<options>

正如其他人所提到的,除非您非常需要. 您甚至不需要定義網絡,因為 docker-compose 創建了自己的內部網絡。

參考: https://docs.docker.com/compose/networking/

您是否使用 Windows 來運行容器? 如果是,則localhost被標識為容器的 localhost,而不是主機的 localhost。

因此,不要提供主機的 IP 地址,而是在 docker 容器內運行時嘗試以這種方式修改 mongodB 字符串:

試試這個: mongodb://host.docker.internal:27017/代替: mongodb://localhost:27017/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM