2017-05-17 132 views
1

我有2個docker容器,它們都包含mysql數據庫,並且我爲每個容器打開端口3305,3306。 enter image description hereDocker + MYSQL:無法訪問容器外的mysql

爲3306:3306的容器,我可以

from sqlalchemy import create_engine 
from sqlalchemy.orm import sessionmaker 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import Column, Integer, Numeric, String 

import os 
cwd = os.getcwd() 
import sys 
sys.path.insert(0, cwd + '/vatic-docker/vatic') 
#from models import * 

engine = create_engine('mysql://root:1111' '@172.17.0.2:3306/vatic') 
Session = sessionmaker (bind = engine) 
session = Session() 

Base = declarative_base() 

在容器外部訪問它可是我無法訪問3305:由

engine = create_engine('mysql://root:1111' '@172.17.0.3:3306/vatic') 

這回3306集裝箱的MySQL數據庫我錯誤信息:

sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError) (2003, "Can't connect to MySQL server on '172.17.0.3' (111)") 

我現在應該怎麼做?

回答

3

連接字符串中的端口是錯誤的

所以

engine = create_engine('mysql://root:1111' '@172.17.0.3:3306/vatic') 

應該

engine = create_engine('mysql://root:[email protected]<host IP>:3305/vatic') 

因爲3305是,你暴露在主機上的端口

特別是如果Docker主機有IP地址192.168.2.100那麼連接應該是-p

engine = create_engine('mysql://root:[email protected]:3305/vatic') 

格式HOSTPORT:containerPort

https://docs.docker.com/engine/reference/commandline/run/#publish-or-expose-port--p---expose

+0

我都試一下。我認爲'0.0.0.0:3305 - > 3306/tcp'意思是'3306'是我公開給主機的端口 – pwan

+0

不,這意味着你正在將主機端口3305上的請求轉發到容器端口3306。連接字符串也似乎是不正確的。編輯答案。 –

+0

我不明白。 'engine = create_engine('mysql:// root:[email protected]:3305/vatic')'對我不起作用。我需要修改容器端口或? – pwan