Imansible connettersi all'istanza mongodb dal docker: Connessione rifiutata

Sto utilizzando compilatore docker per creare un ambiente multi-container in cui ho un'istanza mongodb e due applicazioni python. Il problema è che la prima applicazione è in grado di stabilire una connessione a mongodb mentre la seconda applicazione fallisce con il seguente errore:

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 

La mia struttura del progetto:

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

Ecco il mio file [aggiornato] 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: 

La prima applicazione si basa su Flask e utilizza mongokit per connettersi al database. Ecco il codice per stabilire la connessione:

 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) 

La seconda applicazione è un'applicazione semplice di python. Il codice di conection è il seguente:

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

C'è un motivo per cui indichi esplicitamente gli indirizzi IP per tutti i servizi, più il nome del contenitore per il servizio db? Ti suggerisco di abbandonarli e di utilizzare i nomi dei servizi per connettersi tra i contenitori della stessa 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: 

il file docker-compose.yml viene formattato in modo non corretto

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

ci sono troppi spazi in questa sezione. dovrebbe essere 2 spazi, come il resto del file

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

yaml è incredibilmente esigente circa la formattazione

Cercherò di utilizzare la versione 3 più recente di Docker-compose per rendere più semplice per te.

Il web, il db e la notifica possono essere messi alla stessa networking docker. È ansible specificare gli IP di each contenitore. Quindi, memorizzare questi IP in una variabile ambientale. È ansible fare la stessa cosa per la port.

immettere qui la descrizione dell'immagine

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

Il seguente command creerà la networking db_net:

docker network create db_net --subnet 172.16.0.0/24

Ecco il file riveduto 3 docker-compose.yml. Notare la variabile ambientale utilizza l'indirizzo IP definito per il contenitore mongo.

 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