主机可以连接mysql容器不能_Mariadb docker容器无法用Python连接到主机上的MySQL服务器(111连接被拒绝)(Mariadb docker container Can't co...

令狐嘉禧
2023-12-01

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.

 类似资料: