実現したいこと
docker(ubuntuイメージ)上のmysqlにホスト(Windows)で動かしたpythonからアクセスしたです。
いろいろ調べたのですが、解決できないため、ご教授お願い致します。
前提
docker上のmysqlを構築済みでポートの3306も開いています。
dockerは、Docker Desktopを使用し、実行はコマンドプロンプトからおこなっています。
コンテナ作成時は以下のコマンドを実行しています。
$docker run --name db -p 3306:3306 -it ubuntu bash
mysqlは以下のコマンドで構築しています。
その後作成したユーザーでデータベースとテーブルを作成しています。
$sudo apt install mysql-server $sudo service mysql start $sudo mysql $CREATE USER 'xxx'@'localhost' IDENTIFIED BY 'xxx';
ホスト(Windows)で動かしたpythonが以下のエラーになり接続できていない状況です。
バージョン
mysql = Server version: 8.0.32-0ubuntu0.22.04.2 (Ubuntu)
ホスト = Windows10
python = 3.9
mysql-connector-python = 8.0.32
エラー
Traceback (most recent call last): File "D:\connect_db.py", line 14, in <module> main() File "D:\\connect_db.py", line 6, in main conn=mysql.connector.connect(host="127.0.0.1", port=3306, database='xxx', user='xxx', password='xxxx') File "D:\python\lib\site-packages\mysql\connector\pooling.py", line 293, in connect return CMySQLConnection(*args, **kwargs) File "D:\python\lib\site-packages\mysql\connector\connection_cext.py", line 118, in __init__ self.connect(**kwargs) File "D:\python\lib\site-packages\mysql\connector\abstracts.py", line 1178, in connect self._open_connection() File "D:\python\lib\site-packages\mysql\connector\connection_cext.py", line 293, in _open_connection raise get_mysql_exception( mysql.connector.errors.OperationalError: 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
該当のソースコード
python
1import mysql.connector 2 3def main(): 4 5 6 conn=mysql.connector.connect(host="127.0.0.1", port=3306, database='portfolio', user='fia_user', password='4dpIu@8Mjbg') 7 cur = conn.cursor() 8 cur.close() 9 conn.close() 10 11 12 13if __name__=='__main__': 14 main()
試したこと
docker側
ポートが開いてることの確認
$ss -atn State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 70 127.0.0.1:33060 0.0.0.0:* LISTEN 0 151 127.0.0.1:3306 0.0.0.0:*
mysqlのconnect_timeout
を30に変更
mysql> SHOW GLOBAL VARIABLES LIKE '%timeout%'; +-----------------------------------+----------+ | Variable_name | Value | +-----------------------------------+----------+ | connect_timeout | 30 | | delayed_insert_timeout | 300 | | have_statement_timeout | YES | | innodb_flush_log_at_timeout | 1 | | innodb_lock_wait_timeout | 50 | | innodb_rollback_on_timeout | OFF | | interactive_timeout | 28800 | | lock_wait_timeout | 31536000 | | mysqlx_connect_timeout | 30 | | mysqlx_idle_worker_thread_timeout | 60 | | mysqlx_interactive_timeout | 28800 | | mysqlx_port_open_timeout | 0 | | mysqlx_read_timeout | 30 | | mysqlx_wait_timeout | 28800 | | mysqlx_write_timeout | 60 | | net_read_timeout | 30 | | net_write_timeout | 60 | | replica_net_timeout | 60 | | rpl_stop_replica_timeout | 31536000 | | rpl_stop_slave_timeout | 31536000 | | slave_net_timeout | 60 | | ssl_session_cache_timeout | 300 | | wait_timeout | 28800 | +-----------------------------------+----------+
ホスト側
3306への疎通確認
$Test-NetConnection localhost -port 3306 ComputerName : localhost RemoteAddress : ::1 RemotePort : 3306 InterfaceAlias : Loopback Pseudo-Interface 1 SourceAddress : ::1 TcpTestSucceeded : True
$netstat アクティブな接続 プロトコル ローカル アドレス 外部アドレス 状態 TCP 127.0.0.1:3306 kubernetes:61074 TIME_WAIT TCP 127.0.0.1:3306 kubernetes:61081 TIME_WAIT TCP 127.0.0.1:3306 kubernetes:61083 TIME_WAIT TCP 127.0.0.1:3306 kubernetes:61085 TIME_WAIT TCP 127.0.0.1:3306 kubernetes:61087 TIME_WAIT
ほかに、pythonのコードをdocker内で実行したら動くことが確認できました。

回答1件
あなたの回答
tips
プレビュー