Docker
Oct 30, 2016 · 3 minute read · CommentsЧто-то давно не писал в блог, пора исправляться. Про докер слышал давно и много, а тут как раз был релиз на Windows. Надо пробовать.
Немного теории: докер это - система управления приложений в среде виртуализации на уровне операционной системы. Зачем это нужно? Свои приложения можно запускать в любом месте и везде будет одинаковое окружение. А поскольку это не полноценная виртуализация, то работает все намного быстрее. Более подробно можно прочитать в этом замечательном руководстве, есть и перевод на хабре.
Теперь приступим к практике. Для образовательных целей сделаю очень простой докер контейнер с моим блогом. Контейнеры строятся на основе образов, а образы, в свою очередь, можно скачивать из официального репозитория или сделать самим из докерфайлов.
Использовать готовый образ не интересно, поэтому создам собственный.
FROM alpine:latest
ENV HUGO_VERSION 0.16
ENV HUGO_BINARY hugo_${HUGO_VERSION}_linux-64bit
RUN apk add --no-cache git
# Download and Install hugo
ADD https://github.com/spf13/hugo/releases/download/v${HUGO_VERSION}/${HUGO_BINARY}.tgz /usr/local/
RUN tar xzf /usr/local/${HUGO_BINARY}.tgz -C /usr/local/bin/ && rm /usr/local/${HUGO_BINARY}.tgz
RUN git clone https://github.com/bege13mot/bege13mot.blog.git
EXPOSE 1313
CMD cd /bege13mot.blog/ && hugo server -wD -p 1313 --bind=0.0.0.0
В принципе все понятно, но несколько уточнений по командам:
- FROM - определяет, на чем будет основан новый образ, в моём случае это очень урезанный и потому легкий Alpine Linux.
- ENV, RUN - определяют переменные окружения и запускают выполнение соответственно.
- Манипуляции с tar нужны из-за того, что статического генератора hugo в Alpine необходимо ставить руками, а не через apk.
- EXPOSE - пробрасывает порт из будущего контейнера на хост машину.
- CMD - описывается последовательность команд, что будут выполняться при запуске контейнера.
- Отдельно проясню строку –bind=0.0.0.0. Дело в том, что по умолчанию hugo server использует адрес “127.0.0.1”, а у докер контейнера адрес по умолчанию “0.0.0.0”.
Докерфайл готов, и теперь построим образ на его основе:
docker build -t test -f D:\Docker\dockerTest .
- -t - имя образа.
- -f - имя докерфайла.
Можно запускать и без ключа -f, но мой докер на Windows отказывался без него работать.
Образ построен, можно запустить контейнер:
docker run -p 1313:1313 test
- -p - пробрасывает указанный порт с контейенра на хост машину.
В результате, по адресу localhost:1313 можно читать блог.
Продолжим эксперимент дальше. Можно зайти внутрь контейнера и, например, написать новый пост.
docker run -p 1313:1313 -it test /bin/sh
- -it /bin/sh - перенаправляет введенные команды в контейнер.
Новый пост написать можно, но если остановить контейнер, то изменения в файловой системе не сохранятся. Это можно обойти, если использовать общую директорию между хостом и контейнером.
Для докера на Windows эту возможность нужно включить дополнительно, об этом хорошо написано в этом руководстве.
А после выполняем:
docker run -p 1313:1313 -v D:/Docker/content:/bege13mot.blog/content/post -it test /bin/sh
- -v D:/Docker/content:/bege13mot.blog/content/post - монтируем папку D:/Docker/content из хост системы в контейнер, по адресу /bege13mot.blog/content/post.
А можно заранее создать файлы и скопировать их в контейнер при помощи команды cp.
docker cp <containerId>:/file/path/within/container /host/path/target
На этом я эксперименты завершил. Надеюсь, пригодится в будущем.