Подключиться к MySQL контейнеру из Web Api .Net Core Container?Как получить IP-адрес? - PullRequest
0 голосов
/ 06 октября 2018

Я знаю, что это такая проблема noob, но у меня возникают проблемы с пониманием того, как подключить мой веб-сайт .Net Core к моему контейнеру MySql.Таким образом, некоторые фоны, и основной сайт MySql и .Net находятся в их отдельных контейнерахЯ уже запустил контейнер MySql и настроил учетную запись root для работы.Я использую Entity Framework внутри .Net Core проекта.

Я создал контейнер MySql с помощью этого оператора: docker run --name mysql_container -d -p 3306:3306

Ниже приведен dockerfile, сгенерированный для меня Visual Studio.

Итак, что мне сказать моему .Net CoreЗапрограммировать, является ли IP-адрес контейнера MySql, если IP-адрес может измениться?

Внутри .Net Core Program:

public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            var connection = $"Server={GetDBAddress()};Database=myDataBase;Uid=root;Pwd=root;";
            services.AddDbContext<ToDoContext>(options => options.UseMySQL(connection));
        }

Если я напишу функцию GetDBAddress, что там происходит?Я не могу просто вернуть localhost, потому что это другой докер-контейнер?На данный момент я пытаюсь использовать localhost, и я получаю отказано в соединении.Но я могу подключиться к базе данных MySql с помощью рабочей среды.

Также я не уверен, но можно ли объединить эти две установки в какой-то файл, который, я думаю, они называются файлами сборки docker?

Dockerfile

FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY ["ToDoService/ToDoService.csproj", "ToDoService/"]
RUN dotnet restore "ToDoService/ToDoService.csproj"
COPY . .
WORKDIR "/src/ToDoService"
RUN dotnet build "ToDoService.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "ToDoService.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "ToDoService.dll"]

1 Ответ

0 голосов
/ 06 октября 2018

Если вы запустили MySQL, открывая порты, вы сможете подключиться к нему, подключившись с localhost, с портом 3306.В противном случае, как вы предложили, есть возможность настроить docker-compose file.Этот файл обычно содержит всю конфигурацию, необходимую для запуска вашего приложения.Так, например, подходящая конфигурация для вашего приложения (примечание: я предполагаю, что вы используете MySQL 5.7, поскольку вы его не указали) может быть:

version: '3.3'

services: # list of services composing your application
   db: # the service hosting your MySQL instance
     image: mysql:5.7 # the image and tag docker will pull from docker hub
     volumes: # this section allows you to configure persistence within multiple restarts
       - db_data:/var/lib/mysql
     restart: always # if the db crash somehow, restart it
     environment: # env variables, you usually set this to override existing ones
       MYSQL_ROOT_PASSWORD: root
       MYSQL_DATABASE: todoservice
       MYSQL_USER: root
       MYSQL_PASSWORD: root
   todoservice: # you application service
     build: ./ # this tells docker-compose to not pull from docker hub, but to build from the Dockerfile it will find in ./
     restart: always
     depends_on: # set a dependency between your service and the database: this means that your application will not run if the db service is not running, but it doesn't assure you that the dabase will be ready to accept incoming connection (so your application could crash untill the db initializes itself)
       - db

volumes:
    db_data: # this tells docker-compose to save your data in a generic docker volume. You can see existing volumes typing 'docker volume ls'

Для запуска и развертывания приложенияТеперь вам нужно набрать в терминале: docker-compose up Это вызовет ваше развертывание.Обратите внимание, что здесь не отображаются никакие порты: только ваша служба сможет получить доступ к базе данных с номера db:3306 (вам не нужно обращаться по IP, но вы можете обращаться к другим службам, используя имя службы).В целях отладки вы все равно можете открыть свои порты БД, добавив эту строку в image:

ports:
  - "3306:3306"

Обратите внимание, что этот порт должен быть свободным (никакие другие системные службы не используют его), в противном случае все развертываниепотерпит неудачу.

Последнее замечание: поскольку docker-compose будет стараться избегать создания ваших образов каждый раз, когда вы запускаете службу, чтобы заставить ее создавать новую, вы должны добавить --build к docker-compose up команда.

Чтобы остановить развертывание, просто используйте docker-compose down.Чтобы удалить все постоянные данные, связанные с вашим развертыванием (т. Е. Начиная с новой базы данных), добавьте флаг -v в конце предыдущей команды.

Надеюсь, это поможет!

...