Краткое руководство по началу работы, которое вы ищете.


Если вы следовали тенденциям развития программного обеспечения в прошлом году, то, должно быть, устали слышать термин Docker. Вероятнее всего, вы ошеломлены огромным количеством разработчиков, говорящих о контейнерах, изолированных виртуальных машинах, супервизорах и другой магии Вуду, связанной с DevOps. Сегодня мы во всем разберемся. Пора наконец понять, что такое контейнеры как услуга и зачем они нужны.


TL;DR


  1. «Зачем мне это нужно?»
    • Обзор всех ключевых терминов.
    • Почему нам нужны CaaS и Docker.
  2. Быстрый старт.
    • Установка Docker.
    • Создание контейнера.
  3. Реальный сценарий.
    • Создание контейнера 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://
          L-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 <container_id> можно отредактировать код на главной машине и посмотреть изменения в контейнере. Теперь вы можете сохранять данные для различных вариантов использования – от хранения изображений до хранения файлов базы данных – и, конечно, для разработки, где нужны возможности живой перезагрузки.


Примечание. Можно запускать команды create и start одновременно с командой run.


$ docker run -it -d ubuntu:16.04 bash

Примечание. Единственным дополнением является флаг -d, который указывает контейнеру работать отдельно, в фоновом режиме.


Почему я так много говорю о томах?


Мы можем создать простой веб-сервер nginx для размещения статического веб-сайта за пару простых шагов.


Создайте новый каталог, назовите его как хотите, я назову свой myapp для удобства. Все, что вам нужно, – создать простой файл index.html в каталоге myapp и вставить его.


<!-- index.html -->
<html>
 <head>
   <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" integrity="sha256-MfvZlkHCEqatNoGiOXveE8FIwMzZg4W85qfrfIFBfYc= sha512-dTfge/zgoMYpP7QbHy4gWMEGsbsdZeCXz7irItjcC3sPUFtf0kuFbDz/ixG7ArTxmDjLXDmezHubeNikyKGVyQ==" crossorigin="anonymous">
   <title>Docker Quick Start</title>
 </head>
 <body>
   <div class="container">
     <h1>Hello Docker</h1>
     <p>This means the nginx server is working.</p>
   </div>
 </body>
</html>

У нас есть общая веб-страница с текстом заголовка. Осталось запустить контейнер 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 <container_id>

Как сделать жизнь еще проще?


Есть поговорка: если нужно что-то сделать дважды, автоматизируй. К счастью, 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 <image_id>

Постарайтесь не оставлять остатки контейнеров и удалять их, если они вам больше не нужны.


Более широкая перспектива?


Убедившись, что 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

Комментарии (14)


  1. tumbler
    01.03.2018 10:56

    А что, в докере есть команда docker присоединить ?


  1. Mantikor_WRX_STi
    01.03.2018 11:55
    +1

    Берем изображение Ubuntu. Вы серьезно? image это образ в данном случае


    1. olemskoi Автор
      01.03.2018 13:29

      Спасибо.


  1. sevikl
    01.03.2018 12:11
    +1

    Четыре первые команды, которые нужно поставить в работу:

    создать – создается контейнер из образа;
    ps – выводится список запущенных контейнеров, опционально флаг -a для списка всех контейнеров;
    запуск – запуск созданного контейнера;
    присоединить – присоединяет стандартный вход и выход терминала к работающему контейнеру, буквально подключая вас к контейнеру, как к любой виртуальной машине.


    с этих команд я и начал изучение докера. потом забросил, потому что это не работает => докер сырой


    1. bazoon
      01.03.2018 13:29

      Если вы не умеете его готовить, не значит, что он сырой. Конфигурить контейнеры при помощи докер команд — это конечно сомнительное удовольствие, поэтому специально для этого существует утилита docker-compose, крайне рекомендую ознакомится. Докер уже давно стал любимым инструментом, не мыслю себе ни единого проекта без использования докера.


      1. sevikl
        01.03.2018 14:50
        -1

        а когда они в следующей версии опять сломают обратную совместимость — просто еще раз научитесь его готовить, это норма. главное — не переставать убеждать себя, что это феерия и серебряная пуля.
        а вообще, видимо, для каждого хаброюзера надо прикручивать тэг сарказм, так как у вас не сработает команда 'sudo docker присоединить|запуск'.
        зы. цитата из первого сообщения — копипаста из статьи. потом ОП исправил ситуацию, правда несильно. это ж надо текст перечитывать 3 раза перед постингом, не царское дело, лучше юзеры носом в лужу ткнут, тогда и править можно.


        1. ALexhha
          01.03.2018 19:48

          а когда они в следующей версии опять сломают обратную совместимость — просто еще раз научитесь его готовить, это норма
          можно увидеть примеры таких несовместимостей, которые все ломали? Около 3х лет используем в проде, особых проблем не было, но видать мы что то делаем не так


  1. pilot114
    01.03.2018 13:09

    > Краткое руководство по началу работы, которое вы ищете
    Спасибо, но нет. Есть намного лучше руководства, в том числе на Хабре. Перевод терминов плохой и местами неуместный, стиль повествования даже в оригинале не даёт четкого понимания, что происходит.


    1. Voiddancer
      01.03.2018 19:52

      А ссылку можно?


  1. Cka3o4nik
    01.03.2018 13:29

    Hyper-V не включил BIOS вашего компьютера что, простите?


    1. olemskoi Автор
      01.03.2018 13:30

      Спасибо.


  1. FeRvent
    01.03.2018 15:55

    Спасибо! Да, docker-compose рулит


  1. dmitry_ch
    01.03.2018 23:33

    Наверное, первую и вторую часть этого трольского обзора стоит здесь оставить, просто чтобы тема кроссплатформенности, стабильного и отсутствия проблем нашла и другое трактование:



  1. PositiveAlex
    02.03.2018 10:08

    Предлагаю вначале воспользоваться гуглом. Уже давно написана куча статей на эту тему. Эта статья была явно лишней. Также хорошей практикой является чтение оригинальной документации, она бы закрыла 90% вопросов, освещенных в статье.