无法连接到docker的mongodb实例:连接被拒绝

我正在使用docker-compose创build一个多容器环境,其中有一个mongodb实例和两个python应用程序。 问题是,第一个应用程序能够build立到mongodb的连接,而第二个应用程序失败,出现以下错误:

File "/usr/local/lib/python2.7/site-packages/pymongo/mongo_client.py", line 377, in __init__ notification_1 | raise ConnectionFailure(str(e)) notification_1 | pymongo.errors.ConnectionFailure: [Errno -2] Name or service not known 

我的项目结构:

 . ├── docker-compose.yml ├── form │  ├── app.py │  ├── Dockerfile │  ├── requirements.txt │  ├── static │  └── templates │  ├── form_action.html │  └── form_sumbit.html ├── notify │  ├── app.py │  ├── Dockerfile │  ├── requirements.txt └── README 

这是我更新的docker-compose.yml文件:

 version: '3' services: db: image: mongo:3.0.2 container_name: mongo networks: db_net: ipv4_address: 172.16.1.1 web: build: form command: python -u app.py ports: - "5000:5000" volumes: - form:/form environment: MONGODB_HOST: 172.16.1.1 networks: db_net: ipv4_address: 172.16.1.2 notification: build: notify command: python -u app.py volumes: - notify:/notify environment: MONGODB_HOST: 172.16.1.1 networks: db_net: ipv4_address: 172.16.1.3 networks: db_net: external: true volumes: form: notify: 

第一个应用程序基于Flask并使用mongokit连接到数据库。 以下是build立连接的代码:

 MONGODB_HOST = os.environ['DB_PORT_27017_TCP_ADDR'] MONGODB_PORT = 27017 app = Flask(__name__) app.config.from_object(__name__) # connect to the database try: connection = Connection(app.config['MONGODB_HOST'], app.config['MONGODB_PORT']) except ConnectionFailure: print("Connection to db failed. Start MongoDB instance.") sys.exit(1) 

第二个应用程序是一个简单的Python应用程序。 连接的代码如下所示:

 MONGODB_HOST = os.environ['DB_PORT_27017_TCP_ADDR'] MONGODB_PORT = 27017 connection = Connection(MONGODB_HOST, MONGODB_PORT) 

是否有一个原因,你显式指定的所有服务的IP地址,加上数据库服务的容器名称? 我build议删除它们,并使用服务名称来连接在同一networking上的容器。

 version: '3' services: db: image: mongo:3.0.2 networks: - db_net web: build: form command: python -u app.py ports: - "5000:5000" volumes: - form:/form environment: MONGODB_HOST: db networks: - db_net notification: build: notify command: python -u app.py volumes: - notify:/notify environment: MONGODB_HOST: db networks: - db_net networks: db_net: volumes: form: notify: 

您的docker-compose.yml文件格式不正确

 notification: build: notify command: python -u app.py volumes: - notify:/notify links: - db 

这一部分有太多的空间。 它应该是2个空格,就像你的文件的其余部分

 notification: build: notify command: python -u app.py volumes: - notify:/notify links: - db 

yaml对格式化非常挑剔

我会尝试使用Docker-compose的最新版本3来让你更容易。

networking,数据库和通知可以放在同一个dockernetworking上。 您可以指定每个容器的IP。 然后,将这些IP存储在一个环境variables中。 你可以为港口做同样的事情。

在这里输入图像说明

connection = Connection(process.env.MONGODB_HOST, app.config['MONGODB_PORT']

以下命令将创builddb_netnetworking:

docker network create db_net --subnet 172.16.0.0/24

这是修订版本3 docker-compose.yml文件。 注意环境variables使用我们为mongo容器定义的IP地址。

 version: '3' services: db: image: mongo container_name: mongo networks: db_net: ipv4_address: 172.16.1.1 web: build: form command: python -u app.py ports: - "5000:5000" volumes: - form:/form environment: MONGODB_HOST: 172.16.1.1 networks: db_net: ipv4_address: 172.16.1.2 notification: build: notify command: python -u app.py volumes: - notify:/notify environment: MONGODB_HOST: 172.16.1.1 networks: db_net: ipv4_address: 172.16.1.3 networks: db_net: external: true