Я хочу запустить два экземпляра mysql, используя docker-compose.
Я запускаю MySQL в контейнере Docker, и у меня есть еще один контейнер Docker с скриптом python для доступа к базе данных MySQL.
Один работает отлично на порту 3306. Для того, чтобы получить две рабочие, я думал, что просто запустил другой на другом порту. Но когда я меняю его на другой порт (например, 6603), но когда я это делаю, я получаю следующую ошибку:
mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on 'mysql:6603' (111 Connection refused)
Я прочитал каждый вопрос, чтобы найти, что кажется актуальным, но ни одно из решений не работает. Я уверен, что исправление будет связано с изменением одной или двух конфигураций, но я потратил много часов на это, так что любая помощь будет очень признательна.
Ниже приведен скрипт для сборки докеров (отлично работает, если 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')
В конце концов нашли пару способов, которые работают. Самый удобный для каждого приложения - создать сеть и подключить к ней контейнеры.
Если каждое приложение использует другую сеть, то mysql может работать на 3306 в этой сети Docker и может быть обращено на mysql://3306 из app1 и mysql2://3306 из app2. (Предполагая, что вы даете mysql-сервис для приложения 2, это 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 для второго приложения идентичен, за исключением того, что имена разные (для простоты я добавляю по два для каждого).
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
Попробуйте указать другой порт для MySQL, изменив его файл my.cnf
.
"6603:3306"
.