İşgücü Deployments için Docker ile birlikte Neden Birleşin

Modern altyapı, konteynerli hizmetlerin beklenmedik yeniden başlatmaları, donanım başarısızlıkları veya paket güncellemelerini talep ediyor.Docker yeniden başlatma politikaları ([[Dönetici:0)) ancak Docker daemon'un kullandığı sistem kullanımından önce bile uzun süre çalışır.

  • Bağımlılık yönergeleri aracılığıyla başlangıç siparişi (örneğin, a.target, After docker.service)
  • Birleşik giriş: 1 ), basit bir şekilde,
  • Kaynak limitleri üzerinde iyi kontrol (CPU, hafıza, I/O) sistemik ünite yönergeleri kullanarak
  • Otomatik olarak yapılandırılabilir gecikme ve patlama limitleri ile başarısızlık üzerine yeniden başlayın
  • soket aktivasyon ve zamanlı başlangıç için destek

Bir sistemli hizmet dosyasında her Docker konteynerini kapatarak, operasyonlar takımları başlangıç, durdurmak ve konteynerleri izlemek için tutarlı bir arayüz kazanır, ad-hoc senaryolarına ve manuel müdahaleye güvenmeyi azaltır.

Tek bir Docker Konteyner için bir Sistemli Hizmet Oluşturun

Standart yaklaşım, Docker komutlarını çalıştırmak ve konteyneri durdurmak için çağıran bir hizmet ünitesi dosyası yazmak içerir. Aşağıda temel bir örnekle başlayan ve sonra ortak üretim gereksinimlerine değiniyoruz.

Adım 1: Hizmet Birimi Dosyasını Yaz

Bir dosya oluşturun.Use the following şablon as a starting point:

