Docker – это программное обеспечение для автоматизации развёртывания и управления приложениями в среде виртуализации (см. Википедию).
Подробные инструкции по установке есть на официальном сайте: https://docs.docker.com/engine/installation/

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

Когда я начал делать новый проект — решил попробовать использовать докер. Получилось четыре контейнера, которые надо как-то доставлять на сервер. Далее последует рассказ о том, что у меня из этого получилось.

Что имеется на входе:

  • виртуальный сервер с IP-адресом (без домена) на Ubuntu 14.04 64bit с docker@1.10.3 — здесь мы будем поднимать регистр и здесь же забирать из него образы
  • рабочий компьютер на OS X 10.11.3 с docker@1.9.1 и docker-machine@0.5.5

Регистр докера — это хранилище с версионированными докер-образами.
Регистр удобно использовать для доставки приложения на сервер:

  1. на рабочем компьютере собираем образ и отправляем в регистр
  2. на виртуальном сервере забираем образ из регистра и запускаем

У докера есть официальный регистр, как сервис: https://hub.docker.com
Там можно размещать неограниченное количество публичных образов и только один приватный. Большее количество приватных образов можно добавлять за отдельную плату.

Другой вариант использования регистра — поднятие собственного.
Докер предоставляет официальный образ с сервером регистра, кроме того есть документация с инструкциями по запуску.

Регистр докера способен работать как по http, так и по https. При использовании защищённого соединения возможна так же авторизация отдельных пользователей. Но нужен сертификат, который можно купить только для доменного имени. Самоподписанный сертификат у меня так и не получилось заставить работать (читал в интернетах, что с этим есть проблемы). Ввиду того, что у меня нет доменного имени — мы рассмотрим открытый регистр с доступом по http. Это значит, что если кто-то узнает адрес вашего регистра — он сможет свободно им пользоваться.

Запуск регистра


Настройка на сервере

Регистр представляет из себя докер-контейнер, который запускается одной командой:

› docker run -d -p 5000:5000 --restart=always --name registry registry:2

Готово, но для того, чтобы клиент докера на этом сервере мог обращаться к регистру по открытом соединению без авторизации — нужно добавить строчку в конфигурационный файл /etc/default/docker:

DOCKER_OPTS="$DOCKER_OPTS --insecure-registry <ip-адрес сервера>:5000"

После чего нужно перезапустить докер:

› service docker restart

Настройки на клиенте

У меня на компьютере для работы докера используется система виртуализации VirtualBox, в которой запускается boot2docker (минимальный образ Linux с докером), который в свою очередь работает с контейнерами. Виртуальных машин, работающих под VirtualBox на компьютере может быть несколько, для управления ими используется docker-machine.

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

Посмотрим список виртуальных машин:

› docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER   ERRORS
default   *        virtualbox   Running   tcp://192.168.99.100:2376           v1.9.1

Подключимся к нашей виртуальной машине:

› docker-machine ssh default

В ней есть файл /var/lib/boot2docker/profile, в котором присутствует такой фрагмент:

EXTRA_ARGS='
--label provider=virtualbox
'

Открываем его на редактирование с sudo, чтобы получилось так:

EXTRA_ARGS='
--label provider=virtualbox --insecure-registry <ip-адрес сервера>:5000
'

Использование регистра


Формирование и отправка образа с рабочего компьютера

Представим, что у вас в текущей директории уже есть Dockerfile и мы можем просто собрать новый образ с именем my-image:

› docker build -t my-image .

Теперь можно добавить образу тег и отправить его в регистр:

› docker tag my-image <ip-адрес сервера>:5000/my-image:latest
› docker push <ip-адрес сервера>:5000/my-image:latest

Получение образа на сервере

Сейчас образ в регистре, мы можем получить его на сервере и запустить:

› docker pull <ip-адрес сервера>:5000/my-image:latest
› docker run -d <ip-адрес сервера>:5000/my-image

Заключение


Итак, мы подняли собственный открытый регистр для хранения докер-образов и рассмотрели пример отправки-получения образа с его помощью.
Надеюсь, что это будет кому-то полезно, потому что мне подобного руководства очень не хватало.

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


  1. grossws
    20.03.2016 01:23

    В официальной документации информации и то больше. Лучше уберите в черновики, не позорьтесь.


    1. Mingun
      20.03.2016 09:51
      +2

      Быстрый запуск и использование своего открытого docker-registry


  1. baltazorbest
    20.03.2016 09:47
    +2

    Статья полезная, но я советовал бы упомянуть про включение файрвола на сервере с докер регистром.


    1. grossws
      20.03.2016 22:15

      При использовании -p 5000:5000 и --iptables=true у докера (по умолчанию) — довольно бесполезное занятие, т. к. докер при пробросе портов прописывает DNAT правило в таблице nat, которая срабатывает раньше чем filter. В итоге пакет после DNAT'а вполне себе local и с внутреннего адреса.

      Можно, конечно, заморачиваться и маркировать, но это отдельная песня. Проще запускать docker daemon --iptables=off.

      Как workaround использовать -p 127.0.0.1:5000:5000 или --ip=127.0.0.1 в сторке запуска докера.


  1. farcaller
    20.03.2016 11:50
    +4

    Все же "реестр", а не "регистр".


    1. icoz
      20.03.2016 14:22

      Всецело поддерживаю. Регистры в процессоре, а контейнеры — в реестре.


  1. ISanych
    21.03.2016 15:30

    Намного удобнее использовать имя вместо адреса. ip-адрес сервера — плохой совет. Я все docker контейнеры, которые должны быть в одном экземлряре (как docker registry) привязываю к ip-alias — так что могу их мигрировать вместе с адресом когда нужно, но все равно использую имена везде где можно.


  1. bemyak
    21.03.2016 15:52

    Расскажите, пожалуйста, как удалить образ из registry вместе со всеми слоями. Мне кажется, это типичный use case и должен быть обязательно в разделе «Использование».