Mariadb docker容器无法用Python连接到主机上的MySQL服务器(111连接被拒绝)(Mariadb docker container Can't connect to MySQL server on host (111 Connection refused) with Python)
我正在尝试使用docker-compose与python连接mariadb:
泊坞窗,compose.yml
version: '2'
services:
mariadb:
image: bitnami/mariadb
ports:
- "3306:3306"
environment:
MARIADB_DATABASE: 'mary_db'
MARIADB_USER: user2
MARIADB_PASSWORD: 'pass1234'
consumer:
build: ./consumer
links:
- mariadb
consumer.py
import mysql.connector as mariadb1
mariadb_connection = mariadb1.connect(host='mariadb',
port=3306,
user='user2',
password='pass1234',
database='mary_db')
cursor = mariadb_connection.cursor(buffered=True)
try:
cursor.execute('DROP TABLE names')
except:
pass
comm = "CREATE TABLE names(id VARCHAR(20), location VARCHAR(100)," \
"PRIMARY KEY (mac,location)) ENGINE=InnoDB"
cursor.execute(comm)
print 'created'
Dockerfile入口点只是调用consumer.py函数,如:
ENTRYPOINT python -u consumer.py
该问题非常随机(超过90%的试验),python代码无法连接数据库并输出此错误:
文件“consumer.py”,第7行,在database ='mary_db')文件“/usr/local/lib/python2.7/dist-packages/mysql/connector/init.py”,第179行,在连接返回MySQLConnection (* args,** kwargs)文件“/usr/local/lib/python2.7/dist-packages/mysql/connector/connection.py”,第95行,在init self.connect(** kwargs)File“/ usr / local / lib / python2.7 / dist-packages / mysql / connector / abstracts.py“,第719行,用于连接self._open_connection()文件”/usr/local/lib/python2.7/dist-packages/ mysql / connector / connection.py“,第206行,在_open_connection self._socket.open_connection()文件”/usr/local/lib/python2.7/dist-packages/mysql/connector/network.py“,第475行,在open_connection errno = 2003中,values =(self.get_address(),_strioerror(err)))mysql.connector.errors.InterfaceError:2003:无法连接到'mariadb:3306'的MySQL服务器(111连接被拒绝)
任何想法是怎么回事?
I am trying the connect mariadb with python using docker-compose:
docker-compose.yml
version: '2'
services:
mariadb:
image: bitnami/mariadb
ports:
- "3306:3306"
environment:
MARIADB_DATABASE: 'mary_db'
MARIADB_USER: user2
MARIADB_PASSWORD: 'pass1234'
consumer:
build: ./consumer
links:
- mariadb
consumer.py
import mysql.connector as mariadb1
mariadb_connection = mariadb1.connect(host='mariadb',
port=3306,
user='user2',
password='pass1234',
database='mary_db')
cursor = mariadb_connection.cursor(buffered=True)
try:
cursor.execute('DROP TABLE names')
except:
pass
comm = "CREATE TABLE names(id VARCHAR(20), location VARCHAR(100)," \
"PRIMARY KEY (mac,location)) ENGINE=InnoDB"
cursor.execute(comm)
print 'created'
The Dockerfile entrypoint is just calling the consumer.py function like:
ENTRYPOINT python -u consumer.py
The problem is very randomly (more than %90 of trials), python code cannot connect with database and prints this error:
File "consumer.py", line 7, in database='mary_db') File "/usr/local/lib/python2.7/dist-packages/mysql/connector/init.py", line 179, in connect return MySQLConnection(*args, **kwargs) File "/usr/local/lib/python2.7/dist-packages/mysql/connector/connection.py", line 95, in init self.connect(**kwargs) File "/usr/local/lib/python2.7/dist-packages/mysql/connector/abstracts.py", line 719, in connect self._open_connection() File "/usr/local/lib/python2.7/dist-packages/mysql/connector/connection.py", line 206, in _open_connection self._socket.open_connection() File "/usr/local/lib/python2.7/dist-packages/mysql/connector/network.py", line 475, in open_connection errno=2003, values=(self.get_address(), _strioerror(err))) mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on 'mariadb:3306' (111 Connection refused)
Any idea what is going on?
原文:https://stackoverflow.com/questions/42014344
更新时间:2019-12-25 23:06
最满意答案
问题不在于数据库或Python代码; 它是来自Docker的一个提升问题,因为数据库需要一些时间来加载,python(consumer.py)容器的启动速度比数据库快。
可能的解决方案:
码头工健康检查
码头工人的等待时间
给python用户添加一个延迟
The problem is not with Database or Python code; Its a raise problem coming from Docker, as database needs some time to load and python (consumer.py) container launches faster than database one.
Possible solutions:
docker healthcheck
waittime in docker
add a delay to the python consumer
2017-02-03
相关问答
Django是否在一个连接到Redis容器的单独容器中运行? 如果是这样,你应该有一些带有Ip和端口的环境变量,Django应该使用它来连接到Redis容器。 将BROKER_URL设置为使用redis Ip和port env vars,您应该开展业务。 同上RESULT_BACKEND。 env vars的参考文档在这里: Docker Compose docs 以下是我们如何在OfferUp的一个项目中使用自动添加的env变量的示例代码: BROKER_TRANSPORT = "redis"
...
最后,我想通了! 关键点是,正如@SangminKim所说,我需要在settings.py使用3306而不是3302 ,并使用db作为HOST而不是127.0.0.1 。 所以现在这是我的docker-compose.yml文件: version: '3'
services:
db:
image: mariadb:5.5
restart: always
environment:
- MYSQL_HOST=localhost
- MYSQL_PO
...
这是因为您试图从您的php容器到主机名localhost到达数据库服务器,该容器解析为php容器本身(与127.0.0.1相同)。 您应该将$servername变量更改为等于撰写文件中的mariadb服务名称,例如"mariadb" 。 在您的情况下,位于单个默认网络中的每个容器都通过其服务名称(以及其他内容)进行解析,这就是您不需要链接的原因,这些链接在某种程度上已被弃用。 另外(以防万一)确保您的数据库容器实际已启动并准备好接收连接。 第一次启动需要一段时间。 This is because
...
问题不在于数据库或Python代码; 它是来自Docker的一个提升问题,因为数据库需要一些时间来加载,python(consumer.py)容器的启动速度比数据库快。 可能的解决方案: 码头工健康检查 码头工人的等待时间 给python用户添加一个延迟 The problem is not with Database or Python code; Its a raise problem coming from Docker, as database needs some time to loa
...
在敲打我的脑袋之后我终于找到了答案,这是我的错误,因为没有在nova.conf中启用osapi_compute api。 Well after banging my head i finally found the answer and it was my error due to not enabling osapi_compute api in nova.conf.
这是一个端口和安全防火墙问题。 在您的安全组中打开端口3306和5000到world。 它会工作没有任何错误。 This is a port and security firewall issue. Open port 3306 and 5000 to world in your security group. It will work without any error.
尝试这个: r = requests.get('http://elasticsearch:9200/lr_index/book_info/_search', data=payload)
你正在web容器中运行python代码吗? localhost引用同一容器的loopback接口。 使用为同一网络中的容器实现DNS的用户定义网络。 这就是为什么你可以通过名字调用elasticsearch容器。 Try this: r = requests.get('http://elasticsearch:9
...
您收到的错误是由MariaDB认为您无权连接到服务器的事实造成的。 这意味着您尚未为Node.js应用程序创建数据库用户,或者该用户的授权不正确。 解决这个问题的简单方法是为Node.js应用程序创建一个单独的用户。 可以通过将以下SQL写入文件并将卷挂载到/docker-entrypoint-initdb.d来自动执行此/docker-entrypoint-initdb.d 。 CREATE USER 'my-app-user'@'%' IDENTIFIED BY 'my-app-passwor
...
运行容器时,您需要使用主机网络: docker run -ti -p 80:80 --net="host" IMAGE
然后,您可以使用localhost引用您的数据库: <?php
$host = '127.0.0.1';
$user = 'root';
$pass = '****';
$db = 'test';
$port = '3306';
你也可以使用--net =“bridge”选项,默认情况下,而不是“host”,但在这种情况下你需要找出主机的IP,并配置Mysql来监听文件中容
...
我认为您的端口号有误。 如果您想将其保留为默认值,请将该字段留空。 确认您输入的端口号是否正确。 I think there is a mistake in your port number. If you want to leave it to default please leave the field as blank. Verify that you are entering the correct port number.