[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

[FONT:0) Anahtar yönergelerin planlanması:).

  • [FONT:0] - Docker daemon konteynere başlamadan önce çalışıyor.
  • [FONT:0] – Docker durdurulursa, bu hizmet de durur.
  • [FONT:0] - önceki bir işten gelen herhangi bir sol konteyner temizlenir (ŞUD 7) Önde gelen başarısızlıklar burada dayanılmaz değildir.
  • [FONT:0] - durdurduğunda konteyneri otomatik olarak kaldırmak için [[SEVT: 9] kullanır.
  • [FONT:0] - Bir süre boyunca konteyneri dayanılmaz olarak durdurur (10 saniye).
  • [FONT:0] - çıkış koduna bakılmaksızın konteyneri yeniden başlatır.
  • [FONT:0] – yeniden başlatmadan 10 saniye bekleyin.
  • [FONT:0] - sınırları yeniden başlatmaya 3 girişime yeniden başlar (default 10 saniye) yeniden başlatma döngülerinden kaçınır.

2. Adım: Enable ve Hizmete Başlayın

sudo systemctl daemon-reload
sudo systemctl enable myapp.service
sudo systemctl start myapp.service

[FONT: 15) Sisteme hazır hizmet dosyaları yeniden hazırlayacaklarını söylüyor. [03.03.2010] servisin çizmeye başladığını gösteriyor.

Standart Sistemli Komutlarla Hizmet Yönetin

Servis tükendiğinde, sadece başka bir sistem servisi gibi kontrol edersiniz:

  • [FONT:0)Başlangıç: [DÜDÜŞÜNÜŞÜŞÜŞÜŞÜNÜŞÜŞÜŞÜŞÜNÜŞÜŞÜŞÜŞÜNÜŞÜNÜŞÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜŞÜNÜŞÜŞÜŞÜNÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜNÜŞÜNÜŞÜNÜŞÜŞÜŞÜŞÜŞÜNÜŞÜNÜŞÜNÜŞÜŞÜŞÜNÜŞÜNÜŞÜŞÜNÜŞÜŞÜNÜŞÜNÜŞÜŞÜNÜŞÜŞÜŞÜNÜŞÜNÜŞÜŞÜŞÜŞÜŞÜNÜŞÜŞÜŞÜNÜŞÜŞÜŞÜNÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜNÜŞÜŞÜŞÜŞÜŞÜNÜŞÜŞÜŞÜŞÜŞÜNÜŞÜNÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞ
  • [0]([0) Durun: [Dönem: ﴾0)
  • [FONT:0)Başlangıç: [Dönem: ﴾4﴿
  • [FONT:0)Status:[Dönem:[Dönem: 1]
  • [FONT=0)Logs:[Dönem:[Dönemli)[değiştir | kaynağı değiştir)

Gelişmiş Yapı Desenleri

Üretim dağıtımları genellikle basit bir şekilde gerektirmektedir. Aşağıda sistemli hizmet dosyalarınıza ekleyebileceğiniz ortak geliştirmeler vardır.

Ortam Değişkenlerini Geçmek

Servis dosyasında sert-koding sırları veya yapılandırma tavsiye edilmez. Bunun yerine, ayrı bir ortam dosyası kullanın:

[Service]
EnvironmentFile=-/etc/myapp/env.conf
ExecStart=/usr/bin/docker run --rm --name myapp \
 --env-file /etc/myapp/env.conf \
 myregistry/myapp:latest

[Çalışan önce ekinler, dosyanın mevcut olmamasına rağmen başlamaz.)

Ağlama ve Port Bindings

Aynı ev sahibi üzerinde birbirleriyle iletişim kurma ihtiyacı olan konteynerler için, TANFLT:25’i veya kullanıcı tanımlı köprü ağlarını kullanmayı düşünün. Örnek:

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

Özel bir ağ kullanıyorsanız, ağın hizmet başlamadan önce var olmasını sağlayın. Bunu oluşturmak için birİLFLT:27 ekleyebilirsiniz:

ExecStartPre=/usr/bin/docker network create my-net

Inter-Container Bağımlılığı

Bir konteyner, başlamadan önce hazır olmak için başka bir şey gerektirdiğinde (örneğin, bir veritabanı için bekleyen bir web uygulaması), sistemli sipariş verebilir. Veritabanı için ikinci bir hizmet dosyası oluşturun ve sonra:

[Unit]
Description=Web App Container
After=network-online.target docker.service mydb.service
BindsTo=mydb.service

[[BİLMİNGİLİZCEZ: www.facebook.com. web uygulamasının veri konteynerine taşınmasına bağlar – veritabanı duraksa da, web uygulaması da durdurulur.

Sağlık Checks ve Okuygunluk

Docker sağlık kontrolleri erken servis kullanılabilirliğini önlemek için sistemli bir sistemle entegre edilebilir.Sağlık uç noktası anketleri yapan bir senaryo ile:

ExecStartPost=/usr/local/bin/wait-for-health.sh http://localhost:8080/health 30

Senaryo sadece konteyner sağlıklı olduğunda 0'dan çıkmalıdır. Başarısız olursa, sistem birimi başarısız olarak işaretler.

Kaynak Sınırları Sistemd aracılığıyla

Docker'in kendi kaynak bayrakları olmadan bir konteyner CPU ve hafızayı kısıtlayabilirsiniz. Bu, tek bir hostta birden çok konteyner çalıştırdığınızda özellikle yararlıdır:

[Service]
MemoryMax=512M
CPUQuota=50%

Bu ayarlar, sistemin Docker'den bağımsız olarak uygulanması zor bir sınır yaratır.

Multi Containers'i Yönetin: Sistemd vs. Docker Compose

Küçük bir konteyner sayısı için (örneğin, 25), bireysel sistemli hizmet dosyaları basit ve kullanılabilir. ancak, bir proje birçok birbirine bağlı hizmet içerdiğinde, Docker Compose daha uygun hale gelir. hala tüm Docker Compose yığınını arayarak tek bir hizmet ünitesi oluşturmak için kullanabilirsiniz. Örnek:

[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

Bu yaklaşım size sistemli yaşam döngüsü yönetimi ile birlikte hizmet tanımlamak için bir metanın basitliğini verir. Not thatETHFLT:36) hemen çıkışlar yapılır çünkü [[DÜye Olmayanlar İçin Birimleri Korumak” olarak adlandırılır.

Hangi yöntem seçmelisiniz?

  • [FONT:0) Individual systemd hizmetleri) - mirasın en iyisi, katı başlangıç siparişi ile hizmetler veya ne zaman sınırsız kaynağ sınırlarına ihtiyacınız olduğunda.
  • [FONT:0]Docker Kome ile sistemli[[Dön 1: 1) – Bağımlıların iç içe toplandığı mikro hizmet yığınları için ideal, ve tüm grubu yönetmek için tek bir birim istiyorsunuz.

Sorun Ortak Konuları Sorun Gidermek

Dikkatli bir kurulumla bile, sorunlarla karşılaşabilirsiniz. Aşağıda sık sık sık tuzaklar ve çözümleri vardır.

Hizmet “Docker daemon’a bağlanamaz” ile başarısız olur.

Bu genellikle, Docker soketi hazır olduğundan önce servis başlar. Ünitenizin [[ŞUYGÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞ

Bir döngüde Konteyner Yeniden Başlıyor

Eğer konteyner hemen çıkıyorsa, sistem bunu yoğun bir döngü önlemek için yeniden başlatacaktır.)

Servis Temiz Olmayan

Yanlış yapılandırılmış bir şekilde yapılandırılabilir: konteyneri çalıştırabilir. Doğru konteyner adını kullanır.Gerekli olarak konteyneri ortadan kaldırır.Gerekli olarak durdurursa, kabı ortadan kaldırır.

Çevre Değişkenleri Yüklenmez

Eğer dosyayı onaylayın ve kök tarafından okunabilir. quoting issues - sistemli striptizler değişken değerlerden alıntılar. Gizli enjeksiyon için, sistemli kimlik veya özel bir gizli yönetici kullanmayı düşünün.

Güvenlik Önergeleri

Sistem aracılığıyla Docker konteynerleri koşmak birkaç güvenlik noktası ortaya çıkarır:

  • Her zaman sistemli hizmeti mümkün olmayan bir kullanıcı olarak çalıştırın (örneğin, s.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.) ve [[D.D.D.D.D.D.D.D.D.D.D.D.D.D.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S
  • Sistemli birimlerde kesinlikle gerekli olmadıkça kullanımdan kaçının.
  • Sadece dağları ([Düzücüler) kullanın, ne zaman konteynerin ev sahibine yazması gerekmez.
  • Yararlı sistemli ve İZFLT:57, kaçışlara karşı birimi zorlaştırmak için.
[Service]
ProtectSystem=strict
ReadWritePaths=/var/log/myapp
PrivateTmp=true
User=myappuser

Dış Kaynaklar

Daha fazla okuma için, bu resmi referanslara danış:

  • [FONT=0)Docker Restart Politikalar Dokümantasyon).
  • [0]Sistem Servis Birimi Manual[Dönetici:0)[Dönetici:0)
  • [FONT=0]Docker Kome Genel Bakış[[Dönem: 1)

Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç

Docker konteynerleri ile sistemli sistem sizi güçlü, otomatik bir başlangıç mekanizması sunar, her bir konteyner veya tek bir birimin geri kalanıyla birlikte iyi yapılandırılmış bir hizmet ünitesi dosyaları yazarak, başlangıç siparişini kontrol edebilirsiniz, bağımlılıkları yönetebilirsiniz, operasyonlar ekibinizi kullanarak oturum açma oturumlarınızı izleyin.

Basit bir birim dosyasıyla başlayın, iyice test edin, sonra çevre dosyaları, sağlık kontrolleri ve güvenlik zorlaştırın. Bu yaklaşımla, Docker konteynerleriniz manuel müdahale olmadan yeniden başlayacak, çökecek ve yapılandırma değişiklikleri, bina uygulamalarına odaklanmak için ekibinizi serbest bırakacak.