Мини-ускоренный курс по Docker и простому приложению C#.
Полное руководство и код можно найти здесь, чтобы следовать
Цель состоит в том, чтобы создать контейнер докеров и использовать docker-compose для использования контейнера докеров в проекте.
Docker за 100 секундУчебник по Docker для начинающихОбъяснение Kubernetes за 100 секунд
- Установите Docker на свой компьютер
- Клонируйте этот репозиторий и следуйте инструкциям
Мы используем 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.