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.