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

    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

    Заключение


    Итак, мы подняли собственный открытый регистр для хранения докер-образов и рассмотрели пример отправки-получения образа с его помощью.
    Надеюсь, что это будет кому-то полезно, потому что мне подобного руководства очень не хватало.
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 8

      0
      В официальной документации информации и то больше. Лучше уберите в черновики, не позорьтесь.
        +2
        Быстрый запуск и использование своего открытого docker-registry
        +2
        Статья полезная, но я советовал бы упомянуть про включение файрвола на сервере с докер регистром.
          0
          При использовании -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 в сторке запуска докера.
          +4
          Все же "реестр", а не "регистр".
            0
            Всецело поддерживаю. Регистры в процессоре, а контейнеры — в реестре.
            0
            Намного удобнее использовать имя вместо адреса. ip-адрес сервера — плохой совет. Я все docker контейнеры, которые должны быть в одном экземлряре (как docker registry) привязываю к ip-alias — так что могу их мигрировать вместе с адресом когда нужно, но все равно использую имена везде где можно.
              0
              Расскажите, пожалуйста, как удалить образ из registry вместе со всеми слоями. Мне кажется, это типичный use case и должен быть обязательно в разделе «Использование».

              Only users with full accounts can post comments. Log in, please.