Не удается подключиться к базе данных mysql после создания докера - PullRequest
2 голосов
/ 12 марта 2019

Я создал контейнер с базой данных mysql, и ручное соединение с приложением .net работает очень хорошо.Теперь я бы использовал docker-compose для автоматической сборки контейнера mysql и образа моего .net приложения.

Мой docker compose выглядит так.

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 compose.

1 Ответ

1 голос
/ 12 марта 2019

Вы сопоставили порт 3306 с 3305 своему хосту, на котором вы разрабатываете приложение.Таким образом, вы можете подключиться к базе данных через порт 3305. Однако вы все еще используете порт 3305 внутри контейнера.Поскольку ваша служба (authentication_service_db) прослушивает порт 3306, а не 3305, у вашего приложения возникают проблемы с подключением к базе данных.

Необходимо изменить строку подключения, чтобы использовать порт 3306 вместо 3305.

...