Развертывание Docker Compose в Azure

У меня есть проект с приложением MVC, подключенным к другому приложению API, которое отвечает за получение данных. Я создал компакт-диск ci для сборки и отправки образов в реестр контейнеров Azure, и он работает. Затем я создал файл компоновки Docker с обоими изображениями и пытаюсь развернуть этот файл компоновки Docker в Службе приложений как веб-приложение. Развертывание сработало, но только одно приложение доступно на порту 80, хотя я указал другой порт, а другое приложение недоступно, я перепробовал все. Ниже приведен мой файл компоновки докера:

version: '3.4'

services:

  appdbtest:
    container_name: app-dbtest
    image: mcr.microsoft.com/mssql/server:2019-latest
    ports:
      - 8002:1433
    environment:
      - ACCEPT_EULA=Y
      - SA_PASSWORD=password@12345#

  web_app:
    image: testapp00.azurecr.io/web:1.6
    ports:
      - 7286:81


  api_app:
    image: testapp00.azurecr.io/api:3.1
    ports:
      - 7205:82
    depends_on:
      - appdbtest
    environment:
      - DB_HOST=appdbtest
      - DB_NAME=AssessmentEngineer3Api
      - DB_SA_PASSWORD=password@12345#

Попробовал развернуть файл компоновки Docker в веб-приложении службы приложений Azure. Пытался получить доступ к API с помощью локального хоста, развернутого доменного имени приложения, внутреннего IP-адреса приложения, ничего не работает. Интерфейс не может связаться с API через порт 7205.

Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
0
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Развертывание сработало, но только одно приложение доступно на порту 80, хотя я указал другой порт, а другое приложение недоступно, я перепробовал все.

  • При развертывании нескольких контейнеров с помощью Docker Compose в Службе приложений Azure только один контейнер может быть напрямую доступен к Интернету, и он будет доступен через порт по умолчанию 80. Это связано с тем, что Служба приложений Azure для контейнеров предназначена для предоставления только одного порта. в Интернет.

Вы можете настроить веб-приложения и приложения API для внутреннего взаимодействия с использованием внутренней сети Docker.

Это помогает контейнерам взаимодействовать внутри, не подвергая приложение API общедоступному Интернету. В файле Docker Compose web_app можно связаться с api_app, используя имя службы и внутренний порт.

докер-compose.yml:

version: '3.4'

services:

  appdbtest:
    container_name: app-dbtest
    image: mcr.microsoft.com/mssql/server:2019-latest
    ports:
      - 8002:1433
    environment:
      - ACCEPT_EULA=Y
      - SA_PASSWORD=your_db_password
  
  web_app:
    image: testapp00.azurecr.io/web:1.6
    ports:
      - 80:81
    environment:
      - API_URL=http://api_app:82
  
  api_app:
    image: testapp00.azurecr.io/api:3.1
    depends_on:
      - appdbtest
    environment:
      - DB_HOST=appdbtest
      - DB_NAME=your_db_name
      - DB_SA_PASSWORD=your_db_password

Внутри контейнеров:

  • web_app: доступ к api_app через http://api_app:82.
  • api_app: доступ к appdbtest через appdbtest:1433.

Здесь у меня есть клиентское приложение Angular, и я могу отправлять http-запросы с web_app на api_app.

среда.ц:

// environment.ts
export const environment = {
  production: false,
  apiUrl: 'http://api_app:82'
};

компонент.ts

import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { environment } from '../environments/environment';

@Injectable({
  providedIn: 'root'
})
export class ApiService {
  private apiUrl = environment.apiUrl;

  constructor(private http: HttpClient) {}

  getData() {
    return this.http.get(`${this.apiUrl}/your_api_endpoint`);
  }
}

Вот настройка приложения API (бэкэнд .NET) api_app, которое подключается к appdbtest

appsettings.json:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=appdbtest;Database=your_db_name;User Id=sa;Password=your_db_password;"
  }
}

Программа.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
}
  • Публикуйте только необходимую службу (например, web_app на порту 80), а все остальное пусть выполняет внутренняя связь.

Развернуто успешно:

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

Похожие вопросы

Как использовать токен доступа для создания сеанса клерка?
Не удается загрузить файл в исходную группу Azure Front Door из-за задержки?
Как получить метаданные (список общих файловых ресурсов) учетной записи хранения и настроить действие копирования данных для копирования черно-белых учетных записей хранения в ADF?
Дополнительные файлы (блочные BLOB-объекты), создаваемые при копировании хранилища BLOB-объектов в ADF
Невозможно найти модуль «../server/require-hook» Развертывание веб-приложения Nextjs Azure с помощью действий GitHub
Как очистить определенную папку при развертывании в эту папку с помощью «az webapp Deploy»
Приложение Nuxt 3 развернуто в Azure. Переменные среды игнорируются в разделе nitro файла nuxt.config.ts
SQL позволяет вставлять повторяющиеся данные, когда две вставки выполняются почти одновременно
Чтение настроек диагностики Azure Entra ID
Конечная точка диспетчера трафика Azure: следующие местоположения, указанные в свойстве geoMapping для конечной точки, не поддерживаются