Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Rozszerzenie Dev Containers Visual Studio Code umożliwia zespołom deweloperów opracowywanie w środowisku konteneryzowanym, w którym wszystkie zależności są wstępnie skonfigurowane. W wersji Aspire 9.1 dodano logikę, aby ulepszyć obsługę w środowisku Aspire kontenera deweloperskiego, automatycznie konfigurując przekazywanie portów.
Przed Aspire 9.1 można użyć Aspire w kontenerze deweloperskim, jednak wymagana była bardziej ręczna konfiguracja.
Kontenery deweloperskie a GitHub Codespaces
Używanie usługi Dev Containers w systemie Visual Studio Code jest podobne do używania usługi GitHub Codespaces. W wersji Aspire 9.1 rozszerzono obsługę kontenerów deweloperskich w systemach Visual Studio Code i GitHub Codespaces. Chociaż doświadczenia są podobne, istnieją pewne różnice. Aby uzyskać więcej informacji na temat używania Aspire z GitHub Codespaces, zobacz Aspire i GitHub Codespaces.
Szybki start przy użyciu repozytorium szablonów
Aby skonfigurować kontenery deweloperskie w programie Visual Studio Code, użyj pliku _.devcontainer/devcontainer.json w repozytorium. Najprostszym sposobem rozpoczęcia pracy jest utworzenie nowego repozytorium na bazie naszego repozytorium szablonu. Rozważ następujące kroki:
Utwórz nowe repozytorium przy użyciu naszego szablonu.
Po podaniu szczegółów i wybraniu polecenia Utwórz repozytorium, repozytorium zostanie utworzone i wyświetlone w GitHub.
Sklonuj repozytorium na lokalną stację roboczą dewelopera przy użyciu następującego polecenia:
git clone https://github.com/<org>/<username>/<repository>Otwórz repozytorium w pliku Visual Studio Code. Po kilku chwilach Visual Studio Code wykryje plik devcontainer/devcontainer.json i wyświetli monit o otwarcie repozytorium wewnątrz kontenera. Wybierz dowolną opcję, która jest najbardziej odpowiednia dla przepływu pracy.
Po kilku chwilach lista plików stanie się widoczna i zostanie ukończona lokalna kompilacja kontenera deweloperskiego.
Otwórz nowe okno terminalu w Visual Studio Code (Ctrl+Shift+`) i utwórz nowy projekt Aspire przy użyciu wiersza polecenia
dotnet.dotnet new aspire-starter -n HelloAspirePo kilku chwilach projekt zostanie utworzony i przywrócone początkowe zależności.
Otwórz plik ProjectName.AppHost/AppHost.cs w edytorze i wybierz przycisk uruchamiania w prawym górnym rogu okna edytora.
Visual Studio Code kompiluje i uruchamia aplikację Aspire AppHost i automatycznie otwiera Aspire pulpit nawigacyjny. Ponieważ punkty końcowe hostowane w kontenerze używają certyfikatu z podpisem własnym, przy pierwszym dostępie do punktu końcowego dla określonego kontenera deweloperskiego pojawia się błąd certyfikatu.
Oczekiwany jest błąd certyfikatu. Po potwierdzeniu, że żądany adres URL odpowiada pulpitowi nawigacyjnemu w kontenerze deweloperskim, możesz zignorować to ostrzeżenie.
Aspire Automatycznie konfiguruje przekierowane porty tak, aby po wybraniu Aspire punktów końcowych na pulpicie nawigacyjnym były tunelowane do procesów i zagnieżdżonych kontenerów w kontenerze deweloperskim.
Zatwierdź zmiany w repozytorium GitHub
Po pomyślnym utworzeniu projektu Aspire i upewnieniu się, że został uruchomiony i można uzyskać dostęp do pulpitu nawigacyjnego, dobrym pomysłem jest zatwierdzenie zmian w repozytorium.
Ręczne konfigurowanie devcontainer.json
W poprzednim przewodniku przedstawiono usprawniony proces tworzenia kontenera deweloperskiego przy użyciu szablonu Aspire Dev Container. Jeśli masz już istniejące repozytorium i chcesz korzystać z funkcji kontenera deweloperskiego z Aspire, dodaj plik devcontainer.json do folderu .devcontainer w repozytorium.
└───📂 .devcontainer
└─── devcontainer.json
Repozytorium szablonów zawiera kopię pliku devcontainer.json, którego można użyć jako punktu początkowego, który powinien być wystarczający dla elementu Aspire. JSON Poniżej przedstawiono najnowszą wersję pliku .devcontainer/devcontainer.json z szablonu:
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/dotnet
{
"name": "Aspire",
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
"image": "mcr.microsoft.com/devcontainers/dotnet:dev-10.0-noble",
"features": {
"ghcr.io/devcontainers/features/docker-in-docker:2": {},
"ghcr.io/devcontainers/features/powershell:1": {},
"ghcr.io/devcontainers/features/node:1": {},
"ghcr.io/devcontainers/features/python:1": {},
"ghcr.io/devcontainers-extra/features/uv:1": {}
},
"hostRequirements": {
"cpus": 8,
"memory": "32gb",
"storage": "64gb"
},
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [5000, 5001],
// "portsAttributes": {
// "5001": {
// "protocol": "https"
// }
// }
// Use 'postCreateCommand' to run commands after the container is created.
// "postCreateCommand": "dotnet restore",
"onCreateCommand": "curl -sSL https://aspire.dev/install.sh | bash",
"postStartCommand": "dotnet dev-certs https --trust",
"customizations": {
"vscode": {
"extensions": [
"ms-dotnettools.csdevkit",
"GitHub.copilot-chat",
"GitHub.copilot"
]
}
}
// Configure tool-specific properties.
// "customizations": {},
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
// "remoteUser": "root"
}
Scenariusze kontenera deweloperskiego
Podstawowy Aspire szablon kontenera deweloperskiego działa dobrze w przypadku prostych scenariuszy, ale w zależności od określonych wymagań może być potrzebna dodatkowa konfiguracja. W poniższych sekcjach przedstawiono przykłady różnych typowych scenariuszy.
Tylko aplikacje bezstanowe .NET
W przypadku prostych Aspire projektów, które wykorzystują tylko zasoby projektu .NET bez kontenerów zewnętrznych lub złożonej orkiestracji, można użyć minimalnej konfiguracji kontenera deweloperskiego.
{
"name": "Aspire - Simple",
"image": "mcr.microsoft.com/devcontainers/dotnet:9.0-bookworm",
"onCreateCommand": "dotnet new install Aspire.ProjectTemplates --force",
"postStartCommand": "dotnet dev-certs https --trust",
"customizations": {
"vscode": {
"extensions": [
"ms-dotnettools.csdevkit"
]
}
}
}
Ta minimalna konfiguracja jest odpowiednia dla Aspire aplikacji, które organizuje tylko .NET usługi bez zależności zewnętrznych.
Dodawanie Node.js zasobów
Jeśli aplikacja Aspire zawiera Node.js zasoby, dodaj tę funkcję Node.js do kontenera deweloperskiego.
{
"name": "Aspire with Node.js",
"image": "mcr.microsoft.com/devcontainers/dotnet:9.0-bookworm",
"features": {
"ghcr.io/devcontainers/features/node:1": {
"version": "lts"
}
},
"onCreateCommand": "dotnet new install Aspire.ProjectTemplates --force",
"postStartCommand": "dotnet dev-certs https --trust",
"customizations": {
"vscode": {
"extensions": [
"ms-dotnettools.csdevkit",
"ms-vscode.vscode-typescript-next"
]
}
}
}
Ta konfiguracja zapewnia zarówno możliwości programistyczne .NET, jak i Node.js w tym samym środowisku kontenera.
Orkiestracja kontenerów z wykorzystaniem Docker-in-Docker
Gdy aplikacja Aspire zarządza zasobami kontenerów, potrzebna jest obsługa funkcji Docker-in-Docker (DinD). Oto podstawowa konfiguracja:
{
"name": "Aspire with Containers",
"image": "mcr.microsoft.com/devcontainers/dotnet:9.0-bookworm",
"features": {
"ghcr.io/devcontainers/features/docker-in-docker:2": {
"version": "latest",
"enableNonRootDocker": true,
"moby": true
}
},
"hostRequirements": {
"cpus": 4,
"memory": "16gb",
"storage": "32gb"
},
"onCreateCommand": "dotnet new install Aspire.ProjectTemplates --force",
"postStartCommand": "dotnet dev-certs https --trust",
"customizations": {
"vscode": {
"extensions": [
"ms-dotnettools.csdevkit",
"ms-azuretools.vscode-docker"
]
}
}
}
Zaawansowana sieć kontenerów
Jeśli wystąpią problemy z siecią między kontenerami lub potrzebujesz obsługi protokołu IPv6, możesz dodać dodatkową konfigurację sieci:
{
"name": "Aspire with Advanced Networking",
"image": "mcr.microsoft.com/devcontainers/dotnet:9.0-bookworm",
"features": {
"ghcr.io/devcontainers/features/docker-in-docker:2": {
"version": "latest",
"enableNonRootDocker": true,
"moby": true
}
},
"runArgs": [
"--sysctl",
"net.ipv6.conf.all.disable_ipv6=0",
"--sysctl",
"net.ipv6.conf.default.forwarding=1",
"--sysctl",
"net.ipv6.conf.all.forwarding=1"
],
"hostRequirements": {
"cpus": 8,
"memory": "32gb",
"storage": "64gb"
},
"onCreateCommand": "dotnet new install Aspire.ProjectTemplates --force",
"postStartCommand": "dotnet dev-certs https --trust",
"customizations": {
"vscode": {
"extensions": [
"ms-dotnettools.csdevkit",
"ms-azuretools.vscode-docker"
]
}
}
}
Ważne
Docker-in-Docker zagadnienia:
- Docker-inDocker wymaga wyższej alokacji zasobów, w tym zwiększenia użycia procesora, pamięci i pamięci masowej.
- Powyższa zaawansowana konfiguracja sieci obejmuje ustawienia przekazywania IPv6, które mogą być potrzebne w przypadku złożonych scenariuszy komunikacji między kontenerami.
- Ta konfiguracja działa z Docker programem Desktop, ale może mieć ograniczenia dotyczące programu Rancher Desktop.
- Łączność sieciowa między kontenerami może wymagać dodatkowej konfiguracji w zależności od konkretnego przypadku użycia.
Dapr przykłady integracji
W przypadku Aspire aplikacji integrujących się Dapr z usługą Daprmożna skonfigurować składniki w kontenerze deweloperskim. Aby uzyskać więcej informacji, zobacz AspireDapr integracja.
Konfiguracja podstawowa Dapr
{
"name": "Aspire with Dapr",
"image": "mcr.microsoft.com/devcontainers/dotnet:9.0-bookworm",
"features": {
"ghcr.io/devcontainers/features/docker-in-docker:2": {
"enableNonRootDocker": true
},
"ghcr.io/dapr/cli/dapr-cli:0": {}
},
"onCreateCommand": "dotnet new install Aspire.ProjectTemplates --force",
"postCreateCommand": "dotnet dev-certs https --trust && dapr init",
"customizations": {
"vscode": {
"extensions": [
"ms-dotnettools.csdevkit",
"ms-azuretools.vscode-dapr"
]
}
}
}
Dapr z zewnętrznymi backendami
W przypadku bardziej złożonych Dapr scenariuszy korzystających z zewnętrznych back-endów (Redis, PostgreSQL), można użyć Docker Compose.
{
"name": "Aspire with Dapr and Backends",
"image": "mcr.microsoft.com/devcontainers/dotnet:9.0-bookworm",
"features": {
"ghcr.io/devcontainers/features/docker-in-docker:2": {
"enableNonRootDocker": true
},
"ghcr.io/dapr/cli/dapr-cli:0": {}
},
"runArgs": [
"--sysctl",
"net.ipv6.conf.all.disable_ipv6=0"
],
"onCreateCommand": "dotnet new install Aspire.ProjectTemplates --force",
"postCreateCommand": [
"dotnet dev-certs https --trust",
"docker compose up -d",
"dapr init"
],
"customizations": {
"vscode": {
"extensions": [
"ms-dotnettools.csdevkit",
"ms-azuretools.vscode-dapr",
"ms-azuretools.vscode-docker"
]
}
}
}
Typowe zagadnienia
W przypadku korzystania z usługi Dev Containers z usługą Aspirenależy pamiętać o następujących kwestiach:
Wymagania dotyczące zasobów
- Podstawowe .NET aplikacje: zasoby standardowego kontenera deweloperskiego są wystarczające dla prostych scenariuszy.
- Orkiestracja kontenerów: zalecane jest co najmniej 8 procesorów CPU, 32 GB pamięci i 64 GB pamięci.
- Złożone scenariusze z Dapr/Kubernetes: Wyższa alokacja zasobów jest zalecana w celu uzyskania optymalnej wydajności.
Sieć komputerowa
- Konfiguracja protokołu IPv6 może być wymagana do komunikacji między kontenerami.
- Przekazywanie portów jest obsługiwane automatycznie przez Aspire 9.1 i nowsze wersje.
- Łączność z usługą zewnętrzną zależy od konfiguracji środowiska uruchomieniowego kontenera.
Wydajność
- Docker-in-Docker scenariusze powodują obciążenie związane z wydajnością w porównaniu z natywnym Docker.
- Rozważ użycie Docker poza Docker (DooD) dla przepływów pracy w produkcji.
- Scenariusze programowania i wdrażania lokalnego mogą wymagać różnych konfiguracji.
Bezpieczeństwo
- Kontenery deweloperskie są uruchamiane z podwyższonymi przywilejami podczas używania Docker-in-Docker.
- Zaufanie certyfikatu SSL jest obsługiwane automatycznie w większości scenariuszy.
- Podczas uwidaczniania portów w środowiskach chmury należy wziąć pod uwagę implikacje dotyczące zabezpieczeń.