[Перевод] Краш-курс на Docker: научитесь плавать с большой рыбой
Краткое руководство по началу работы, которое вы ищете.
Если вы следовали тенденциям развития программного обеспечения в прошлом году, то, должно быть, устали слышать термин Docker. Вероятнее всего, вы ошеломлены огромным количеством разработчиков, говорящих о контейнерах, изолированных виртуальных машинах, супервизорах и другой магии Вуду, связанной с DevOps. Сегодня мы во всем разберемся. Пора наконец понять, что такое контейнеры как услуга и зачем они нужны.
TL; DR
- «Зачем мне это нужно?»
- Обзор всех ключевых терминов.
- Почему нам нужны CaaS и Docker.
- Быстрый старт.
- Установка Docker.
- Создание контейнера.
- Реальный сценарий.
- Создание контейнера nginx для размещения статического веб-сайта.
- Обучение использованию инструментов сборки для автоматизации команд Docker.
«Зачем мне это нужно?»
Не так давно я задал себе тот же вопрос. Будучи долгое время упрямым разработчиком, я наконец сел и принял удивительность использования контейнеров. Вот мое мнение, почему вы должны попробовать их применить.
Docker?
Docker — программное обеспечение для создания контейнерных приложений. Контейнера должны быть небольшими, не хранящими информацию среды для запуска части программного обеспечения.
Образ контейнера представляет собой легкий, автономный исполняемый пакет части программного обеспечения, который включает все необходимое для его запуска: код, время выполнения, системные инструменты, системные библиотеки, настройки.
— Официальный сайт Docker.
Короче говоря, контейнер — крошечная виртуальная машина с примитивными функциями для запуска приложения, которое было положено в него.
Виртуальная машина?
Название «виртуальная машина» (VM) говорит само за себя: это виртуальная версия реальной машины, которая имитирует аппаратные средства машины внутри более крупной машины. Значит, вы можете запускать множество виртуальных машин на одном крупном сервере. Вы когда-нибудь видели фильм «Начало»? Виртуальная машина — что-то вроде «Начало». Часть программного обеспечения, позволяющая VM работать, называется Hypervisor.
Hypervisor?
У вас закипает мозг от новых терминов? Потерпите минутку, на то есть причины. Виртуальные машины работают только из-за Hypervisor. Это специальное программное обеспечение, которое позволяет физической машине размещать несколько разных виртуальных машин. Со стороны кажется, что VM запускают свои собственные программы и используют аппаратное обеспечение узла. Однако это Hypervisor выделяет ресурсы виртуальной машине.
Примечание: если вы когда-либо пытались установить программное обеспечение (такое как VirtualBox), но потерпели неудачу, скорее всего, это было связано с тем, что Hyper-V не включил BIOS вашего компьютера. Возможно, это случилось со мной больше раз, чем я помню. нервный смех**
Если вы такой же ботаник, как я, вот потрясающая запись на тему того, что такое Hypervisor.
Virtualization 101: What is a Hypervisor?
Отвечая на свои вопросы…
Для чего действительно нужен CaaS? Мы давно используем виртуальные машины. Почему внезапно стали хороши контейнеры? Никто не говорил, что виртуальные машины плохи, с ними просто сложно справиться.
DevOps, как правило, сложен, и нужно, чтобы назначенный человек все время выполнял связанную с ним работу. Виртуальные машины занимают много места и оперативной памяти, а также нуждаются в постоянной настройке. Не говоря уже о том, что требуется опыт для правильного управления ими.
Чтобы не выполнять двойную работу, автоматизируйте
С Docker вы можете абстрагироваться от регулярных конфигураций и настроек среды и вместо этого сосредоточиться на кодировании. С Docker Hub вы можете взять предварительно созданные образы и запустить их в работу за короткое время.
Но самым большим преимуществом является создание однородной среды. Вместо того чтобы устанавливать список различных зависимостей для запуска приложения, нужно установить только Docker. Docker — кроссплатформенный, поэтому каждый разработчик команды будет работать в той же среде. То же самое относится к разработке, постановке и производственному серверу. Это круто! Нет больше «это работает на моей машине».
Быстрый старт
Начнем с установки. Удивительно: требуется всего лишь часть программного обеспечения, установленного на машине разработки, и все будет работать нормально. Docker — все, что нужно.
Установка Docker
К счастью, процесс установки очень прост. Вот так совершается установка на Ubuntu.
$ sudo apt-get update
$ sudo apt-get install -y docker.io
Это все, что нужно. Чтобы убедиться, что Docker работает, вы можете запустить другую команду.
$ sudo systemctl status docker
Docker должен вернуть результаты работы.
● docker.service – Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2018-01-14 12:42:17 CET; 4h 46min ago
Docs: https://docs.docker.com
Main PID: 2156 (dockerd)
Tasks: 26
Memory: 63.0M
CPU: 1min 57.541s
CGroup: /system.slice/docker.service
├─2156 /usr/bin/dockerd -H fd://
└─2204 docker-containerd --config /var/run/docker/containerd/containerd.toml
Если системные службы остановлены, запустите комбо из двух команд, чтобы развернуть Docker и убедиться, что он запускается при загрузке.
$ sudo systemctl start docker && sudo systemctl enable docker
При базовой установке Docker нужно запустить команду docker
как sudo
. Но если добавить пользователя в группу docker
, можно запустить команду без sudo
.
$ sudo usermod -aG docker ${USER}
$ su - ${USER}
Запуск команд добавит пользователя в группу docker
. Чтобы проверить это, запустите $ id -nG
. Если вернетесь к устройству вывода с вашим именем пользователя в списке, все сделано правильно.
Что насчет Mac и Windows? К счастью, установка так же проста. Скачайте простой файл, который запускает мастер установки. Нет ничего легче. Посмотрите здесь мастер установки для Mac и здесь для Windows.
Развертывание контейнера
После развертывания и запуска Docker мы можем немного поэкспериментировать. Четыре первые команды, которые нужно поставить в работу:
- создать — создается контейнер из образа;
- ps — выводится список запущенных контейнеров, опционально флаг
-a
для списка всех контейнеров; - запуск — запуск созданного контейнера;
- присоединить — присоединяет стандартный вход и выход терминала к работающему контейнеру, буквально подключая вас к контейнеру, как к любой виртуальной машине.
Начнем с малого. Возьмем изображение Ubuntu из Docker Hub и создадим из него контейнер.
$ docker create -it ubuntu:16.04 bash
Мы добавляем -it
как опциональную функцию, чтобы дать контейнеру интегрированный терминал. Мы можем подключиться терминалу, а также запустить команду bash
, поэтому получаем правильный интерфейс терминала. Указывая ubuntu: 16.04
, мы вытаскиваем изображение Ubuntu с тегом версии 16.04 из Docker Hub.
После запуска команды create убедитесь, что контейнер создан.
$ docker ps -a
Список должен выглядеть примерно так.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7643dba89904 ubuntu:16.04 "bash" X min ago Created name
Контейнер создан и готов к запуску. Запуск контейнера прост: задайте команду start
ID контейнера.
$ docker start 7643dba89904
Еще раз проверьте, запущен ли контейнер, но теперь без флага -a
.
$ docker ps
Если запущен, присоединяйтесь к нему.
$ docker attach 7643dba89904
Cursor меняется. Почему? Потому что вы только что вошли в контейнер. Теперь вы можете запустить любую команду bash, к которой привыкли в Ubuntu, как будто это был экземпляр, запущенный в облаке. Попробуйте.
$ ls
Все будет работать хорошо, и даже $ ll
. Простой контейнер Docker — все, что вам нужно. Это ваша собственная маленькая виртуальная площадка, где вы можете заниматься разработкой, тестированием или чем хотите! Нет необходимости использовать виртуальные машины или тяжелое программное обеспечение. Чтобы проверить мою точку зрения, установите что-нибудь в этом маленьком контейнере. Установка Node пройдет хорошо. Если хотите выйти из контейнера, введите exit
. Контейнер остановится, и вы сможете вывести список, напечатав $ docker ps -a
.
Примечание. Каждый контейнер Docker работает как sudo
по умолчанию, то есть команды sudo
не существует. Каждая выполняемая команда автоматически запускается с полномочиями sudo
.
Реальный сценарий
Время поработать с настоящим материалом. Это то, что вы будете использовать в реальной жизни для своих проектов и производственных приложений.
Контейнеры или протокол без сохранения состояния?
Я упомянул выше, что каждый контейнер изолирован и не сохраняет состояние. Это означает, что после удаления контейнера его содержимое будет удалено навсегда.
$ docker rm 7643dba89904
Как вы сохраняете данные в таком случае?
Вы когда-нибудь слышали о томах? Тома позволяют сопоставлять каталоги на главной машине с каталогами внутри контейнера.
$ docker create -it -v $(pwd):/var/www ubuntu:latest bash
При создании нового контейнера добавьте флаг -v
, чтобы указать, какой том создать. Эта команда привяжет текущий рабочий каталог на компьютере к директории / var / www
внутри контейнера.
После запуска контейнера с помощью команды $ docker start
можно отредактировать код на главной машине и посмотреть изменения в контейнере. Теперь вы можете сохранять данные для различных вариантов использования — от хранения изображений до хранения файлов базы данных — и, конечно, для разработки, где нужны возможности живой перезагрузки.
Примечание. Можно запускать команды create и start одновременно с командой run.
$ docker run -it -d ubuntu:16.04 bash
Примечание. Единственным дополнением является флаг -d, который указывает контейнеру работать отдельно, в фоновом режиме.
Почему я так много говорю о томах?
Мы можем создать простой веб-сервер nginx для размещения статического веб-сайта за пару простых шагов.
Создайте новый каталог, назовите его как хотите, я назову свой myapp для удобства. Все, что вам нужно, — создать простой файл index.html в каталоге myapp и вставить его.
Docker Quick Start
Hello Docker
This means the nginx server is working.
У нас есть общая веб-страница с текстом заголовка. Осталось запустить контейнер nginx.
$ docker run --name webserver -v $(pwd):/usr/share/nginx/html -d -p 8080:80 nginx
Мы захватываем изображение nginx из Docker Hub для мгновенной настройки nginx. Конфигурация томов похожа на то, что мы сделали выше. Мы указали на каталог по умолчанию, где nginx размещает HTML-файлы. Новым является параметр --name
, который мы установили для webserver
и -p 8080: 80
. Мы сопоставили порт контейнера 80 с портом 8080 на главной машине. Не забудьте запустить команду в каталоге myapp.
Проверьте, работает ли контейнер, с помощью $ docker ps
и запускается окно браузера. Перейдите на http: // localhost: 8080
.
У нас есть веб-сервер nginx, запускающийся всего за пару команд. Редактируйте в index.html как вам нужно. Перезагрузите страницу, и увидите, что содержимое изменилось.
Примечание. Вы можете остановить запущенный контейнер с помощью команды stop.
$ docker stop
Как сделать жизнь еще проще?
Есть поговорка: если нужно что-то сделать дважды, автоматизируй. К счастью, Docke позаботился об этом. Вместе с файлом index.html добавьте файл Docker. Его имя Dockerfile, без каких-либо расширений.
# Dockerfile
FROM nginx:alpine
VOLUME /usr/share/nginx/html
EXPOSE 80
Dockerfile — конфигурация сборки для образов Docker. Основное внимание уделяется образам! Мы указываем, что хотим захватить изображение nginx: alpine в качестве основы для нашего изображения, создать том и выставить порт 80.
Для создания образа у нас есть команда `build .
$ docker build . -t webserver:v1
.
указывает, где находится файл Docker, который будет использоваться для сборки образа, а -t
отмечает тег для образа. Образ будет известен как webserver:v1
.
С помощью этой команды мы не извлекли образ из Docker Hub, а вместо этого создали свой собственный. Чтобы посмотреть все образы, используйте команду images
.
$ docker images
Запустим созданный образ.
$ docker run -v $(pwd):/usr/share/nginx/html -d -p 8080:80 webserver:v1
Сила Dockerfile — надстройка, которую вы можете предоставить контейнеру. Можно предварительно создавать образы по своему вкусу, а если не нравятся повторяющиеся задачи, то совершить еще один шаг и установить docker-compose.
Docker-compose?
Docker-compose позволит создавать и запускать контейнер c одной команды. Но еще важнее, что вы можете построить целый кластер контейнеров и настроить их, используя docker-compose.
Перейдите на страницу установки и установите docker-compose на компьютер.
Install Docker Compose
Вернувшись в устройство, запустите $ docker-compose --version
. Разберемся с некоторыми композициями.
Вместе с Dockerfile добавьте еще один файл с именем docker-compose.yml и вставьте этот фрагмент.
# docker-compose.yml
version: '2'
services:
webserver:
build: .
ports:
- "8080:80"
volumes:
- .:/usr/share/nginx/html
Будьте осторожны с отступами, иначе *docker-compose.yml** не будет работать должным образом. Осталось только запустить его.
$ docker-compose up (-d)
Примечание. Аргумент команды docker-compose-d
используется для запуска в состоянии detached, используя можно запустить$ docker-compose ps
, чтобы увидеть, что в настоящее время работает, или остановить работу контейнеров с помощью$ docker-compose stop
.
Docker будет собирать образ из Dockerfile в текущем каталоге (.
), отображать порты, как мы это делали выше, а также «шарить» томы. Посмотрите, что происходит! То же самое, что мы делали с командами сборки и запуска. Теперь вместо них мы выполняем только одну команду docker-compose up
.
Вернитесь в браузер, и увидите, что все работает так же, как и раньше. Единственное различие в том, что теперь нет необходимости в утомительном написании команд в терминале. Мы заменили их двумя конфигурационными файлами — Dockerfile
и docker-compose.yml
. Оба эти файла могут быть добавлены в ваш репозиторий Git. Почему это важно? Потому что они всегда будут работать в производстве правильно, как и ожидалось. Точно такая же сеть контейнеров будет развернута на производственном сервере!
Чтобы закончить этот раздел, перейдите обратно в консоль и просмотрите список всех контейнеров еще раз.
$ docker ps -a
Если вы хотите удалить контейнер, можете запустить команду rm
, о которой я упоминал выше. Для удаления образов используйте команду rmi
.
$ docker rmi
Постарайтесь не оставлять остатки контейнеров и удалять их, если они вам больше не нужны.
Более широкая перспектива?
Убедившись, что Docker не является единственной технологией для создания контейнеров, я должен обязательно упомянуть менее популярные технологии. Docker — это всего лишь самый распространенный вариант контейнеризации. Но, похоже, rkt также отлично работает.
Копая глубже, я должен упомянуть об оркестровке контейнеров. Мы говорили только о верхушке айсберга. Docker-compose — это инструмент для создания сетей контейнеров. Но, когда появляется необходимость управлять большими объемами контейнеров и обеспечивать максимальный аптайм, в игру вступает оркестровка.
Управление большим кластером на основе контейнеров — вовсе не тривиальная задача. По мере роста количества контейнеров нужен способ автоматизации различных задач DevOps, которые мы обычно делаем. Оркестрация — это то, что помогает в создании хостов, создании или удалении контейнеров, когда нужно масштабировать или воссоздавать упавшие контейнеры, сетевые контейнеры и многое другое. И здесь на помощь приходят следующие инструменты: Kubernetes от Google и собственная разработка Docker — Swarm Mode.
Заключение
Если я не убедил вас в огромных преимуществах использования CaaS и простоты Docker, я бы настоятельно рекомендовал пересмотреть и перенести одно из ваших существующих приложений в Docker-контейнер!
Контейнер Docker — это крошечная виртуальная машина, где вы можете делать все, что вам нравится, от разработки, установки, тестирования до хостинга производственных приложений.
Однородность Docker похожа на магию для производственных сред. Это облегчит развертывание приложений и управление серверами. Потому что теперь вы точно знаете: что работает локально — будет работать и в облаке. Это то, что я называю спокойствием. Больше никто не услышит печально известного приговора, который мы все слышали слишком много раз.
Ну, это работает на моей машине…
Источник: A crash course on Docker — Learn to swim with the big fish