Впровадження Docker для невеликого проекту Production ч. 2

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. Про те як прокинути конфігурацію сервера, файли і скрипти можна почитати в інших статтях, або в офіційній документації. При натисканні на сендвіч, у колонці Deck Control можна не тільки управляти нашим контейнером але і подивитися споживані ним ресурси, пам'ять, цпу, мережі та інше.

У наступній статті я розповім про те, як організувати інфраструктуру для блогу на WP з використанням Varnish, Memcached, PHP7.1-FPM, Nginx, Mariadb, а так само як і які розширення для php 7.1 включити і як все це налаштувати. Дякую за увагу.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.