Упражнение. Создание образа контейнера для микрослужбы .NET
В этом упражнении вы создадите конечную точку микрослужбы и контейнеризируете ее с помощью пакета SDK для .NET и Docker.
Заметка
Вы можете выполнить это упражнение в инстансе GitHub Codespaces с предварительно установленными Docker и SDK для .NET. При использовании этих средств и методов в собственной среде разработки убедитесь, что установлены эти предварительные требования.
Открытие среды разработки
Вы можете использовать пространство кода GitHub, в котором размещено упражнение, или выполнить упражнение локально в Visual Studio Code.
Чтобы использовать пространство кода , создайте предварительно настроенное пространство в GitHub с помощью этой ссылки для создания Codespace .
GitHub занимает несколько минут, чтобы создать и настроить пространство кода. По завершении процесса вы увидите файлы кода для упражнения. Код, используемый для остальной части этого модуля, находится в каталоге /dotnet-docker.
Чтобы использовать Visual Studio Code, клонируйте репозиторий https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative на локальный компьютер. Тогда:
- Установите любые системные требования, чтобы запускать контейнер разработки в Visual Studio Code.
- Убедитесь, что Docker запущен.
- В новом окне Visual Studio Code откройте папку клонированного репозитория
- Нажмите CTRL +++++ SHIFT +++++ P +, чтобы открыть палитру команд.
- Поиск: >Контейнеры разработки: перестроить и заново открыть в контейнере
- Выберите eShopLite — dotnet-docker в раскрывающемся списке. Visual Studio Code создает контейнер разработки локально.
Создание внутреннего образа Продуктов с помощью публикации .NET
Последняя версия .NET 8 улучшает поддержку контейнеризации. Для создания образа Docker для микрослужб можно использовать команду dotnet publish
. Команда создает образ контейнера без корня, который выполняет службы в учетной записи app
. Запуск контейнеров без root-привилегий отлично подходит для обеспечения безопасности и повышения производительности. Команда знает, как выбрать лучший базовый образ, проверив параметры в файле проекта.
Чтобы создать образы для всех служб eShopLite, перейдите на вкладку терминала и выполните следующую команду:
cd ./dotnet-docker dotnet publish /p:PublishProfile=DefaultContainer
Вы видите выходные данные, подобные следующим сообщениям:
DataEntities -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/DataEntities/bin/Release/net8.0/publish/ Products -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Products/bin/Release/net8.0/Products.dll Products -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Products/bin/Release/net8.0/publish/ Store -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Store/bin/Release/net8.0/Store.dll Store -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Store/bin/Release/net8.0/publish/ Building image 'store' with tags 'latest' on top of base image 'mcr.microsoft.com/dotnet/aspnet:8.0'. Building image 'products' with tags 'latest' on top of base image 'mcr.microsoft.com/dotnet/aspnet:8.0'. Pushed image 'store:latest' to local registry via 'docker'. Pushed image 'products:latest' to local registry via 'docker'.
Команда считывает файл решения, определяет, что он содержит три проекта, построил их и создал образы для проектов магазина и продуктов. Образы именуются в честь проектов и публикуются в локальном реестре docker.
Проверьте, доступны ли образы в Docker:
docker images
Вы видите выходные данные, похожие на следующие сообщения:
REPOSITORY TAG IMAGE ID CREATED SIZE products latest 63614e340088 About a minute ago 293MB store latest e9458c3abdb1 About a minute ago 218MB
Создайте серверный образ Products с помощью Dockerfile.
Если требуется больше контроля над созданием образов, можно использовать Dockerfile для создания образа для веб-службы Products.
В области EXPLORER создайте файл Dockerfile в ./dotnet-docker/Products. Файл пуст.
Введите следующий код:
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /DataEntities COPY "DataEntities/DataEntities.csproj" . RUN dotnet restore COPY "DataEntities" . RUN dotnet publish -c release -o /app
Выполнив следующие действия, этот код настроит библиотеку DataEntities в образе Docker Products:
- Извлеките изображение
mcr.microsoft.com/dotnet/sdk:8.0
и назовите егоbuild
. - Установите рабочий каталог в образе на
/DataEntities
. - Скопируйте файл с именем DataEntities.csproj локально в созданный каталог
/DataEntities
. - Созвон по проекту
dotnet restore
. - Скопируйте все данные из локального DataEntities каталога в образ.
- Этап проекта
dotnet publish
.
- Извлеките изображение
Непосредственно под последней строкой введите следующий код:
WORKDIR /src COPY Products/Products.csproj . RUN dotnet restore COPY Products . RUN dotnet publish -c release -o /app
Этот код выполняет следующие действия последовательно при вызове:
- Установите рабочий каталог в образе на
/src
. - Скопируйте файл с именем Products.csproj, найденный локально в созданный каталог
/src
. - Звонок по проекту
dotnet restore
. - Скопируйте всё из каталога Products на локальном диске в образ.
- Позвоните по
dotnet publish
проекта.
- Установите рабочий каталог в образе на
Непосредственно под последней строкой введите следующий код:
FROM mcr.microsoft.com/dotnet/aspnet:8.0 WORKDIR /app EXPOSE 80 EXPOSE 443 COPY --from=build /app . ENTRYPOINT ["dotnet", "Products.dll"]
Этот код выполняет следующие действия последовательно при вызове:
- Извлеките изображение
mcr.microsoft.com/dotnet/aspnet:8.0
. - Установите рабочий каталог в образе на
/app
. - Открыть порт 80 и 443.
- Скопируйте все данные из каталога приложения сборки, созданного в каталог приложения этого образа.
- Установите точку входа этого изображения на
dotnet
и передайтеProducts.dll
в качестве аргумента.
- Извлеките изображение
Создание образа Docker
Завершив файл Dockerfile, следующий шаг — использовать его для создания образа Docker:
Чтобы создать образ для серверной службы Products, перейдите на вкладку ТЕРМИНАЛ и выполните следующую команду:
cd ./dotnet-docker docker build -t productsbackend:latest -f Products/Dockerfile .
Это выполняет команды в Dockerfile в текущем каталоге и применяет тег productsbackend:latest к полученному изображению.
После большого количества выходных данных будет создан образ. Ввод
docker images
отображает список всех изображений в кодовом пространстве, включая productsbackend. Другой образ — это образ для самого кодового пространства.Вы видите вывод, похожий на следующие сообщения:
REPOSITORY TAG IMAGE ID CREATED SIZE products latest 63614e340088 10 minutes ago 293MB store latest e9458c3abdb1 10 minutes ago 218MB productsbackend latest 190783f7e06f About a minute ago 293MB
Подумайте о разнице между использованием dotnet publish
и необходимостью вручную создавать Dockerfiles для каждой микрослужбы в приложениях.
Запустите контейнер и протестируйте службу
Теперь можно использовать образ для запуска и размещения службы "Продукты".
Чтобы создать и запустить контейнер из образа новых продуктов и открыть доступ к службе на порту 32001, выполните следующую команду:
docker run -it --rm -p 32001:8080 products
Или, если вы хотите запустить образ, созданный с помощью Dockerfile, выполните следующую команду:
docker run -it --rm -p 32001:8080 productsbackend
Чтобы протестировать службу, перейдите на вкладку ПОРТЫ, а затем справа от локального адреса для порта серверной части выберите значок глобуса. В браузере откроется новая вкладка на этом адресе.
Чтобы запросить некоторые продукты, добавьте адрес с /api/product, а затем нажмите клавишу ВВОД. В формате JSON должны отображаться некоторые сведения о продукте.
[ { "id": 1, "name": "Solar Powered Flashlight", "description": "A fantastic product for outdoor enthusiasts", "price": 19.99, "imageUrl": "product1.png" }, { "id": 2, "name": "Hiking Poles", "description": "Ideal for camping and hiking trips", "price": 24.99, "imageUrl": "product2.png" }, { "id": 3, "name": "Outdoor Rain Jacket", "description": "This product will keep you warm and dry in all weathers", "price": 49.99, "imageUrl": "product3.png" }, ... ]