我想使用docker-compose运行两个mysql实例。
我在Docker容器中运行MySQL,并且我有另一个运行python脚本的Docker容器来访问MySQL数据库。
一个在端口3306上工作正常。为了让两个工作,我想我会在另一个端口上运行另一个。但是当我将其更改为不同的端口(例如6603)时,但是当我这样做时,我得到以下错误:
mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on 'mysql:6603' (111 Connection refused)
我已经阅读了s.o上的每一个问题。我觉得这似乎很相关,但没有一个解决方案有效。我确信修复将涉及更改一行或两行配置,但到目前为止我花费了很多时间,所以任何帮助都将非常感激。
下面是docker-compose脚本(如果6603被替换为3306,则工作正常。)
server:
build:
context: ../
dockerfile: Docker/ServerDockerfile
ports:
- "8080:8080"
links:
- mysql:mysql
volumes:
- ../py:/app
tty: true
mysql:
image: mysql
expose:
- "6603"
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: project
volumes:
- ./MySQL:/docker-entrypoint-initdb.d
- ./MySQL/data:/var/lib/mysql
它的访问方式如下:
cnx = mysql.connector.connect(user='root', password='password',
host='mysql',
port="6603",
database='project')
答案 0 :(得分:0)
尝试通过修改其my.cnf
文件为MySQL指定另一个端口。
答案 1 :(得分:0)
最终找到了几种有效的方法。最好的一个是每个应用程序创建一个网络并将容器连接到它。
如果每个应用程序使用不同的网络,则mysql可以在该Docker网络上的3306上运行,并且可以在app1上的mysql:// 3306和app2的mysql2:// 3306上访问。 (假设你的名字你给app 2的mysql服务是mysql2)。
带有新行的Docker文件如下:
server:
build:
context: ../
dockerfile: Docker/ServerDockerfile
ports:
- "8080:8080"
volumes:
- ../py:/app
tty: true
networks:
-net
mysql2:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: project
volumes:
- ./MySQL:/docker-entrypoint-initdb.d
- ./MySQL/data:/var/lib/mysql
networks:
-net
networks:
net:
driver: bridge
第二个应用程序的Docker文件是相同的,只是名称不同(为简单起见,我在每个之后放了2个。)
server2:
build:
context: ../
dockerfile: Docker/ServerDockerfile
ports:
- "8081:8080"
volumes:
- ../py:/app
tty: true
networks:
-net2
mysql2:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: project
volumes:
- ./MySQL:/docker-entrypoint-initdb.d
- ./MySQL/data:/var/lib/mysql
networks:
-net2
networks:
net2:
driver: bridge