天天看點

主機可以連接配接mysql容器不能_Mariadb docker容器無法用Python連接配接到主機上的MySQL伺服器(111連接配接被拒絕)(Mariadb docker container Can't co...

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.