У меня есть проект с приложением 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.
Развертывание сработало, но только одно приложение доступно на порту 80, хотя я указал другой порт, а другое приложение недоступно, я перепробовал все.
Вы можете настроить веб-приложения и приложения 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), а все остальное пусть выполняет внутренняя связь.Развернуто успешно: