Упражнение. Создание образа контейнера для микрослужбы .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 на локальный компьютер. Тогда:

  1. Установите любые системные требования, чтобы запускать контейнер разработки в Visual Studio Code.
  2. Убедитесь, что Docker запущен.
  3. В новом окне Visual Studio Code откройте папку клонированного репозитория
  4. Нажмите CTRL +++++ SHIFT +++++ P +, чтобы открыть палитру команд.
  5. Поиск: >Контейнеры разработки: перестроить и заново открыть в контейнере
  6. Выберите eShopLite — dotnet-docker в раскрывающемся списке. Visual Studio Code создает контейнер разработки локально.

Создание внутреннего образа Продуктов с помощью публикации .NET

Последняя версия .NET 8 улучшает поддержку контейнеризации. Для создания образа Docker для микрослужб можно использовать команду dotnet publish. Команда создает образ контейнера без корня, который выполняет службы в учетной записи app. Запуск контейнеров без root-привилегий отлично подходит для обеспечения безопасности и повышения производительности. Команда знает, как выбрать лучший базовый образ, проверив параметры в файле проекта.

  1. Чтобы создать образы для всех служб 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.

  2. Проверьте, доступны ли образы в 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.

  1. В области EXPLORER создайте файл Dockerfile в ./dotnet-docker/Products. Файл пуст.

  2. Введите следующий код:

    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.
  3. Непосредственно под последней строкой введите следующий код:

     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 проекта.
  4. Непосредственно под последней строкой введите следующий код:

     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:

  1. Чтобы создать образ для серверной службы Products, перейдите на вкладку ТЕРМИНАЛ и выполните следующую команду:

    cd ./dotnet-docker 
     docker build -t productsbackend:latest -f Products/Dockerfile .
    

    Это выполняет команды в Dockerfile в текущем каталоге и применяет тег productsbackend:latest к полученному изображению.

  2. После большого количества выходных данных будет создан образ. Ввод 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 для каждой микрослужбы в приложениях.

Запустите контейнер и протестируйте службу

Теперь можно использовать образ для запуска и размещения службы "Продукты".

  1. Чтобы создать и запустить контейнер из образа новых продуктов и открыть доступ к службе на порту 32001, выполните следующую команду:

    docker run -it --rm -p 32001:8080  products
    

    Или, если вы хотите запустить образ, созданный с помощью Dockerfile, выполните следующую команду:

    docker run -it --rm -p 32001:8080 productsbackend
    
  2. Чтобы протестировать службу, перейдите на вкладку ПОРТЫ, а затем справа от локального адреса для порта серверной части выберите значок глобуса. В браузере откроется новая вкладка на этом адресе.

    снимок экрана, показывающий, как подключиться к службе внутренних продуктов.

  3. Чтобы запросить некоторые продукты, добавьте адрес с /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"
        },
        ...
    ]