docker 完成后无法连接到 mysql 数据库
Cannot connect to mysql db after docker compose up
我创建了一个带有 mysql 数据库的容器,并且与 .net
应用程序的手动连接效果很好。现在我会使用 docker-compose
自动构建 mysql 容器和我的 .net
应用程序映像。
我的 docker 撰写看起来像那样。
version: '3.1'
networks:
overlay:
services:
authentication_service:
image: authentication_service:latest
depends_on:
- "authentication_service_db"
- "adminer"
build:
context: .
dockerfile: Dockerfile
links:
- authentication_service_db
ports:
- "5003:80"
networks:
- overlay
authentication_service_db:
image: mysql:8.0.3
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: authenticationdb
ports:
- 3305:3306
restart: always
volumes:
- ./data-authentication:/var/lib/mysql
networks:
- overlay
当我在开发中启动应用程序时,连接字符串被打印出来,看起来像 server=localhost;Port=3305;Database=authenticationdb;Uid=root;Pwd=secret
。这行得通。
当我 运行 docker-compose up -d --build
它改变了:
server=authentication_service_db;Port=3305;Database=authenticationdb;Uid=root;Pwd=secret;
我的连接测试脚本:
private static void WaitForDbInit(string connectionString)
{
var connection = new MySqlConnection(connectionString);
Console.WriteLine("Connecting with credentials: {0}", connectionString);
var retries = 1;
while (retries < 5)
{
try
{
Console.WriteLine("Connecting to db. Trial: {0}", retries);
connection.Open();
connection.Close();
break;
}
catch (MySqlException)
{
Thread.Sleep((int) Math.Pow(2, retries) * 1000);
retries++;
}
}
}
日志:
Connecting to db. Trial: 1
Connecting to db. Trial: 2
Connecting to db. Trial: 3
Connecting to db. Trial: 4
[...]
application startup exception: MySql.Data.MySqlClient.MySqlException (0x80004005): Unable to connect to any of the specified MySQL hosts.
at MySqlConnector.Core.ServerSession.ConnectAsync(ConnectionSettings cs, ILoadBalancer loadBalancer, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ServerSession.cs:line 299
appsettings.json:
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"MysqlConnection": {
"connectionString": "server=authentication_service_db;Port=3305;Database=authenticationdb;Uid=root;Pwd=secret;"
}
}
所以我不知道如何调试或接下来可以做什么。我在使用 docker 撰写时没有连接。
您将端口 3306 到 3305 映射到您开发应用程序的主机。因此,您可以连接到端口 3305 上的数据库。但是,您仍在容器内使用端口 3305。因为您的服务 (authentication_service_db) 正在侦听端口 3306,而不是 3305,所以您的应用程序无法连接到数据库。
您必须更改连接字符串以使用端口 3306,而不是 3305。
我创建了一个带有 mysql 数据库的容器,并且与 .net
应用程序的手动连接效果很好。现在我会使用 docker-compose
自动构建 mysql 容器和我的 .net
应用程序映像。
我的 docker 撰写看起来像那样。
version: '3.1'
networks:
overlay:
services:
authentication_service:
image: authentication_service:latest
depends_on:
- "authentication_service_db"
- "adminer"
build:
context: .
dockerfile: Dockerfile
links:
- authentication_service_db
ports:
- "5003:80"
networks:
- overlay
authentication_service_db:
image: mysql:8.0.3
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: authenticationdb
ports:
- 3305:3306
restart: always
volumes:
- ./data-authentication:/var/lib/mysql
networks:
- overlay
当我在开发中启动应用程序时,连接字符串被打印出来,看起来像 server=localhost;Port=3305;Database=authenticationdb;Uid=root;Pwd=secret
。这行得通。
当我 运行 docker-compose up -d --build
它改变了:
server=authentication_service_db;Port=3305;Database=authenticationdb;Uid=root;Pwd=secret;
我的连接测试脚本:
private static void WaitForDbInit(string connectionString)
{
var connection = new MySqlConnection(connectionString);
Console.WriteLine("Connecting with credentials: {0}", connectionString);
var retries = 1;
while (retries < 5)
{
try
{
Console.WriteLine("Connecting to db. Trial: {0}", retries);
connection.Open();
connection.Close();
break;
}
catch (MySqlException)
{
Thread.Sleep((int) Math.Pow(2, retries) * 1000);
retries++;
}
}
}
日志:
Connecting to db. Trial: 1
Connecting to db. Trial: 2
Connecting to db. Trial: 3
Connecting to db. Trial: 4
[...]
application startup exception: MySql.Data.MySqlClient.MySqlException (0x80004005): Unable to connect to any of the specified MySQL hosts.
at MySqlConnector.Core.ServerSession.ConnectAsync(ConnectionSettings cs, ILoadBalancer loadBalancer, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ServerSession.cs:line 299
appsettings.json:
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"MysqlConnection": {
"connectionString": "server=authentication_service_db;Port=3305;Database=authenticationdb;Uid=root;Pwd=secret;"
}
}
所以我不知道如何调试或接下来可以做什么。我在使用 docker 撰写时没有连接。
您将端口 3306 到 3305 映射到您开发应用程序的主机。因此,您可以连接到端口 3305 上的数据库。但是,您仍在容器内使用端口 3305。因为您的服务 (authentication_service_db) 正在侦听端口 3306,而不是 3305,所以您的应用程序无法连接到数据库。
您必须更改连接字符串以使用端口 3306,而不是 3305。