Настройте aspnetcore с базой данных MySQL в докере

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

Однако я не могу установить соединение с моей базой данных MySQL. Приложение продолжает возвращаться:

Невозможно подключиться к любому из указанных хостов MySQL

Приложение подключается через строку подключения в appsettings.json.

{
  "ConnectionStrings": {
    "FlowerAPIConnection": "server=localhost;userid=user;password=user;database=bloemenapi_db;Convert Zero Datetime=True"
  },
  "Logging": {
    "IncludeScopes": false,
    "Debug": {
      "LogLevel": {
        "Default": "Warning"
      }
    },
    "Console": {
      "LogLevel": {
        "Default": "Warning"
      }
    }
  }
}

Я предполагаю, что в контейнере Docker приложение и mysql не могут найти друг друга на локальном хосте. Я попытался использовать IP-адрес контейнера mysql в строке подключения, но это также не сработало.

Я использую следующие docker-compose.yml и Dockerfile.

version: '3'

services:
  db:
    image: mysql
    restart: always
    container_name: flowerapi-db
    environment:
      - MYSQL_USER=root
      - MYSQL_PASSWORD=user
      - MYSQL_ROOT_PASSWORD=user
      - MYSQL_DATABASE=bloemenapi_db
    ports:
      - "3306"

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: flowerapi-pma
    ports:
      - "81:80"
    external_links:
      - db:mysql
    environment:
      PMA_HOST: "db"
      PMA_PORT: 3306
  web:
    image: flowerapi
    container_name: flowerapi-web
    build:
      context: ./FlowerAPI
      dockerfile: Dockerfile
    ports:
      - "5000:80"
    links:
      - db
    depends_on:
      - db

Dockerfile

FROM microsoft/aspnetcore:2.0
LABEL name "flower-api"
ARG source
WORKDIR /app
EXPOSE 5000/tcp
COPY ${source:-obj/Docker/publish} .
ENTRYPOINT ["dotnet", "FlowerAPI.dll"]

Спасибо за вашу помощь.

4 ответа

Контейнер по умолчанию не позволяет никому входить на сервер в качестве пользователя root извне контейнера. Это не позволяет другим контейнерам (или хосту тоже) подключаться к базе данных (используя учетные данные root). Вы можете использовать флаг MYSQL_ROOT_HOST для передачи IP-адреса контейнера или хоста, который должен быть разрешен для подключения к серверу с корневыми учетными данными. Например. Чтобы разрешить хост подключаться, вы должны установить MYSQL_ROOT_HOST="172.17.0.1".

Также я вижу, что вы создали только пользователя root, но в строке подключения вы используете userid=user, Ты можешь использовать server=127.0.0.1 как имя хоста.

Попробуй это. Строка подключения немного отличается от MSSQL

"ConnectionStrings":{
        "FlowerAPIConnection":"Server=db;port=3306;Database=bloe‌menapi_db;User=user;Password=password;"
 }

Соединитель MySql необходим для подключения приложений.NET с MySql db. Вам нужно будет установить этот соединитель в вашем основном контейнере приложения asp.net

localhost находится внутри каждого контейнера, он не будет работать. Попробуйте подключиться с помощью db как имя хоста, так и порт 3306,

Другие вопросы по тегам