Bagikan melalui


Alat Kontainer Visual Studio dengan ASP.NET Core

Catatan

Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.

Peringatan

Versi ASP.NET Core ini tidak lagi didukung. Untuk informasi selengkapnya, lihat Kebijakan Dukungan .NET dan .NET Core. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.

Penting

Informasi ini berkaitan dengan produk pra-rilis yang mungkin dimodifikasi secara substansial sebelum dirilis secara komersial. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.

Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.

Visual Studio 2017 dan versi yang lebih baru mendukung pembuatan, penelusuran kesalahan, dan menjalankan aplikasi ASP.NET Core dalam kontainer yang menargetkan .NET Core. Kontainer Windows dan Linux didukung.

Melihat atau mengunduh kode sampel (cara mengunduh)

Prasyarat

Penginstalan dan konfigurasi

Untuk penginstalan Docker, pertama-tama tinjau informasi di Docker untuk Windows: Apa yang harus diketahui sebelum Anda menginstal. Selanjutnya, instal Docker untuk Windows.

Drive Bersama di Docker untuk Windows harus dikonfigurasi untuk mendukung pemetaan dan penelusuran kesalahan volume. Klik kanan ikon Docker Baki Sistem, pilih Pengaturan, dan pilih Drive Bersama. Pilih drive tempat Docker menyimpan file. Klik Terapkan.

Dialog untuk memilih berbagi drive C lokal untuk kontainer

Tip

Visual Studio 2017 versi 15.6 dan yang lebih baru saat Drive Bersama tidak dikonfigurasi.

Menambahkan proyek ke kontainer Docker

Untuk memuat proyek ASP.NET Core dalam kontainer, proyek harus menargetkan .NET Core. Kontainer Linux dan Windows didukung.

Saat menambahkan dukungan Docker ke proyek, pilih kontainer Windows atau Linux. Host Docker harus menjalankan jenis kontainer yang sama. Untuk mengubah jenis kontainer dalam instans Docker yang sedang berjalan, klik kanan ikon Docker Baki Sistem dan pilih Beralih ke kontainer Windows... atau Beralih ke kontainer Linux....

Aplikasi baru

Saat membuat aplikasi baru dengan templat proyek ASP.NET Core Web Application , pilih kotak centang Aktifkan Dukungan Docker:

Kotak centang Aktifkan Dukungan Docker

Jika kerangka kerja target adalah .NET Core, drop-down OS memungkinkan pemilihan jenis kontainer.

Aplikasi yang sudah ada

Untuk proyek ASP.NET Core yang menargetkan .NET Core, ada dua opsi untuk menambahkan dukungan Docker melalui alat. Buka proyek di Visual Studio, dan pilih salah satu opsi berikut:

  • Pilih Dukungan Docker dari menu Proyek .
  • Klik kanan proyek di Penjelajah Solusi dan pilih Tambahkan>Dukungan Docker.

Alat Kontainer Visual Studio tidak mendukung penambahan Docker ke proyek ASP.NET Core yang sudah ada yang menargetkan .NET Framework.

Gambaran umum Dockerfile

Dockerfile, resep untuk membuat gambar Docker akhir, ditambahkan ke akar proyek. Lihat referensi Dockerfile untuk pemahaman tentang perintah di dalamnya. Dockerfile khusus ini menggunakan build multi-tahap dengan empat tahap build yang berbeda dan bernama:

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1 AS base
WORKDIR /app
EXPOSE 59518
EXPOSE 44364

FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build
WORKDIR /src
COPY HelloDockerTools/HelloDockerTools.csproj HelloDockerTools/
RUN dotnet restore HelloDockerTools/HelloDockerTools.csproj
COPY . .
WORKDIR /src/HelloDockerTools
RUN dotnet build HelloDockerTools.csproj -c Release -o /app

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

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

Gambar Dockerfile sebelumnya mencakup runtime ASP.NET Core dan paket NuGet. Paket dikompilasi just-in-time (JIT) untuk meningkatkan performa startup.

Saat kotak centang Konfigurasi untuk HTTPS dialog proyek baru dicentang, Dockerfile mengekspos dua port. Satu port digunakan untuk lalu lintas HTTP; port lainnya digunakan untuk HTTPS. Jika kotak centang tidak dicentang, satu port (80) diekspos untuk lalu lintas HTTP.

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

FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY HelloDockerTools/HelloDockerTools.csproj HelloDockerTools/
RUN dotnet restore HelloDockerTools/HelloDockerTools.csproj
COPY . .
WORKDIR /src/HelloDockerTools
RUN dotnet build HelloDockerTools.csproj -c Release -o /app

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

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

Gambar Dockerfile sebelumnya mencakup paket ASP.NET Core NuGet, yang dikompilasi just-in-time (JIT) untuk meningkatkan performa startup.

Menambahkan dukungan orkestrator kontainer ke aplikasi

Visual Studio 2017 versi 15.7 atau yang lebih lama mendukung Docker Compose sebagai satu-satu solusi orkestrasi kontainer. Artefak Docker Compose ditambahkan melalui Tambahkan>Dukungan Docker.

Visual Studio 2017 versi 15.8 atau yang lebih baru menambahkan solusi orkestrasi hanya saat diinstruksikan. Klik kanan proyek di Penjelajah Solusi dan pilih Tambahkan>Dukungan Orkestrator Kontainer. Pilihan berikut tersedia:

Docker Compose

Alat Kontainer Visual Studio menambahkan proyek docker-compose ke solusi dengan file berikut:

  • docker-compose.dcproj: File yang mewakili proyek. Menyertakan elemen yang <DockerTargetOS> menentukan OS yang akan digunakan.
  • .dockerignore: Mencantumkan pola file dan direktori yang akan dikecualikan saat membuat konteks build.
  • docker-compose.yml: File Docker Compose dasar yang digunakan untuk menentukan kumpulan gambar yang dibangun dan dijalankan dengan docker-compose build dan docker-compose run, masing-masing.
  • docker-compose.override.yml: File opsional, dibaca oleh Docker Compose, dengan penggantian konfigurasi untuk layanan. Visual Studio dijalankan docker-compose -f "docker-compose.yml" -f "docker-compose.override.yml" untuk menggabungkan file-file ini.

File docker-compose.yml mereferensikan nama gambar yang dibuat saat proyek berjalan:

version: '3.4'

services:
  hellodockertools:
    image: ${DOCKER_REGISTRY}hellodockertools
    build:
      context: .
      dockerfile: HelloDockerTools/Dockerfile

Dalam contoh sebelumnya, image: hellodockertools menghasilkan gambar hellodockertools:dev saat aplikasi berjalan dalam mode Debug . Gambar hellodockertools:latest dihasilkan saat aplikasi berjalan dalam mode Rilis .

Awali nama gambar dengan nama pengguna Docker Hub (misalnya, dockerhubusername/hellodockertools) jika gambar didorong ke registri. Atau, ubah nama gambar untuk menyertakan URL registri privat (misalnya, privateregistry.domain.com/hellodockertools) tergantung pada konfigurasi.

Jika Anda menginginkan perilaku yang berbeda berdasarkan konfigurasi build (misalnya, Debug atau Rilis), tambahkan file docker-compose khusus konfigurasi. File harus diberi nama sesuai dengan konfigurasi build (misalnya, docker-compose.vs.debug.yml dan docker-compose.vs.release.yml) dan ditempatkan di lokasi yang sama dengan file docker-compose-override.yml.

Dengan menggunakan file penimpaan khusus konfigurasi, Anda dapat menentukan pengaturan konfigurasi yang berbeda (seperti variabel lingkungan atau titik entri) untuk konfigurasi build Debug dan Rilis.

Agar Docker Compose menampilkan opsi untuk dijalankan di Visual Studio, proyek docker harus menjadi proyek startup.

Service Fabric

Selain Prasyarat dasar, solusi orkestrasi Service Fabric menuntut prasyarat berikut:

Service Fabric tidak mendukung menjalankan kontainer Linux di kluster pengembangan lokal di Windows. Jika proyek sudah menggunakan kontainer Linux, Visual Studio akan meminta untuk beralih ke kontainer Windows.

