我正在尝试使用python程序连接到mysql db。在本地运行时有效。
但是在对我创建的应用程序进行docker化时,一个容器用于python代码,另一个容器用于mysql数据库,以这种方式运行时,它无法连接。
Python_code:
db.bind(provider='mysql', user='docker_root', password='password', host='db', database=database, port = 3306)
docker-compose:
version: "3"
services:
app:
image: app:latest
links:
- db
ports:
- "8001:8081"
environment:
- DB_HOST= db
db:
image: mysql:5.7.26
restart: always
environment:
MYSQL_DATABASE: 'my_db'
MYSQL_USER: 'docker_root'
MYSQL_PASSWORD: 'password'
MYSQL_ROOT_PASSWORD: 'password'
ports:
- "3306:3306"
volumes:
- ./DB_config/:/etc/mysql/mysql.conf.d
docker-compose up因错误而失败:
pony.orm.dbapiprovider.OperationalError:(2003年,“无法连接到 'db'上的MySQL服务器([Errno 111]连接被拒绝)“)
我要去哪里错了?请指教!
答案 0 :(得分:1)
尝试使用容器端口3306
-
db.bind(provider='mysql', user='docker_root', password='password', host='db', database=database, port = 3306)
此外,添加depends_on
属性,您可以删除links
属性-
depends_on:
- db
答案 1 :(得分:1)
您可以使用已接受答案中提到的depends_on标志。如果不能解决您的问题,请使用此方法。
启动容器后,您的服务器将尝试连接到数据库服务器。有时数据库服务器可能需要一些时间才能启动,并且在此窗口中,如果服务器尝试连接到数据库服务器,它将面临问题。 如果连接失败,请尝试添加逻辑以在几秒钟后重新连接数据库服务器。
function InitializeConfetti() {
canvas.style.display = 'block';
particles = [];
animationComplete = false;
for (var i = 0; i < mp; i++) {
var particleColor = particleColors.getColor();
particles.push(new confettiParticle(particleColor));
}
setTimeout(function() {
StartConfetti();
}, 29000);
}
答案 2 :(得分:1)
我建议您退出应用程序,以防它无法连接到MySQL并将重启策略设置为始终,因为depends_on
不能保证app
启动时MySQL会完全启动,但是在那里很高兴。
version: "3"
services:
app:
image: app:latest
restart: always
links:
- db
ports:
- "8001:8081"
environment:
- DB_HOST= db
depends_on:
- db
db:
image: mysql:5.7.26
restart: always
environment:
MYSQL_DATABASE: 'my_db'
MYSQL_USER: 'docker_root'
MYSQL_PASSWORD: 'password'
MYSQL_ROOT_PASSWORD: 'password'
ports:
- "3306:3306"
volumes:
- ./DB_config/:/etc/mysql/mysql.conf.d
您的应用程序代码应类似于:
try:
db.bind(provider='mysql', user='docker_root', password='password', host='db', database=database, port = 3306)
except:
# write some logs
exit(1)