Мини-ускоренный курс по Docker и простому приложению C#.

Полное руководство и код можно найти здесь, чтобы следовать

Цель состоит в том, чтобы создать контейнер докеров и использовать docker-compose для использования контейнера докеров в проекте.

Docker за 100 секундУчебник по Docker для начинающихОбъяснение Kubernetes за 100 секунд

  1. Установите Docker на свой компьютер
  2. Клонируйте этот репозиторий и следуйте инструкциям

Мы используем WeatherApi от Microsoft, чтобы продемонстрировать, как создать контейнер, который будет предоставлять свои службы через порт 8080.

Этот проект использует C#, но нам не нужны какие-либо инструменты на нашей машине для его сборки, так как мы собираемся использовать докер, чтобы сделать это за нас.

docker-compose up -d docker-compose down docker-compose build

Проверить работоспособность контейнера

Dockerfile — это рецепт того, как собрать и/или запустить ваше приложение в контейнере.

Для нашего образа здания мы должны использовать это изображение: mcr.microsoft.com/dotnet/sdk:latest Для нашего работающего изображения мы должны использовать это изображение: mcr.microsoft.com/dotnet/aspnet:latest

Дополнительную информацию об этих образах можно найти здесь: mcr.microsoft.com/dotnet/sdk ​​mcr.microsoft.com/dotnet/aspnet

Мы собираемся использовать Dockerfile и использовать эти псевдонимы FROM <image>:<tag> as builder, а затем использовать FROM <image>:<tag> as runner для создания двухэтапной сборки и запуска. Их можно назвать как угодно, это просто для иллюстрации.

Примечание. Если ваше приложение не скомпилировано и не нуждается в шаге сборки, например. Веб-страница Python Flask, приложение React, тогда будет достаточно только изображения бегуна.

Шаги сборки выполняются для уменьшения размера конечного изображения. Например. если приложение написано на Rust, сохраняя сборку и рабочий образ одинаковыми. Размер контейнера будет огромным. Это означает, что каждый раз, когда происходит изменение, вам придется загружать все это локально, чтобы получить его. Образ сборки Rust может, в зависимости от вашей сборки, занимать 1 ГБ+, если не больше.

С учетом сказанного, давайте создадим контейнер. В корне проекта WeatherApi, где находится Dockerfile, мы должны запустить эти команды.

Пример команды

docker build . --tag weather-api:test

Результат этой команды должен выглядеть примерно так:

...snip...
Successfully built 12042a3b5853
Successfully tagged weather-api:latest

Поскольку было сообщено об успешной сборке, мы можем использовать этот контейнер.

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

$ docker run -p 8080:80 --name weatherapi 
weather-api:latest info: Microsoft.Hosting.Lifetime[0] Now listening on: http://[::]:80 info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down. info: Microsoft.Hosting.Lifetime[0] Hosting environment: Development info: Microsoft.Hosting.Lifetime[0] Content root path: /app

Откройте ваш любимый браузер и перейдите по этому URL-адресу http://localhost:8080/swagger/

Docker-compose предназначен для организации, например. запуск проекта. Предположим, что этот API опирается на внутреннюю базу данных, и это должно начаться, прежде чем мы сможем получить доступ к API.

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

Давайте сначала создадим docker-compose.yml для нашего API и попробуем сначала запустить его.

Docker-compose.yml находится в корне вне папки WeatherApi. Его можно разместить в другом месте, но нам нужно находиться в той же папке, что и для запуска команды docker-compose.

Убедитесь, что вы находитесь в том же каталоге, что и docker-compose.yml, и напишите следующее.

$ docker-compose up 
... snip 
Creating docker-crashcourse_weather-api_1 ... done 
Attaching to docker-crashcourse_weather-api_1 
weather-api_1 | info: Microsoft.Hosting.Lifetime[0] 
weather-api_1 | Now listening on: http://[::]:80 
weather-api_1 | info: Microsoft.Hosting.Lifetime[0] 
weather-api_1 | Application started. Press Ctrl+C to shut down. weather-api_1 | info: Microsoft.Hosting.Lifetime[0] weather-api_1 | Hosting environment: Development 
weather-api_1 | info: Microsoft.Hosting.Lifetime[0] weather-api_1 | Content root path: /app

Эта команда, если образ не существует, создаст его, а затем запустит. Поскольку мы не использовали переключатель -d, мы застряли в этом терминале, пока не нажмем CTRL-C. Когда мы это сделаем, служба отключится.

При использовании -d это может выглядеть так:

$ docker-compose up -d 
Starting docker-crashcourse_weather-api_1 ... done 
$ docker-compose down 
Stopping docker-crashcourse_weather-api_1 ... done 
Removing docker-crashcourse_weather-api_1 ... done 
Removing network docker-crashcourse_default

Использование docker-compose для одного контейнера очень полезно. Но так как мы должны добавить базу данных и утверждать, что WeatherApi зависит от этой службы базы данных.

Итак, мы собираемся вставить следующее в файл docker-compose.yml.

Теперь мы снова запустим команду docker-compose и увидим, что база данных также запускается.

$ docker-compose up ... lost of text weather-db_1 | Version: '10.4.12-MariaDB-1:10.4.12+maria~bionic' socket: '/var/run/mysqld/mysqld.sock' port: 3306

Так что все хорошо и все такое. Но теперь база данных и база данных запускаются одновременно, и это нехорошо.

Но мы можем добавить depends_on: для сервиса weather-api в файл docker-compose.yml.

И когда вы затем запустите docker-compose, вы должны увидеть, что службы запускаются по порядку.

$ docker-compose up 
... snip .. 
weather-db_1 | 2021-02-17 19:02:26 0 [Note] mysqld: ready for connections. weather-db_1 | Version: '10.4.12-MariaDB-1:10.4.12+maria~bionic' socket: '/var/run/mysqld/mysqld.sock' port: 3306 mariadb.org binary distribution weather-api_1 | info: Microsoft.Hosting.Lifetime[0] 
weather-api_1 | Now listening on: http://[::]:80 ... snip...

Первоначально опубликовано на https://github.com.