Alat Kontainer Visual Studio melakukan tugas berikut:

  • <Menambahkan proyek Aplikasi Application Service Fabric project_name>ke solusi.

  • Menambahkan Dockerfile dan file .dockerignore ke proyek ASP.NET Core. Jika Dockerfile sudah ada di proyek ASP.NET Core, itu diganti namanya menjadi Dockerfile.original. Dockerfile baru, mirip dengan yang berikut ini, dibuat:

    # See https://aka.ms/containerimagehelp for information on how to use Windows Server 1709 containers with Service Fabric.
    # FROM microsoft/aspnetcore:2.0-nanoserver-1709
    FROM microsoft/aspnetcore:2.0-nanoserver-sac2016
    ARG source
    WORKDIR /app
    COPY ${source:-obj/Docker/publish} .
    ENTRYPOINT ["dotnet", "HelloDockerTools.dll"]
    
  • <IsServiceFabricServiceProject> Menambahkan elemen ke file proyek .csproj ASP.NET Core:

    <IsServiceFabricServiceProject>True</IsServiceFabricServiceProject>
    
  • Menambahkan folder PackageRoot ke proyek ASP.NET Core. Folder menyertakan manifes layanan dan pengaturan untuk layanan baru.

Untuk informasi selengkapnya, lihat Menyebarkan aplikasi .NET dalam kontainer Windows ke Azure Service Fabric.

Debug

Pilih Docker dari drop-down debug di toolbar, dan mulai penelusuran kesalahan aplikasi. Tampilan Docker dari jendela Output memperlihatkan tindakan berikut yang terjadi:

  • Tag runtime 2.1-aspnetcore dari gambar runtime microsoft/dotnet diperoleh (jika belum ada di cache). Gambar menginstal runtime ASP.NET Core dan .NET Core dan pustaka terkait. Ini dioptimalkan untuk menjalankan aplikasi ASP.NET Core dalam produksi.
  • Variabel ASPNETCORE_ENVIRONMENT lingkungan diatur ke Development dalam kontainer.
  • Dua port yang ditetapkan secara dinamis diekspos: satu untuk HTTP dan satu untuk HTTPS. Port yang ditetapkan ke localhost dapat dikueri dengan docker ps perintah .
  • Aplikasi disalin ke kontainer.
  • Browser default diluncurkan dengan debugger yang dilampirkan ke kontainer menggunakan port yang ditetapkan secara dinamis.

Gambar Docker yang dihasilkan dari aplikasi ditandai sebagai dev. Gambar didasarkan pada tag 2.1-aspnetcore-runtime dari gambar dasar microsoft/dotnet . Jalankan docker images perintah di jendela Package Manager Console (PMC). Gambar pada komputer ditampilkan:

REPOSITORY        TAG                     IMAGE ID      CREATED         SIZE
hellodockertools  dev                     d72ce0f1dfe7  30 seconds ago  255MB
microsoft/dotnet  2.1-aspnetcore-runtime  fcc3887985bb  6 days ago      255MB
  • Gambar runtime microsoft/aspnetcore diperoleh (jika belum ada di cache).
  • Variabel ASPNETCORE_ENVIRONMENT lingkungan diatur ke Development dalam kontainer.
  • Port 80 diekspos dan dipetakan ke port yang ditetapkan secara dinamis untuk localhost. Port ditentukan oleh host Docker dan dapat dikueri dengan docker ps perintah .
  • Aplikasi disalin ke kontainer.
  • Browser default diluncurkan dengan debugger yang dilampirkan ke kontainer menggunakan port yang ditetapkan secara dinamis.

Gambar Docker yang dihasilkan dari aplikasi ditandai sebagai dev. Gambar didasarkan pada gambar dasar microsoft/aspnetcore . Jalankan docker images perintah di jendela Package Manager Console (PMC). Gambar pada komputer ditampilkan:

REPOSITORY            TAG  IMAGE ID      CREATED        SIZE
hellodockertools      dev  5fafe5d1ad5b  4 minutes ago  347MB
microsoft/aspnetcore  2.0  c69d39472da9  13 days ago    347MB

Catatan

Gambar dev tidak memiliki konten aplikasi, karena konfigurasi Debug menggunakan pemasangan volume untuk memberikan pengalaman berulang. Untuk mendorong gambar, gunakan konfigurasi Rilis .

Jalankan docker ps perintah di PMC. Perhatikan bahwa aplikasi berjalan menggunakan kontainer:

CONTAINER ID        IMAGE                  COMMAND                   CREATED             STATUS              PORTS                   NAMES
baf9a678c88d        hellodockertools:dev   "C:\\remote_debugge..."   21 seconds ago      Up 19 seconds       0.0.0.0:37630->80/tcp   dockercompose4642749010770307127_hellodockertools_1

Edit dan lanjutkan

Perubahan pada file statis dan Razor tampilan diperbarui secara otomatis tanpa perlu langkah kompilasi. Buat perubahan, simpan, dan refresh browser untuk melihat pembaruan.

Modifikasi file kode memerlukan kompilasi dan restart Kestrel dalam kontainer. Setelah membuat perubahan, gunakan CTRL+F5 untuk melakukan proses dan memulai aplikasi dalam kontainer. Kontainer Docker tidak dibangun kembali atau dihentikan. Jalankan docker ps perintah di PMC. Perhatikan bahwa kontainer asli masih berjalan pada 10 menit yang lalu:

CONTAINER ID        IMAGE                  COMMAND                   CREATED             STATUS              PORTS                   NAMES
baf9a678c88d        hellodockertools:dev   "C:\\remote_debugge..."   10 minutes ago      Up 10 minutes       0.0.0.0:37630->80/tcp   dockercompose4642749010770307127_hellodockertools_1

Menerbitkan gambar Docker

Setelah siklus pengembangan dan debug aplikasi selesai, Alat Kontainer Visual Studio membantu dalam membuat gambar produksi aplikasi. Ubah menu drop-down konfigurasi ke Rilis dan buat aplikasi. Alat ini memperoleh gambar kompilasi/penerbitan dari Docker Hub (jika belum ada di cache). Gambar diproduksi dengan tag terbaru , yang dapat didorong ke registri privat atau Docker Hub.

Jalankan docker images perintah di PMC untuk melihat daftar gambar. Output yang mirip dengan berikut ini ditampilkan:

REPOSITORY        TAG                     IMAGE ID      CREATED             SIZE
hellodockertools  latest                  e3984a64230c  About a minute ago  258MB
hellodockertools  dev                     d72ce0f1dfe7  4 minutes ago       255MB
microsoft/dotnet  2.1-sdk                 9e243db15f91  6 days ago          1.7GB
microsoft/dotnet  2.1-aspnetcore-runtime  fcc3887985bb  6 days ago          255MB
REPOSITORY                  TAG     IMAGE ID      CREATED         SIZE
hellodockertools            latest  cd28f0d4abbd  12 seconds ago  349MB
hellodockertools            dev     5fafe5d1ad5b  23 minutes ago  347MB
microsoft/aspnetcore-build  2.0     7fed40fbb647  13 days ago     2.02GB
microsoft/aspnetcore        2.0     c69d39472da9  13 days ago     347MB

Gambar microsoft/aspnetcore-build dan microsoft/aspnetcore yang tercantum dalam output sebelumnya diganti dengan microsoft/dotnet gambar pada .NET Core 2.1. Untuk informasi selengkapnya, lihat pengumuman migrasi repositori Docker.

Catatan

Perintah docker images mengembalikan gambar perantara dengan nama repositori dan tag yang diidentifikasi sebagai <tidak ada> (tidak tercantum di atas). Gambar yang tidak disebutkan namanya ini diproduksi oleh Dockerfile build multi-tahap. Mereka meningkatkan efisiensi membangun gambar akhir—hanya lapisan yang diperlukan yang dibangun kembali ketika perubahan terjadi. Ketika gambar perantara tidak lagi diperlukan, hapus menggunakan perintah docker rmi .

Mungkin ada harapan untuk produksi atau gambar rilis menjadi lebih kecil ukurannya dengan perbandingan dengan gambar dev . Karena pemetaan volume, debugger dan aplikasi berjalan dari komputer lokal dan bukan dalam kontainer. Gambar terbaru telah mengemas kode aplikasi yang diperlukan untuk menjalankan aplikasi pada komputer host. Oleh karena itu, delta adalah ukuran kode aplikasi.

Sumber Daya Tambahan: