问题
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
My project structure:
.
├── docker-compose.yml
├── form
│ ├── app.py
│ ├── Dockerfile
│ ├── requirements.txt
│ ├── static
│ └── templates
│ ├── form_action.html
│ └── form_sumbit.html
├── notify
│ ├── app.py
│ ├── Dockerfile
│ ├── requirements.txt
└── README
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:
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)
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)
回答1:
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:
回答2:
your docker-compose.yml file is formatted incorrectly
notification:
build: notify
command: python -u app.py
volumes:
- notify:/notify
links:
- db
there's too many spaces in this section. it should be 2 spaces, like the rest of your file
notification:
build: notify
command: python -u app.py
volumes:
- notify:/notify
links:
- db
yaml is incredibly picky about formatting
回答3:
I would try to use the latest version 3 of Docker-compose to make it easier for you.
The web, db, and notification can be put on to the same docker network. You can specify the IPs of each container. Then, store these IPs in an environmental variable. You can do the same thing for the port.
connection = Connection(process.env.MONGODB_HOST, app.config['MONGODB_PORT']
The following command will create the db_net network:
docker network create db_net --subnet 172.16.0.0/24
Here is the revised version 3 docker-compose.yml file. Notice the enviromental variable uses the IP address we defined for the mongo container.
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
来源:https://stackoverflow.com/questions/43428649/cannot-connect-to-mongodb-instance-from-docker-connection-refused