ASP.NET Core + Docker: готуємо разом

Ми раді поділитися з вами черговій статті з серії статей про платформі ASP.NET Core (раніше ASP.NET 5). В цей раз В'ячеслав Бобик — .NET-розробника з компанії Radario, продовжить свою розповідь про платформі розповіддю про застосування ASP.NET з контейнерами Docker. Всі статті циклу ви завжди можете знайти тут #aspnetcolumn — Володимир Юнев

image

Кам нам відомо, ASP.NET Core, можна(і навіть потрібно) запускати не тільки на Windows, але так само на Mac і Linux. Що це нам дає? Наприклад можемо запакувати наш додаток з усіма його залежностями в docker контейнер і зручно розгортати його на тестових\робочих середовищах. Ми не будемо розглядати про те що таке docker його встановлювати, а замість цього спробуємо зібрати образ з ASP.NET Core.

Подготавлием тестове додаток

У нас є вибір на ніж запускати наше перше ASP.NET Core додаток: на mono або coreclr. Я виберу другий варіант, так як це модно, стильно, молодіжно.

За традицією створений ним порожній ASP.NET Core проект:

alt

Після створення зайдемо в файл
project.json
, він повинен містити такі поля:

....
"dependencies": {
"Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",
"Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final"
},

"commands": {
"web": "Microsoft.AspNet.Server.Kestrel --server.urls http://*:5004"
} ,
....

Нас цікавить секція commands, а саме команда
web
. При її виконанні запускається
kestrel
веб сервер, який буде доступний з 5004 порту.(???)

Давайте перевіримо запускається наше додаток локально: для цього спочатку переконаємося що у нас є потрібна версія DNX, і вона виставлена за замовчуванням для використання.

Виконуємо

dnvm list

alt

Якщо у вас обрана версія з рантаймом clr, то необхідно переключиться на coreclr командою:

dnvm use 1.0.0-rc1-final -r coreclr -p

Якщо у вас відсутня версія coreclr, то її легко встановити виконавши

dnvm upgrade -r coreclr

Давайте вже запускати наше додаток: перейдемо в папку де його створили і виконаємо.

> dnu restore
> dnx web

Перша команда встановлює залежності, друга собсвенно запускає наш додаток. Тепер якщо перейдемо за адресою http://localhost:5004, то побачимо вітальне повідомлення. Все, ми готові пакувати наше додаток в контейнер.

Створюємо докер образ

Для того щоб докер зібрав нам образ(image), нам треба розповісти йому[докеру] як це зробити за допомогою команд записаних в докер файлі.

Докер створює обзар(image) читаючи команди з
Dockerfile
. Создами
Dockerfile
в корені проекту (хоч це і не багато суперечить кращим практикам з написання Dockerfile) містить команди:

FROM microsoft/aspnet:1.0.0-rc1-update1-coreclr

COPY . /app
WORKDIR /app
RUN ["dnu", "restore"]

EXPOSE 5004
ENTRYPOINT ["dnx", "-p", "project.json", "web"]

FROM — Вказуємо базовий образ на основі якого ми будемо будувати власний
COPY — Копіюємо всі з папки.) у файлову систему контейнера, в папку /app
WORKDIR — Задаємо робочу папку щодо якої будуть виконуватися команди RUN, CMD, ENTRYPOINT, COPY і ADD следующите за цією командою в докерфайле

RUN — Встановлюємо усі залежності для нашого застосування. RUN делаеть трохи більше, ніж просто вылонение команди, ось тут описано детальніше
EXPOSE — Говоримо докеру, що в нашому образі є сервіс який буде слухати 5004 порт (який ми вказали у файлі project.json)

ENTRYPOINT — Вказуємо команду яка виконається при старті контейнера. Відмінності від CMD

Тепер зберемо наш спосіб:

docker build -t first-aspnet-app .

Через деякий час, коли наш образ зібрався, запустимо його:

docker run -d -p 80:5004 first-aspnet-app

-d — перемикає запущений контейнер в бекграунд, иначене введення/виведення веб сервера був би приаттачен до нашого шеллу.
-p — маппит порт хост-машини на exposed порт контейнера. Тобто всі запити прийшли на 80 порт будуть проброшены на порт 5004

Тепер якщо пройти за адресою
http://localhost:80
ми побачимо вітальне повідомлення. Так як я з докером працюю в середовищі windows, то взаємодію не безпосередньо, а через
docker-machine
, тому мені треба звернутися на ip адреса
docker-machine
, який можна дізнатися не хитрою командою

docker-machine ip

В моєму випадку треба перевірити додаток за адресою
http://192.168.99.100:80
(80 порт можна і не вказувати).

Вуаля, працює!

alt

Створюємо правильний докер образ

Однак не все так гладко, звичайно ж в докері є і підводні камені. Один такий великий підводний камінь проблема PID 1 або зобмі процес, детальніше тут. Хлопці з phusion(творці phusion passenger) подбали про нас і зробили образ phusion/baseimage вирішальний багато проблем, який ми і будемо використовувати для створення образу з ASP.NET Core.

Методом чесного копіювання команд з Docker файлу від Microsoft полчим свій:

FROM phusion/baseimage:latest

ENV DNX_VERSION 1.0.0-rc1-update1
ENV DNX_USER_HOME /opt/DNX_BRANCH

