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

无法从docker连接到mongodb实例:连接被拒绝,mongodb,docker,docker-compose,pymongo,mongokit,Mongodb,Docker,Docker Compose,Pymongo,Mongokit,我正在使用docker compose创建一个多容器环境,其中有一个mongodb实例和两个python应用程序。问题是,第一个应用程序能够建立到mongodb的连接,而第二个应用程序失败,出现以下错误: File "/usr/local/lib/python2.7/site-packages/pymongo/mongo_client.py", line 377, in __init__ notification_1 | raise Con

我正在使用docker compose创建一个多容器环境,其中有一个mongodb实例和两个python应用程序。问题是,第一个应用程序能够建立到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连接到数据库。以下是建立连接的代码:

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)

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,让您更轻松

web、db和通知可以放在同一docker网络上。 您可以指定每个容器的IP。然后,将这些IP存储在环境变量中。您可以对端口执行相同的操作

connection=connection(process.env.MONGODB_主机,app.config['MONGODB_端口]]

以下命令将创建db_网络:


docker网络创建db_网络——子网172.16.0.0/24

下面是修订版3 docker-compose.yml文件。请注意,环境变量使用我们为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

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

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:

可能的竞争条件。您是否在数据库准备就绪之前启动一个系统?我不会使用环境变量。只需使用
MONGODB\u HOST=“db”
但这大概不是问题所在。是的,你是对的。尝试了很多次都没用。你能发布一下你是如何创建
db\u net
网络的吗?docker network create db\u net——子网172.16.0.0/16这既不是问题,也不是解决方案。哦,呸。这是我的问题很多次了。我希望对你来说也是这么简单嗯!不需要链接到“db”或根级别的“卷”?这也不能解决当前的问题。不过,我已根据您的建议更新了我的撰写文件a/c。网络是将容器链接在一起的新方法(第3版)。因此,您更改了
MONGODB_HOST=process.env.MONGODB_HOST
?很抱歉,我意识到您在使用python…尝试使用mongo驱动程序直接连接到MONGODB(排除该连接代码)…这符合更好的docker约定,并且更具可移植性。