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

问题描述:

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

I am using docker-compose to create a multi-container environment where I have one mongodb instance and two python applications. The problem is, the first application is able to establish a connection to mongodb whereas the second application fails with the following error:

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文件:

Here is my [updated] docker-compose.yml file:

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连接到数据库.这是建立连接的代码:

The first application is based on Flask and uses mongokit to connect to the database. Here is the code to establish the connection:

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应用程序.连接的代码如下:

The second app is a simple python application. The code for conection is as follows:

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

是否存在为所有服务显式指定IP地址以及db服务的容器名称的原因?我建议删除它们,并使用服务名称在同一网络上的容器之间进行连接.

Is there a reason why you're explicitly specifying IP addresses for all the services, plus the container name for the db service? I'd suggest dropping them and using the service names to connect between containers on the same network.

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: