Опановуємо Docker: Від ізольованих контейнерів до масштабного кластера на AWS
Практичний посібник з прикладами коду (частина перша)
Docker — це потужний інструмент, який революціонізував спосіб розробки, розгортання та масштабування застосунків. Якщо ви коли-небудь стикалися з проблемами сумісності середовищ або складністю налаштування інфраструктури, Docker стане вашим найкращим союзником.
Цей практичний посібник створено для того, щоб допомогти вам опанувати основи Docker, зрозуміти принципи роботи контейнерів і навчитися ефективно застосовувати цю технологію у повсякденній розробці.
Що таке Docker?
Отже, почнімо з основ. Docker — це потужна платформа з відкритим кодом, яка спрощує автоматизацію розгортання програмних застосунків всередині контейнерів, додаючи новий рівень абстракції та автоматизації операційної системи на Linux. Простими словами, Docker дає змогу розробникам і системним адміністраторам швидко та зручно запускати свої застосунки в спеціальних ізольованих середовищах, що називають контейнерами, на хостовій операційній системі, наприклад, на Linux. Однією з основних переваг Docker є можливість упаковувати застосунок разом з усіма його залежностями в стандартизовану одиницю для подальшої розробки. На відміну від віртуальних машин, контейнери мають низькі витрати на ресурси, що допомагає ефективніше використовувати систему та потужності.
Що таке контейнери?
Сьогодні стандартом для запуску застосунків є використання віртуальних машин (VM). Вони дають змогу запускати застосунки в середовищі гостьової операційної системи, що працює на віртуалізованому апаратному забезпеченні хостової ОС. Віртуальні машини добре ізолюють процеси застосунків, але для цього потрібно витрачати значні ресурси на віртуалізацію. Контейнери підходять по-іншому: вони залучають ресурси хостової операційної системи, забезпечуючи ізоляцію процесів віртуальних машин, але з мінімальними витратами на обчислення.
Чому варто використовувати саме контейнери?
Контейнери пропонують зручний механізм для упаковки застосунків, що дає змогу відокремити їх від середовища, в якому вони працюють. Це допомагає застосункам працювати стабільно і послідовно, незалежно від того, де саме їх запускають: у приватному дата-центрі, публічній хмарі чи на особистому ноутбуці розробника. Завдяки такій абстракції контейнери дозволяють створювати передбачуване й ізольоване середовище для застосунків, яке можна запускати в будь-якому місці. З операційного погляду, контейнери не тільки підвищують портативність, але й забезпечують кращий контроль за використанням ресурсів, що дає змогу значно знизити навантаження на інфраструктуру та підвищити ефективність.
Завдяки вищезгаданим перевагам контейнери, зокрема Docker, набули чималої популярності. Великі компанії, як-от Google, Facebook, Netflix і Salesforce, активно задіюють контейнери для покращення продуктивності своїх інженерних команд та ефективнішого застосування обчислювальних ресурсів. За словами Google, саме контейнери дали змогу значно оптимізувати роботу дата-центрів.
Що ви дізнаєтеся з цього посібника?
Посібник пропонує комплексний підхід до опанування Docker. Він надасть не лише теоретичні знання, а й практичні навички створення та розгортання власних вебзастосунків у хмарі. Для цього ми використовуватимемо Amazon Web Services, щоб розгорнути статичний сайт і два динамічні застосунки на EC2 за допомогою Elastic Beanstalk та Elastic Container Service. Цей матеріал стане чудовим початком навіть для тих, хто ніколи не працював з розгортаннями.
Початок роботи
Цей посібник складається з кількох розділів, кожен з яких пояснює різні аспекти Docker. Всі команди й код, що використано, доступні в репозиторії на GitHub.
Примітка: посібник орієнтований на Docker версії 18.05.0-ce. Якщо ви зіткнетеся з проблемами сумісності, будь ласка, повідомте про це.
Попередні вимоги
Для цього посібника потрібні лише базові навички роботи з командним рядком і текстовим редактором. Для клонування репозиторію використовують git clone. Якщо у вас немає Git, завантажте файли вручну з GitHub. Попередній досвід у розробці вебзастосунків буде корисним, але не обов’язковим. Також для подальшої роботи створіть облікові записи на Amazon Web Services і Docker Hub.
Налаштування комп’ютера
Налаштування Docker стало значно легшим. Раніше для запуску на OSX і Windows потрібно було більше зусиль, але зараз процес значно спрощений. Інструкції для налаштування Docker на Mac, Linux і Windows можна знайти на офіційних сайтах ОС.
Після завершення встановлення Docker перевірте його роботу, виконавши таку команду:
$ docker run hello-world
Hello from Docker.
This message shows that your installation appears to be working correctly.
...
Привіт, світе
Гра з busybox
Тепер, коли все налаштовано, час взятися до справи. У цьому розділі ми запустимо контейнер busybox на своїй системі та ознайомимося з командою docker run.
Для початку запустіть таку команду:
$ docker pull busybox
Примітка: залежно від того, як ви встановили Docker на своїй системі, можете побачити помилку permission denied після виконання вищезазначеної команди. Якщо ви використовуєте Mac, переконайтеся, що Docker Engine працює. Якщо ви на Linux, додайте префікс sudo до команд Docker. Ви також можете створити групу Docker, щоб позбутися цієї проблеми.
Команда pull завантажує образ busybox із реєстру Docker та зберігає його в системі. Ви можете застосовувати команду docker images, щоб побачити список усіх образів у вашій системі.
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
busybox latest c51f86c28340 4 weeks ago 1.109 MB
Docker Run
Чудово! Тепер запустимо контейнер Docker на основі цього образу. Для цього ми застосовуватимемо команду docker run.
$ docker run busybox
$
Нічого не сталося? Це нормально. За лаштунками відбувається багато чого. Коли ви викликаєте команду run, клієнт Docker знаходить образ (в цьому випадку — busybox), завантажує контейнер і виконує команду в ньому. Коли ми запускаємо команду docker run busybox, ми не вказали команду, тому контейнер завантажився, виконав порожню команду, а потім вийшов. Ну, так, це не дуже цікаво. Спробуймо щось більш захопливе.
$ docker run busybox echo "hello from busybox"
hello from busybox
А от і результат! У цьому випадку клієнт Docker виконував команду echo в контейнері busybox, а потім вийшов з нього. Якщо ви звернули увагу, усе це сталося досить швидко. Уявіть, що ви запускаєте віртуальну машину, виконуєте команду, а потім її завершуєте. Тепер розумієте, чому кажуть, що контейнери швидкі! Перейдемо до команди docker ps. Команда docker ps показує всі контейнери, які зараз працюють.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Оскільки жодні контейнери не працюють, ми бачимо порожній рядок. Спробуємо корисніший варіант: docker ps -a
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
305297d7a235 busybox "uptime" 11 minutes ago Exited (0) 11 minutes ago distracted_goldstine
ff0a5c3750b9 busybox "sh" 12 minutes ago Exited (0) 12 minutes ago elated_ramanujan
14e5bd11d164 hello-world "/hello" 2 minutes ago Exited (0) 2 minutes ago thirsty_euclid
Отже, що бачимо вище — це список усіх контейнерів, які ми запускали. Зверніть увагу, що стовпець STATUS показує, що ці контейнери завершили свою роботу кілька хвилин тому.
Напевно, ви запитаєте, чи є спосіб запускати більш як одну команду в контейнері. Спробуємо:
$ docker run -it busybox sh
/ # ls
bin dev etc home proc root sys tmp usr var
/ # uptime
05:45:21 up 5:58, 0 users, load average: 0.00, 0.01, 0.04
Запуск команди run з прапорцями -it підключає нас до інтерактивного термінала в контейнері. Тепер ми можемо виконувати стільки команд, скільки хочемо. Спробуйте!
Небезпечно: якщо ви достатньо відчайдушні, спробуйте команду rm -rf bin в контейнері. Переконайтеся, що виконуєте цю команду в контейнері, а не на своєму ноутбуці/десктопі. Здійснення цього призведе до того, що інші команди, як-от ls, uptime, не працюватимуть. Щойно все перестане працювати, ви можете вийти з контейнера (введіть exit і натисніть Enter), а потім знову запустити його за допомогою команди docker run -it busybox sh. Оскільки Docker створює новий контейнер кожного разу, все повинно почати працювати знову.
Це завершення швидкої подорожі командою docker run, якою ви, ймовірно, користуватиметеся найчастіше. Варто витратити трохи часу, щоб звикнути до неї. Щоб дізнатися більше про команду run, застосовуйте docker run --help, щоб побачити список усіх прапорців, які вона підтримує. Далі ми побачимо кілька інших варіантів команди docker run.
Проте перед тим, як рухатися далі, швидко поговоримо про видалення контейнерів. Ми бачили вище, що навіть після того, як вийшли, досі можемо бачити залишки контейнера, виконуючи команду docker ps -a. За цим посібником ви виконуватимете команду docker run кілька разів, і залишені контейнери з'їдатимуть місце на диску. Тому зазвичай рекомендують очищувати контейнери, щойно закінчуєте з ними. Для цього ви можете виконати команду docker rm. Просто скопіюйте ID контейнерів вище і вставте їх поруч із командою.
$ docker rm 305297d7a235 ff0a5c3750b9
305297d7a235
ff0a5c3750b9
За видалення ви повинні побачити ID контейнерів, які повернуто. Якщо у вас багато контейнерів для видалення за один раз, копіювання та вставка ID можуть бути трудомісткими. У такому разі можете просто виконати:
$ docker rm $(docker ps -a -q -f status=exited)
Ця команда видаляє всі контейнери, що мають статус exited. Якщо вам цікаво, прапорець -q повертає лише числові ID, а -f фільтрує вивід за вказаними умовами. Останнє, що буде корисним, — це прапорець --rm, який можна передати команді docker run, яка автоматично видаляє контейнер після його завершення. Для одноразових запусків Docker прапорець --rm дуже ефективний.
У пізніших версіях Docker команду docker container prune можна використовувати для досягнення того самого ефекту.
$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
4a7f7eebae0f63178aff7eb0aa39f0627a203ab2df258c1a00b456cf20063
f98f9c2aa1eaf727e4ec9c0283bcaa4762fbdba7f26191f26c97f64090360
Total reclaimed space: 212 B
Ви також можете видалити образи, які вам більше не потрібні, за допомогою команди docker rmi.
Основні терміни Docker
У попередньому розділі ми використали багато термінів, які можуть бути незрозумілими для новачків у Docker. Розберімося в основних поняттях, які часто трапляються в екосистемі Docker:
- Образи (Images): це своєрідні креслення або шаблони застосунків, які слугують основою для створення контейнерів. Наприклад, у нашій демонстрації ми завантажили образ
busyboxза допомогою командиdocker pull. - Контейнери (Containers): це екземпляри, зроблені на основі образів, які запускають сам застосунок. Контейнер створюють за допомогою команди
docker run, як у випадку з образомbusybox.Список запущених контейнерів можна переглянути за допомогою командиdocker ps. - Docker Daemon: фоновий сервіс, що працює на хості та керує створенням, запуском і розповсюдженням Docker-контейнерів. Це процес, із яким взаємодіють клієнти Docker.
- Docker Client: інструмент командного рядка, який дає змогу користувачу взаємодіяти з Docker Daemon. Крім CLI, існують інші клієнти, наприклад, Kitematic, який забезпечує графічний інтерфейс.
- Docker Hub: реєстр образів Docker. Його можна уявити як каталог, у якому доступні всі образи Docker. За потреби можна створити власні реєстри для зберігання та завантаження образів.
Вебзастосунки з Docker
Озброєні новими знаннями, ми готові перейти до справжньої роботи, а саме до розгортання вебзастосунків за допомогою Docker!
Статичні сайти
Почнімо з малих кроків. Перше, що ми розглянемо, — як запустити дуже простий статичний вебсайт. Завантажимо образ Docker з Docker Hub, запустимо контейнер і побачимо, як легко можна запустити вебсервер.
Почнемо. Образ, який ми використовуватимемо, — це односторінковий сайт, що вже створено для цієї демонстрації та розміщено на реєстрі: prakhar1989/static-site. Можемо завантажити й запустити його безпосередньо за один крок, застосовуючи команду docker run. Як згадано вище, прапорець --rm автоматично видаляє контейнер після його завершення, а прапорець -it вказує на інтерактивний термінал, що полегшує зупинку контейнера за допомогою Ctrl+C (на Windows).
$ docker run --rm -it prakhar1989/static-site
Оскільки образу не існує локально, клієнт спочатку завантажить його з реєстру, а потім запустить. Якщо все буде добре, ви повинні побачити повідомлення "Nginx is running..." у своєму терміналі. Тепер, коли сервер працює, як подивитися сайт? На якому порту він працює? І найголовніше — як ми можемо достукатися до контейнера безпосередньо з вашої хост-машини? Натискайте Ctrl+C, щоб зупинити контейнер.
У цьому випадку клієнт не відкриває жодних портів, тому нам потрібно знову виконати команду docker run, щоб опублікувати порти. Поки робимо це, також повинні знайти спосіб, щоб наш термінал не був прив’язаним до запущеного контейнера. Таким чином, ви зможете закрити термінал і залишити контейнер працювати. Це називають відокремленим режимом.
$ docker run -d -P --name static-site prakhar1989/static-site
e61d12292d69556eabe2a44c16cbd54486b2527e2ce4f95438e504afb7b02810
У вищезазначеній команді прапорець -d від’єднує наш термінал, прапорець -P публікує всі відкриті порти на випадкові порти, а --name дає ім’я, яке ми хочемо призначити. Тепер ми можемо побачити порти, виконуючи команду docker port [CONTAINER]:
$ docker port static-site
80/tcp -> 0.0.0.0:32769
443/tcp -> 0.0.0.0:32768
Ви можете відкрити http://localhost:32769 у вашому браузері.
Примітка: якщо ви використовуєте docker-toolbox, то, можливо, доведеться застосувати docker-machine ip default, щоб отримати IP-адресу.
Ви також можете вказати власний порт, на який клієнт перенаправлятиме підключення до контейнера.
$ docker run -p 8888:80 prakhar1989/static-site
Nginx is running...

Щоб зупинити відокремлений контейнер, виконайте команду docker stop, вказавши ID контейнера. У цьому випадку ми можемо використати ім’я static-site, яке вказали під час запуску контейнера.
$ docker stop static-site
static-site
Погодьтеся, це було дуже просто. Щоб розгорнути це на реальному сервері, вам потрібно лише встановити Docker і виконати вищезазначену команду Docker. Тепер, коли ви побачили, як запустити вебсервер всередині образу Docker, вам, напевно, цікаво, як створити власний образ Docker? Це питання, яке ми розберемо в наступному розділі.
Образи Docker
Ми вже розглядали образи раніше, але в цьому розділі заглибимося в те, що таке образи Docker, і створимо власний! Наприкінці використаємо цей образ для запуску нашого застосунку локально, а потім розгорнемо його на AWS, щоб поділитися з друзями! Захоплені? Чудово! Почнемо.
Образи Docker є основою контейнерів. У попередньому прикладі ми завантажили образ busybox із реєстру і попросили Docker-клієнт запустити контейнер на основі нього. Щоб побачити список образів, які доступні локально, використовуйте команду docker images.
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
prakhar1989/catnip latest c7ffb5626a50 2 hours ago 697.9 MB
prakhar1989/static-site latest b270625a1631 21 hours ago 133.9 MB
python 3-onbuild cf4002b2c383 5 days ago 688.8 MB
martin/docker-cleanup-volumes latest b42990daaca2 7 weeks ago 22.14 MB
ubuntu latest e9ae3c220b23 7 weeks ago 187.9 MB
busybox latest c51f86c28340 9 weeks ago 1.109 MB
hello-world latest 0a6ba66e537a 11 weeks ago 960 B
Вищезазначене дає список образів, які завантажено з реєстру, разом з тими, які створено окремо (ми скоро побачимо як). TAG вказує на конкретний знімок (snapshot) образу, а IMAGE ID — відповідний унікальний ідентифікатор цього образу.
Для спрощення можна думати про образ як про репозиторій git — образи можуть бути комітованими зі змінами та мати кілька версій. Якщо ви не вказуєте конкретний номер версії, клієнт за замовчуванням використовує latest. Наприклад, можете завантажити конкретну версію образу ubuntu:
$ docker pull ubuntu:18.04
Щоб отримати новий образ Docker, ви можете або завантажити його з реєстру (як-от Docker Hub), або створити власний. На Docker Hub доступні десятки тисяч образів. Ви також можете шукати образи безпосередньо з командного рядка, використовуючи команду docker search.
Важливо розуміти відмінність між базовими й дочірніми образами.
- Базові образи — це ті, що не мають батьківського образу, зазвичай вони з операційними системами, як-от ubuntu, busybox або debian.
- Дочірні образи — це ті, які будуються на основі базових образів і додають функціональність.
Також існують офіційні та користувацькі образи, які можуть бути як базовими, так і дочірніми.
- Офіційні образи — це ті, які офіційно підтримуються й обслуговуються командою Docker. Зазвичай це однослівні імена. У списку вище образи python, ubuntu, busybox та hello-world є офіційними образами.
- Користувацькі образи — це ті, що створені й поділені користувачами, як-от ви, наприклад. Вони будуються на основі базових образів і додають функціональність. Зазвичай вони мають формат user/image-name.
Ваш перший образ Docker
Тепер, коли ми краще розуміємо образи, настав час зробити власний. Наша мета в цьому розділі — створити образ, який «загортає» простий Flask-застосунок. Для демонстрації вже є програма Flask, яка відтворює випадковий .gif кішки кожного разу, коли завантажується, адже, як ви знаєте, хто ж не любить котів? Якщо ще не зробили, будь ласка, клонуйте репозиторій локально:
$ git clone https://github.com/prakhar1989/docker-curriculum.git
$ cd docker-curriculum/flask-app
Це потрібно клонувати на машині, де ви запускаєте команди Docker, а не всередині контейнера Docker.
Наступний крок зараз — створити образ із цим вебзастосунком. Як згадували вище, всі користувацькі образи засновано на базовому образі. Оскільки наш застосунок написаний на Python, базовим образом, який ми використовуватимемо, буде Python 3.
Dockerfile
Dockerfile — це простий текстовий файл, що містить список команд, які викликає Docker-клієнт під час створення образу. Це легкий спосіб автоматизувати процес. Найкраще те, що команди, які ви пишете в Dockerfile, майже ідентичні до їхніх еквівалентів у Linux. Тобто вам не потрібно вчитися нового синтаксису для створення своїх Dockerfile.
У каталозі із застосунком вже є Dockerfile, але, оскільки ми робимо це вперше, створимо один з нуля. Для початку відкрийте новий порожній файл у нашому улюбленому текстовому редакторі та збережіть його в тому самому каталозі, що й Flask-застосунок під іменем Dockerfile.
Почнемо із вказівки нашого базового образу. Використовуйте ключове слово FROM, щоб це зробити:
FROM python:3.8
Наступний крок зазвичай полягає в написанні команд копіювання файлів та встановлення залежностей. Спершу ми вказуємо робочий каталог, а потім копіюємо всі файли для нашого застосунку.
# set a directory for the app
WORKDIR /usr/src/app
# copy all the files to the container
COPY . .
Тепер, коли у нас є файли, можемо встановити залежності.
# install dependencies
RUN pip install --no-cache-dir -r requirements.txt
Наступне, що нам потрібно вказати, — це порт, який треба розкрити. Оскільки наш Flask-застосунок працює на порту 5000, це те, що ми вказуватимемо.
EXPOSE 5000
Останній крок — написати команду для запуску застосунку, яка просто — python ./app.py. Ми використовуємо команду CMD для цього.
CMD ["python", "./app.py"]
Основна мета CMD — вказати контейнеру, яку команду виконувати під час його запуску. З цим наш Dockerfile тепер готовий. Ось такий вигляд він має:
FROM python:3.8
# set a directory for the app
WORKDIR /usr/src/app
# copy all the files to the container
COPY . .
# install dependencies
RUN pip install --no-cache-dir -r requirements.txt
# define the port number the container should expose
EXPOSE 5000
# run the command
CMD ["python", "./app.py"]
Тепер, коли у нас є Dockerfile, можемо побудувати образ. Команда docker build виконує всю важку роботу зі створення образу Docker з Dockerfile.
У розділі нижче показано вихід виконання тієї самої команди. Перед тим, як ви запустите команду самостійно (не забувайте крапку), переконайтеся, що замінюєте ім’я користувача з прикладу на своє. Це ім’я має бути таким самим, яке ви вказали під час реєстрації на Docker Hub. Якщо ви ще не зробили це, будь ласка, створіть обліковий запис. Команда docker build досить проста — вона приймає необов’язкове ім’я тегу з -t і місце розташування каталогу з Dockerfile.
$ docker build -t yourusername/catnip .
Sending build context to Docker daemon 8.704 kB
Step 1 : FROM python:3.8
# Executing 3 build triggers...
Step 1 : COPY requirements.txt /usr/src/app/
---> Using cache
Step 1 : RUN pip install --no-cache-dir -r requirements.txt
---> Using cache
Step 1 : COPY . /usr/src/app
---> 1d61f639ef9e
Removing intermediate container 4de6ddf5528c
Step 2 : EXPOSE 5000
---> Running in 12cfcf6d67ee
---> f423c2f179d1
Removing intermediate container 12cfcf6d67ee
Step 3 : CMD python ./app.py
---> Running in f01401a5ace9
---> 13e87ed1fbc2
Removing intermediate container f01401a5ace9
Successfully built 13e87ed1fbc2
Якщо у вас немає образу python:3.8, клієнт спочатку завантажить образ, а потім створить ваш образ. Тому ваш вихід від виконання команди може мати трохи інакший вигляд. Якщо все минуло добре, ваш образ повинен бути готовим! Запустіть docker images і подивіться, чи він відтворюється.
Останній крок у цьому розділі — запустити образ і з’ясувати, чи дійсно це працює (замінюючи ім’я користувача на своє).
$ docker run -p 8888:5000 yourusername/catnip
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
Команда, яку ми щойно запустили, використовувала порт 5000 для сервера всередині контейнера та розкрила це зовнішньо на порту 8888. Перейдіть за URL-адресою з портом 8888, де ваш застосунок має бути онлайн.

Вітаю! Ви успішно створили свій перший образ Docker.
Docker на AWS
Який сенс без можливості поділитися застосунком з друзями, правда? У цьому розділі розберемо, як ми можемо розгорнути свій чудовий застосунок у хмарі, щоб поділитися ним з друзями. Ми використовуватимемо AWS Elastic Beanstalk, щоб налаштувати застосунок за кілька кліків. Також побачимо, наскільки легко зробити його масштабованим і керованим за допомогою Beanstalk!
Docker push
Перше, що нам потрібно зробити перед тим, як розгорнути застосунок на AWS, — це опублікувати образ у реєстрі, до якого може звертатися AWS. Є багато різних реєстрів Docker для використання (можна навіть хостити власний). Для цього залучаємо Docker Hub для публікації образу.
Якщо ви вперше пушите образ, клієнт попросить вас увійти в систему. Введіть ті самі облікові дані, які ви залучали для входу в Docker Hub.
$ docker login
Login in with your Docker ID to push and pull images from Docker Hub. If you do not have a Docker ID, head over to https://hub.docker.com to create one.
Username: yourusername
Password:
WARNING! Your password will be stored unencrypted in /Users/yourusername/.docker/config.json
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/credential-store
Login Succeeded
Щоб опублікувати, просто введіть команду нижче, пам’ятаючи замінити ім’я тегу образу на ваше. Важливо, щоб формат був yourusername/image_name, щоб клієнт знав, куди публікувати.
$ docker push yourusername/catnip
Після того, як це зроблено, ви можете переглянути свій образ на Docker Hub.
Тепер, коли образ у мережі, будь-хто, в кого є Docker, може протестувати ваш застосунок, набравши одну команду.
$ docker run -p 8888:5000 yourusername/catnip
Якщо ви коли-небудь морочилися над налаштуванням локальних середовищ розробки або обміном конфігурацією застосунків, то добре розумієте, як чудово це звучить. Ось чому Docker такий класний!
Beanstalk
AWS Elastic Beanstalk (EB) — це PaaS (Platform as a Service), який пропонує AWS. Якщо ви використовували Heroku, Google App Engine тощо, то почуватиметесь, як удома. У ролі розробника ви просто вказуєте EB, як запустити ваш застосунок, а він подбає про решту — включно з масштабуванням, моніторингом і навіть оновленням. У квітні 2014 року EB додав підтримку запуску одноконтейнерних Docker-застосунків, що ми й задіюємо для розгортання свого. Хоча EB має дуже інтуїтивно зрозумілий інтерфейс командного рядка, для простоти ми використовуватимемо вебінтерфейс для запуску застосунку.
Щоб продовжити, вам потрібен обліковий запис AWS, що функціонує. Якщо у вас його ще немає, будь ласка, створіть зараз — вам треба буде ввести дані своєї кредитної картки. Але не переживайте, це безоплатно, і все, що ми робимо в цьому посібнику, також буде безоплатним! Почнімо.
Ось кроки:
1. Увійдіть у консоль AWS.
2. Перейдіть до Elastic Beanstalk. Це буде в розділі compute у лівому верхньому куті. Альтернативно, ви можете перейти до консолі Elastic Beanstalk.

