Pull to refresh

Внедрение Docker для небольшого проекта в Production, часть 2

Reading time6 min
Views17K
image

Часть 1

В первой части мы подготовили нашу операционную систему для использования Docker контейнеров.

После того как мы выполнили перезагрузку, мы увидим приглашения к авторизации, но с консоли сервера сделать это будет не возможно, по той причине что авторизация в системе возможна лишь по ключу. А по умолчанию пользователь core не имеет пароля. Конечно его можно установить используя команду:

sudo passwd core

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

Можно использовать как терминальный клиент если вы пользователь Linux, MacOS или же Putty если вы работаете с Windows. Как настроить подключение к нашему серверу я описывать не буду, это тривиальная задача. Необходимо лишь учесть что в процессе установки мы поменяли порт со стандартного на 2222. Следовательно не забываем указать это в параметрах подключения.

У некоторых хостинг провайдеров, в случае услуги виртуального частного облака необходимо настроить пограничный маршрутизатор создав правило dst-nat следующего содержания:

Source IP: Your Public IP Address
Source Port: 2222
Destination IP: Your Private IP Address
Destination Port: 2222

Нужно объяснить нашему маршрутизатору по какому порту к какому серверу выполнять подключение. В случае обычной виртуальной машины с публичным адресом на eth0 таких заморочек конечно делать не придется. Для большей секретности можно настроить наши IPTABLES, причем это можно сделать на этапе конфигурации или же использовать кастомный файлик лежащий по адресу:

/usr/share/oem/cloud-config.yml

Сделать это довольно просто, я покажу на примере поднятия в качестве службы контейнера с sshguard (демон который читает журнал авторизации и добавляет не желательных пользователей в список блокировки IPTABLES).

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

/cloud/containers - корневая папка, где будут храниться наши контейнеры, файлы необходимые для сборки
/cloud/etc/ - корневая папка наших конфигов, для каждого контейнера, так проще потом бекапить и ничего не забыть
/cloud/data/ - тут храним данные наших контейнеров, скрипты сайтов, приложений и тд...
/cloud/run/ - сюда я буду помещать unix сокеты различных сервисов для разделяемого доступа, например для php-fpm или сокеты uwsgi приложений

Итак приступим, предположим мы подготовили структуру наших каталогов, разумеется кому как удобно, после чего мы выполним команду:

vi Dockerfile

Почему я использую редактор vi? Напоминаю система минималистичная, поэтому в CoreOS нет других редакторов, например vim nano mcedit и прочих (как решить эту проблему я расскажу несколько позже, не будем забегать вперед).

После запуска редактора переводим его в режим вставки нажатием клавиши «i» на клавиатуре, и размещаем следующий текст:

FROM alpine:3.2

