我想将 python3 连接到 Docker 容器上的 mysql(我使用 ubuntu 18.04)
这里是 docker-compose.yml
version: '3'
services:
# MySQL
db:
image: mysql:5.7
container_name: mysql_host
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test_database
MYSQL_USER: user
MYSQL_PASSWORD: pass
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
volumes:
- ./db/data:/var/lib/mysql
- ./db/initdb.d:/docker-entrypoint-initdb.d
- ./log/mysql:/var/log/mysql
ports:
- 3306:3306
networks:
- python-network
python3:
restart: always
build:
context: ./python
container_name: "python3"
working_dir: "/root/src"
tty: true
volumes:
- ./python:/root/src
links:
- db
networks:
python-network:
driver: bridge
然后,my.cnf 正在关注
# bind-address=127.0.0.1
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[client]
default-character-set=utf8mb4
user = user
password = pass
我检查容器正在运行。
user@ubuntu:/srv/docker/mysql$ sudo docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------------
mysql_host docker-entrypoint.sh mysql Up 0.0.0.0:3306->3306/tcp,:::3306->3306/tcp,33060/tcp
python3 python3 Up
然后我通过在mysql容器上执行'hostname -i'来查看mysql的ip地址。
然后我将 ip 地址添加到以下 python 脚本中。
使用以下脚本,python3尝试连接到mysql。
import mysql.connector
## create connection
if __name__=="__main__":
conn = mysql.connector.connect(
host='192.168.64.2',
port='3306',
user='docker',
password='docker',
database='test_database')
print(conn.is_connected())
但是出现错误
~/src # python3 main.py
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/mysql/connector/network.py", line 574, in open_connection
self.sock.connect(sockaddr)
ConnectionRefusedError: [Errno 111] Connection refused
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "main.py", line 11, in <module>
database='test_database')
File "/usr/local/lib/python3.7/site-packages/mysql/connector/__init__.py", line 273, in connect
return MySQLConnection(*args, **kwargs)
File "/usr/local/lib/python3.7/site-packages/mysql/connector/connection.py", line 107, in __init__
self.connect(**kwargs)
File "/usr/local/lib/python3.7/site-packages/mysql/connector/abstracts.py", line 1003, in connect
self._open_connection()
File "/usr/local/lib/python3.7/site-packages/mysql/connector/connection.py", line 350, in _open_connection
self._socket.open_connection()
File "/usr/local/lib/python3.7/site-packages/mysql/connector/network.py", line 580, in open_connection
_strioerror(err),
mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on '192.168.64.2:3306' (111 Connection refused)
那你能告诉我怎么解决吗。
答案 0 :(得分:1)
您的 mysql 容器正在 python-network
网络上运行。但是您的 python3 容器没有在 python-network
上运行。将 python-network
添加到 python3 容器,
python3:
restart: always
build:
context: ./python
container_name: "python3"
working_dir: "/root/src"
tty: true
volumes:
- ./python:/root/src
links:
- db
networks:
- python-network