ENV DNX_RUNTIME_ID ubuntu.14.04-x64

RUN apt-get -qq update && apt-get -qqy install unzip curl libicu-dev libunwind8 gettext libssl-dev libcurl3-gnutls zlib1g && rm -rf /var/lib/apt/lists/*

RUN curl -sSL https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.sh | DNX_USER_HOME=$DNX_USER_HOME DNX_BRANCH=v$DNX_VERSION sh
RUN bash -c "source $DNX_USER_HOME/dnvm/dnvm.sh \
&& dnvm install $DNX_VERSION -alias default -r coreclr \
&& dnvm alias default | xargs -i ln -s $DNX_USER_HOME/runtimes/{} $DNX_USER_HOME/runtimes/default"

RUN LIBUV_VERSION=1.4.2 \
&& apt-get -qq update \
&& apt-get -qqy install autoconf automake build-essential libtool \
&& curl -sSL https://github.com/libuv/libuv/archive/v${LIBUV_VERSION}.tar.gz | tar zxfv - -C /usr/local/src \
&& cd /usr/local/src/libuv-$LIBUV_VERSION \
&& sh autogen.sh && ./configure && make && make install \
&& rm -rf /usr/local/src/libuv-$LIBUV_VERSION \
&& ldconfig \
&& apt-get -y purge autoconf automake build-essential libtool \
&& apt-get -y autoremove \
&& apt-get -y clean \
&& rm -rf /var/lib/apt/lists/*

ENV PATH $PATH:$DNX_USER_HOME/runtimes/default/bin

COPY . /app
WORKDIR /app
RUN ["dnu", "restore"]

EXPOSE 5004
ENTRYPOINT ["dnx", "web"]

Що робити даль нам вже відомо:

docker build -t aspnetcore-phusion .

docker run -d -p 80:5004 aspnetcore-phusion

Якщо ви як і я не зупиняли контейнер створений на початку статті, то докер повідомить нам що 80 порт вже зайнятий:

docker: Error response from daemon: failed to create endpoint loving_kowalevski on network bridge: Bind for 0.0.0.0:80 failed: port is already allocated.

Зупинимо наш раніше запущений контейнер і запустимо новий

docker stop loving_kowalevski
docker run -d -p 50:5004 aspnetcore-phusion 

Кожен раз, коли ми запускаємо контейнер докер генеруємо йому рандомное ім'я. Як саме — можна подивитися тут.

Висновок

У цій короткій оглядовій статті ми створили кілька контейнерів з простим ASP.NET Core додатком. Звичайно, в реальності програми зазвичай складніше, і контейнерів більше.

На мій погляд, додатки ASP.NET Core запускаються на coreclr поки ще не production ready, так як не всі звичні нам библиотке можу запускатися на coreclr. Наприклад для mongodb ще немає драйвера, а autofac ще в альфі. Звичайно, можна знайти вихід mono, але ми тут з вами про coreclr. Однак прогрес не стоїть на місці, бібліотеки портируются, і незабаром ми побачимо справжні кросплатформені програми на ASP.NET Core.

Авторам

Друзі, якщо вам цікаво підтримати колонку своїм власним матеріалом, то прошу написати мені на vyunev@microsoft.com для того, щоб обговорити всі деталі. Ми шукаємо авторів, які можуть цікаво розповісти про ASP.NET та інші теми.

Про автора
Бобик В'ячеслав Борисович,
Розробник .NET у Radario

Молодий .Net програміст, з 3 роками досвіду. Розробник на ASP.NET MVC, автор додатків для Windows і Windows phone.

Анонс! Глибокий інтенсив на конференції DevCon 2016
image

Ми раді оголосити про проведення глибокого інтенсив-курсу ASP.NET Core в рамках конференції DevCon 2016. Цей курс буде проходити у другий день конференції і займе повний день конференції протягом 6 годин.

Розробка сучасних веб-додатків на відкритій платформі ASP.NET 5
В рамках цього інтенсиву учасники візьмуть участь у захоплюючій і повне пригод подорож, присвяченому розробці веб-додатків на новітній платформі ASP.NET 5. Ми пройдемо весь шлях від нуля до повноцінного програми, розгорнутого в хмарі. І по дорозі учасники зможуть зупинитися для вивчення внутрішнього устрою ASP.NET роботи з реляційними і NoSQL базами даних за допомогою Entity Framework 7, розробки додатків на фреймворку MVC, побудові моделей, уявлень і бізнес-логіки, створення REST API, організації процесів безперервної розробки і тестування за допомогою Git і Visual Studio Online, а також розгортання Azure і контейнерів Docker. В кінці подорожі всі учасники пройдуть посвяту і стануть заслуженими лицарями ASP.NET.

Реєстрація на конференцію DevCon 2016 вже відкрита! Реєструйтеся тут.

Вам цікава тема інтеграції з контейнерами?

/>
/>


<input type=«radio» id=«vv71683»
class=«radio js-field-data»
name=«variant[]»
value=«71683» />
Так, цікава
<input type=«radio» id=«vv71685»
class=«radio js-field-data»
name=«variant[]»
value=«71685» />
дуже

Проголосувало 22 людини. Утрималося-3 людини.


Тільки зареєстровані користувачі можуть брати участь в опитуванні. Увійдіть, будь ласка.


Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.