3. Натисніть Create New Application у верхньому правому куті.
4. Дайте вашому застосунку легке для запамʼятовування (але унікальне) ім’я та додайте опис (необов’язково).
5. На екрані New Environment створіть нове середовище та оберіть Web Server Environment.
6. Заповніть інформацію про середовище, обравши домен. Це URL, яким ви поділитеся з друзями, тож переконайтеся, що він дійсно легко запам’ятовується.
7. У розділі конфігурації оберіть Docker із попередньо визначеної платформи.

8. Тепер нам потрібно завантажити код застосунку. Оскільки наш застосунок упаковано в Docker-контейнер, потрібно просто вказати EB про контейнер. Відкрийте файл Dockerrun.aws.json, що розташований у каталозі flask-app, і змініть ім’я образу на ім’я вашого образу. Далі оберіть Upload your Code, виберіть цей файл і натисніть Upload.
9. Тепер натисніть Create environment. Останній екран, який побачите, матиме кілька індикаторів, що ваше середовище налаштовується. Це зазвичай займає близько 5 хвилин під час першого налаштування.
Поки чекаємо, швидко переглянемо вміст файлу Dockerrun.aws.json. Це специфічний для AWS файл, який дає EB відомості про наш застосунок та Docker-конфігурацію.
{
"AWSEBDockerrunVersion": "1",
"Image": {
"Name": "prakhar1989/catnip",
"Update": "true"
},
"Ports": [
{
"ContainerPort": 5000,
"HostPort": 8000
}
],
"Logging": "/var/log/nginx"
}
Файл повинен бути досить зрозумілим, але ви завжди можете звернутися до офіційної документації для детальнішої інформації. Ми вказуємо ім’я образу, який EB має використовувати, а також порт, який контейнер повинен відкрити.
Коли середовище буде готовим, перейдіть на сторінку EB — і ви повинні побачити зелену галочку, що вказує на те, що ваш застосунок живий і працює.

Відкрийте зазначену URL-адресу у браузері, щоб побачити застосунок у всій його красі. Надішліть посилання своїм друзям, щоб усі могли насолодитися гіфками з котиками.
Очищення
Після того, як ви вдосталь насолодитеся своїм застосунком, не забудьте завершити роботу середовища, щоб уникнути зайвих витрат на додаткові ресурси.

Вітаємо! Ви розгорнули свій перший Docker-застосунок! Може здатися, шо ви зробили забагато кроків, але з інтерфейсом командного рядка для EB можете майже імітувати функціональність Heroku всього кількома натисканнями клавіш! Сподіваємося, ви погодитеся, що Docker розв’язує багато труднощів під час створення та розгортання застосунків у хмарі. Рекомендую вам прочитати документацію AWS щодо одноконтейнерних Docker-середовищ, щоб дізнатися більше про доступні функції.
У наступній (і останній) частині підручника ми піднімемо ставки й розгорнемо застосунок, який більше схожий на реальний світ: застосунок з постійним бекенд-сховищем. Нумо розпочинати!