Системи управління та автоматика
Розгортання контейнерів для докерів з системою для автоматизації старту
Table of Contents
Чому комбінувати системи з докером для виробництва
Сучасна інфраструктура вимагає, що контейнерні послуги виживають несподівані перезавантаження, апаратні збої або оновлення пакету. Хоча Docker надає політики рештарту (), ці політики працюють тільки до тих пір, поки Docker daemon працює. Систематизовані – система інit, що використовується Ubuntu, Debian, Fedora, CentOS і найсучасніші Linux дистрибуції – приймає це далі, керуючи життєвим циклом самого Docker daemon і може почати контейнери навіть до виходу з розетки Docker стає доступні. Переваги використання системних додатків включають:
- Гарантія замовлення запуску через директиви залежностей (наприклад, після мережі.target, після docker.service)
- Уніфікований журнал , що робить розвантаження прямоперед
- Визначено контроль за ресурсними лімітами (CPU, пам'ять, I/O) за допомогою системних директив
- Автоматичний перезавантаження на відмову від настроченої затримки і обмеження лопу
- Підтримка активації розетки та запуску часу
За допомогою обгортання кожного контейнера Docker у системному файлі, команди операцій отримують послідовний інтерфейс для запуску, зупинки та моніторингу контейнерів, зменшення надійності на сценарії та ручне втручання.
Створення системи для одного контейнера для докерівника
Стандартний підхід передбачає написання файлу сервісного блоку, який викликає командування Docker для запуску та зупинки контейнера. Нижче ми проходимо через крок процесу, починаючи з основного прикладу, а потім охоплює загальні вимоги до виробництва.
Крок 1: Напишіть файл блоку служби
Створіть файл . Використовуйте наступний шаблон як початкова точка:
[Unit]
Description=My Application Container
After=network-online.target docker.service
Wants=network-online.target
Requires=docker.service
[Service]
Restart=always
RestartSec=10
StartLimitBurst=3
ExecStartPre=-/usr/bin/docker kill myapp
ExecStartPre=-/usr/bin/docker rm myapp
ExecStart=/usr/bin/docker run --rm --name myapp \
-e DB_HOST=10.0.1.50 \
-e DB_PORT=5432 \
-v /data/myapp:/app/data \
-p 8080:8080 \
myregistry/myapp:latest
ExecStop=/usr/bin/docker stop -t 10 myapp
ExecStopPost=-/usr/bin/docker rm myapp
[Install]
WantedBy=multi-user.target
Вихід ключових напрямів:
- – забезпечує Докер дамон, який працює перед початком контейнера.
- – якщо Ви припинили роботу, то цей сервіс також зупиняється.
- – очищає будь-яку ємність з попереднього ходу (] префіксує збої тут нетканий.
- – використовує для автоматичного видалення контейнера при його зупинки.
- – граціозно зупиняє контейнер з таймером (10 секунд).
- – перезавантажує контейнер незалежно від коду виходу.
- – дочекає 10 секунд до перезавантаження.
- – обмеження перезапусків до 3 спроб за інтервал (default 10 секунд) для уникнення перезапуску петель.
Крок 2: Увімкнути та запустити службу
sudo systemctl daemon-reload
sudo systemctl enable myapp.service
sudo systemctl start myapp.service
розповідає про систему для відновлення файлів служби. створює симлінк, щоб служба завантажила.
Управління сервісом з стандартними командами
Після того, як працює сервіс, ви керуєте ним, як і будь-який інший сервіс системи:
- Start:
- Стоп: [[FLT::18]]]
- ]
- => [[FLT: 20]]
- Logs: ] (Фольво живих колод)
Розширені шаблони конфігурації
Виготовлення розгортань часто вимагають більш ніж простого . Нижче загальні розширення можна додати до ваших системних файлів сервісу.
Паси навколишнього середовища мінливі
Не рекомендується зберігати секрети або налаштування в файлі сервісу. Замість цього використовуйте окремий файл середовища:
[Service]
EnvironmentFile=-/etc/myapp/env.conf
ExecStart=/usr/bin/docker run --rm --name myapp \
--env-file /etc/myapp/env.conf \
myregistry/myapp:latest
префікс перед тим, як засіб, що надає послугу, навіть якщо файл не існує (зловживання під час початкової настройки).
Мережеві та портові бінінги
Для контейнерів, які необхідно спілкуватися один з одним на одному з одного і того ж господаря, врахуйте за допомогою або користувацького містового мереж. Приклад:
ExecStart=/usr/bin/docker run --rm --name web \
--network=my-net \
-p 443:443 \
-v /etc/ssl/certs:/etc/ssl/certs:ro \
myregistry/web:latest
Якщо використовувати користувальницьку мережу, забезпечте мережу, яка існує до початку роботи сервісу. Ви можете додати команду для створення:
ExecStartPre=/usr/bin/docker network create my-net
Міжмістобудівні залежності
Якщо один контейнер вимагає ще готової до початку (наприклад, веб-додаток очікує бази даних), систематизований може виконувати замовлення. Створіть другий файл сервісу для бази даних, а потім:
[Unit]
Description=Web App Container
After=network-online.target docker.service mydb.service
BindsTo=mydb.service
зв’язує життєвий цикл веб-додатків до контейнера бази даних – якщо зупинка бази даних, веб-додаток також припиняється.
Охорона здоров'я перевіряє і Готовність
Докерські перевірки здоров'я можуть бути інтегровані з системою, щоб запобігти передчасному доступі сервісу. Використовуйте з скриптом, який обробляє кінцеву точку здоров'я:
ExecStartPost=/usr/local/bin/wait-for-health.sh http://localhost:8080/health 30
Скрипт повинен вийти 0 тільки при здоров'ї контейнера. Якщо він не зникає, систематизований позначки агрегату не вдалося.
Збереження ресурсів через Systemd
Ви можете обмежити процесор контейнера і пам'ять на рівні cgroup без власних ресурсів Docker. Це особливо корисно при запуску декількох контейнерів на одному хості:
[Service]
MemoryMax=512M
CPUQuota=50%
Ці налаштування створюють жорсткий ліміт, який застосував себе самостійно з Docker.
Управління декількома контейнерами: систематизована проти. Docker Compose
Для невеликої кількості контейнерів (наприклад, 2-5) окремі системні файли сервісу прості і підтримуються. Однак, коли проект передбачає багато взаємопов'язаних послуг, Docker Compose стає більш зручним. Ви все ще можете використовувати систему для скріплення всього Docker Compose, створюючи єдиний сервісний блок, який викликає . Приклад:
[Unit]
Description=My Application Stack
After=network-online.target docker.service
Requires=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/myapp
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
[Install]
WantedBy=multi-user.target
Цей підхід дає вам простоту складання послуг, що об’єднані з управління життєвим циклом системного життя. Зверніть увагу, що використовується, тому що виходи негайно. зберігає блок в "активному" стані до моменту, поки називається.
Який метод вибрати?
- Individual systemd services – кращий для додатків для спадщини, послуг з суворим замовленням запуску, або коли вам потрібна в межах ресурсу.
- Докер Комсом з системою] – ідеальний для мікросервісів стеки, де залежності ручуються внутрішньо Композією, і ви хочете, щоб єдиний блок управління цілою групою.
Виправлення проблем з загальними питаннями
Навіть при ретельному налаштуванні, ви можете зіткнутися з проблемами. Нижче часто зустрічаються підводні камені та їх рішення.
Сервісні попелиці з «Нез'єднанням докера дамоном»
Це зазвичай означає, що служба починається до того, як докер розетки готовий. Забезпечити ваш блок містить і . Також перевірте, що Докер дамон включений: .
Контейнерні рештки в петлі
Якщо контейнер виходи відразу, систематизувати буде перезавантаження його за допомогою і . Перевірте контейнерні колоди з . Збільшення (наприклад, 30 секунд) і встановити для запобігання зайнятої петлі.
Сервіс не Зупиняє чисто
Невірно налаштований може залишити контейнерний біг. Перевірити, що використовує правильну назву контейнера. Використовуйте , щоб примусово видалити контейнер, якщо зупинка не збочена.
Вимірювані умови Не навантажені
Якщо ви використовуєте , підтвердіть файл, який існує і чи можна читати в корені. Уникайте проблем з котируваннями – систематизовані лапки з змінних значень. Для секретної ін'єкції розглянемо за допомогою системних облікових даних або виділеного секретного менеджера.
Зниження безпеки
Запуск контейнерів Docker через системний піднімає кілька точок безпеки:
- Завжди запустіть систему, як не роот користувач, якщо це можливо (користувайтеся і ] прямі, але переконайтеся, що користувач має доступ до розетки Docker або запустити в режимі безкореневого режиму).
- Уникайте використання в системах, якщо це необхідно.
- Використовуйте чит-тільки двосторонні кріплення (]) коли контейнер не потрібно писати в господар.
- і для загартування блоку проти втечу.
[Service]
ProtectSystem=strict
ReadWritePaths=/var/log/myapp
PrivateTmp=true
User=myappuser
Зовнішні ресурси
Для подальшого читання зверніться до цих офіційних посилань:
Висновок
Інтеграція системних контейнерів Docker дає вам надійний, автоматизований механізм запуску, який інтегрується безшовно з іншим вашим Linux-системою. Написуючись добреструктуровані файли пристроїв служби, ви можете контролювати порядок запуску, керувати залежностей, встановлювати ліміти ресурсів, і контролювати журнали за допомогою інструментів, команди операцій вже знає. Незалежно від того, чи ви обираєте індивідуальні послуги для кожного контейнера або одного блоку, щоб засвідчити Композний стек, систематизований забезпечує надійність і передбачуваність, що попит виробничих середовищ.
Почати з простий файл блоку, перевірити його ретельно, потім шар на розширених варіантах, як середовища файлів, перевірки здоров'я та збереження безпеки. За допомогою цього підходу ваші контейнери Docker будуть вижити перезавантаження, аварійні ситуації та налаштування змін без ручного втручання, звільняючи команду, щоб зосередитися на будівельних додатках.