RUN apk add --update \
    iptables \
    ip6tables \
    sshguard \
 && rm -fr /var/cache/apk/*

ENTRYPOINT ["/usr/sbin/sshguard"]

Первая строка FROM указывает, какой базовый образ для сборки нашего контейнера использовать, как я и говорил будем использовать Alpine Linux версии 3.2.

Строкой начинающийся с RUN мы говорим, выполни следующие команды, в нашем примере установим дополнительные пакеты и сам sshguard. После чего укажем точку входа в наш контейнер /usr/sbin/sshguard.

На этом все, теперь нам нужно сохранить файл конфигурации контейнера. Для этого на клавиатуре покинем режим вставки нажатием клавиши «ESC», затем переведем vi в коммандный режим нажатием «Shift + :» и напишем «wq» и нажмем «Enter». Все на этом мы закончили с файлом конфигурации. Теперь приступим к сборке нашего контейнера. Для этого в консоли выполним следующее:

docker build -t local/sshguard .

Рассмотрим эту команду подробнее, мы через команду build указываем Docker, что необходимо выполнить сборку контейнера в репозитарий local с именем sshguard, в место local можно использовать например свой репозитарий на hub.docker.com, но после чего нужно не забыть сделать docker push repo/container. Ключик -t ждет следующим параметром как тегировать (назвать) наш образ, в данном случае мы сосздаем локальный образ local/sshguard. Вместо точки нужно указать путь до нашего Dockerfile, но если мы находимся в том же каталоге что и сам файл, то точки будет достаточно.

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

docker images

Удалить образ указав один или несколько имен или id через пробел:

docker images rmi image_id или image_name

Отлично, мы собрали образ с нашим сервисом, теперь не плохо было бы начать его использовать. Мы будем использовать наш образ как сервис, запуская его через systemd.

Для этого приступим к редактированию файла /usr/share/oem/cloud-config.yml, и добавим туда следующее содержимое. Используем наш полюбившийся vi, по аналогии выше.

#cloud-config

coreos:
  units:
    - name: sshguard.service
      command: start
      content: |
        [Unit]
        Description=sshguard
        After=docker.service
        Requires=docker.service
        [Service]
        TimeoutStartSec=0

        ExecStartPre=-/usr/bin/docker kill sshguard
        ExecStartPre=-/usr/bin/docker rm sshguard
        ExecStartPre=/usr/bin/docker pull local/sshguard

        # setup sshguard tables
        ExecStartPre=-/usr/sbin/iptables -N sshguard
        ExecStartPre=-/usr/sbin/ip6tables -N sshguard

        # block abuser traffic
        ExecStartPre=-/usr/sbin/iptables -D INPUT -j sshguard
        ExecStartPre=-/usr/sbin/ip6tables -D INPUT -j sshguard
        ExecStartPre=-/usr/sbin/iptables -A INPUT -j sshguard
        ExecStartPre=-/usr/sbin/ip6tables -A INPUT -j sshguard

        ExecStart=/bin/sh -c 'journalctl --no-pager -q -f -t sshd | sed -u "s/\\[[0-9]*\\]//" | docker run -i --name sshguard --rm --net=host --privileged local/sshguard'

        ExecStop=-/usr/bin/docker stop sshguard
        ExecStop=-/usr/bin/docker rm sshguard

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

sudo coreos-cloudinit --from-file /usr/share/oem/cloud-config.yml

Используя конфигурационный файл выше, можно создать необходимые правила в нужных цепочках IPTABLES по аналогии, подставляя свои параметры. Это не сложно и описывать я это не буду.

Результатом наших действий стал готовый сервер, умеющий блокировать нарушителей консольного порядка на определенный интервал времени. О дополнительных параметрах sshguard можно почитать в официальной документации и настроить его на свой вкус. Мы же использовали настройки по умолчанию. Более детально я лишь рассмотрю саму команду запуска:

ExecStart=/bin/sh -c 'journalctl --no-pager -q -f -t sshd | sed -u "s/\\[[0-9]*\\]//" | docker run -i --name sshguard --rm --net=host --privileged local/sshguard'

так как все логи у нас через journalctl попадают на сервер логирования, нам их нужно извлечь, при этом отфильтровать и передать на вход sshguard стартующим в контейнере. Параметр --net=host говорит о том, что все действия нам нужно выполнять на нашей машине, где запущен демон Docker, при этом мы запускаем контейнер в привилегированном режиме указывая ключ --privileged.

Теперь не плохо было бы начать работать с нашими контейнерами, но сперва я бы хотел рассказать об одном сервисе.

Это отличный облачный дашборд для управления вашими контейнерами. Но для начала его нужно установить, в случае CoreOS сделать это крайне просто, для этого выполним:

sudo curl -s http://getnucleus.io/install/coreos_installer.sh | bash -s --

Подробнее об установке можно почитать тут.

Затем выполняем авторизацию и можем управлять нашими контейнерами, без подключения по ssh к консоли сервера. Для этого в правом верхнем углу нажмем на иконку ракеты, и выполним нашу команду по аналогии как мы бы это делали в консоли. Например запустим контейнер с Nginx, для этого введем:

docker run -p 80:80 -p 443:443 --name=nginx nginx

После выполнения команды у нас в списке появиться контейнер с именем nginx и опубликованными портами 80 и 443. О том как пробросить конфигурацию сервера, файлы и скрипты можно почитать в других статьях, либо в официальной документации. При нажатии на сендвич, в колонке Control Deck можно не только управлять нашим контейнером но и посмотреть потребляемые им ресурсы, память, цпу, сети и прочее.

В следующей статье я расскажу о том, как организовать инфраструктуру для блога на WP с использованием Varnish, Memcached, PHP7.1-FPM, Nginx, Mariadb, а так же как и какие расширения для php 7.1 включить и как все это настроить. Спасибо за внимание.
Tags:
Hubs:
Total votes 15: ↑15 and ↓0+15
Comments9

Articles