Затрагивая тему использования Docker невозможно не коснуться использования Docker Hub и Dockerfiles. В этой заметке я расскажу как их можно использовать для автоматизации.
Ознакомительная статья тут: Знакомство с Docker в RedHat 7
Docker Hub
Если вы использовали Docker, то скорее всего использовали не зная того и Docker Hub. Он используется для хранения образов. Если вы запускаете контейнер из образа, который ранее не использовали, то образ будет взят из хаба.
Если вы ходите сделать контейнеры доступными для других пользователей, то вы можете создать бесплатную учетную запись на Docker Hub. Функционал позволяет создавать приватные репозитории, в которых доступ к образам можно ограничить.
Как только учетная запись создана, вы можете начать с ней работу:
[mysystem ~]$ docker login |
Как сказано выше, если вы запускаете контейнер из образа, которого у вас еще нет, то Docker подтянет его автоматически. Другой вариант: ручной pull/push с использованием команд:
Search
# Поиск образов 'lighthttpd' # [mysystem ~]$ docker search lighthttpd NAME DESCRIPTION STARS OFFICIAL AUTOMATED mharris/lighthttpd 0 [OK] |
Pull
# подтягиваем образ себе # [mysystem ~]$ docker pull mharris/lighthttpd Pulling repository mharris/lighthttpd 560683ace810: Pulling dependent layers 514896ea3cda: Download complete Status: Downloaded newer image for mharris/lighthttpd:latest |
Push
# отправляем локальный образ в репозиторий # [mysystem ~]$ docker push dk/madeup_image:1.0 Pushing repository dk/madeup_image:1.0 |
List Locally Stored Images
# просмотр образов # [mysystem ~]$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE mharris/lighthttpd latest 560683ace810 11 hours ago 47.5 MB |
С командами пока всё.
Dockerfiles
Создание новых образов достаточно простое. Это можно сделать с помощью всего нескольких команд:
# Запускаем новый контейнер 'apache' # он использует образ 'centos' из DockerHub # в этом контейнере запускаем bash # [mysystem ~]$ docker run -it --name apache centos:centos6 bash # Ставим Apache httpd # [a127d23435 ~]$ yum install -y httpd; # Выходим из контейнера # [a127d23435 ~]$ exit # Коммитим изменения в контейнере в новый образ с названием # 'dk/apache:1.0' # |
[mysystem ~]$ docker commit apache dk/apache:1.0 |
Таким образом мы подтягиваем себе самый последний образ CentOS из Docher Hub (если он не был скачан ранее). Можно использовать тег ‘:centos6′ для указания нужной версии. Если не указать тег, то будет скачана самая последняя версия — CentOS 7. После установки httpd мы сохраняем контейнер как новый образ. Мне кажется, что удобно использовать способ наименования repo_name/image_name (repo_name совпадает с именем учетной записи).
После это можно использовать контейнер — например, запустить веб сервер.
[mysystem ~]$ docker run -it --name my_version_of_apache dk/apache:1.0 bash |
Что делать, если образ уже опубликован и доступен другим пользователям? Можно создать новую версию и выполнить новый push в репозиторий. Если вам не нравятся ручные шаги, то можно это всё автоматизировать с помощью Docker Files.
Сам по себе Dockerfile напоминает Makefile. Вот пример файла для действий, описанных выше (плюс бонус — размещение контента для веб сервера):
FROM centos:centos6 MAINTAINER DK email: d.k@domain.com WORKDIR /tmp # Ставим Apache Web Server RUN yum install -y httpd; yum clean all # добавляем локальный TAR ADD content.tar /var/www/html/ |
Теперь можно запустить образ одной командой:
[mysystem ~]$ docker build --rm -t dk/apache:1.0 . |
Точка в конце — это указание искать Dockerfile в текущей папке. Сам файл должен называться «Dockerfile».
Возможно даже сейчас что-то получится улучшить? Да. Порт в контейнере можно сделать видимым для системы, в которой он запущен. И еще можно указать команду, которая будет выполнена при запуске контейнера.
Вот что нужно добавить в Dockerfile:
EXPOSE 80 ENTRYPOINT [ "/usr/sbin/httpd" ] CMD [ "-D", "FOREGROUND" ] |
Будет открыт порт 80 и запущен апач.
Если образ был изменен и мы запускаем новый контейнер, то можно найти запущенный веб сервер так:
[mysystem ~]$ docker inspect dk_webserver | grep IPAddress "IPAddress": "172.18.0.22" |
Таким образом веб сервер у нас запущен тут: 172.18.0.22:80
Как настроить NAT и сделать контейнер видимым для удаленных пользователей? Для этого предусмотрены опции -p и -P. «-P» автоматически выбирает порт с номером больше 49150. Можно использовать -p
[mysystem ~]$ docker run -d -p 80:80 --name dk_webserver dk/apache:1.0 |
Этой командой будет прокинут порт 80 контейнера на 80 порт host системы.
Что-то еще?
Релиз образов можно осуществлять через github и bitbucket. При их использовании dockerhub будет извещен об изменениях в исходниках (образах) с помощью мезанизма webhook и запустит сборку. Новый образ будет опубликован и доступен для других членов команды.
Обычно в github надо создавать новый репозиторий и закачивать в него исходники (в нашем случае — Dockerfile). Можно сберечь время перейдя по ссылке: https://github.com/dk/simple_webserver_container/fork
Теперь можно завести локальную копию:
[mysystem ~]$ git clone git@github.com:<your_username_here>/simple_webserver_container.git |
Настройка связи учетных записей GitHub и Docker Hub
Docker Hub должен иметь доступ к учетной записи git hub. Связь задается тут : https://registry.hub.docker.com/account/accounts/
Там можно настроить автоматическую сборку вашего Dockerfile.
Перейдите по ссылке: https://registry.hub.docker.com/builds/add/ для задания новой сборки.
Укажите вашу учетную запись github и ранее созданный репозиторий. Если настройка успешно, вы увидите соответствующее сообщение и ссылку на страницу сборки. Если билд завалится, то можно будет изучить журнал ошибок. Если сборка успешна, то новый образ станет общедоступным в Docker Hub.
Документация: http://docs.docker.com/userguide/dockerrepos/