Mengapa Menggabungkan Sistem dengan Docker untuk Ledakan Produksi

Infrastruktur modern Keanekaragaman infrastruktur modern menuntut agar layanan terkontainer bertahan dari reboot yang tak terduga, kegagalan perangkat keras, atau pembaruan paket. Sementara Docker menyediakan kebijakan restart (]), kebijakan ini hanya bekerja selama daemon Docker berjalan. Sistemd ⁇ sistem iniit yang digunakan oleh Ubuntu, Debian, Fedora, CentOS, dan sebagian besar distribusi Linux modern ⁇ mengambil lebih lanjut ini dengan mengelola daur hidup daemon Docker itu sendiri dan dapat memulai kontainer bahkan sebelum soket Docker menjadi tersedia. Manfaat penggunaan sistem meliputi:

  • Pengamanan perintah awalan yang dijamin oleh perintah ketergantungan (misalnya, setelah jaringan.target, setelah docker.service)
  • Logging unified unified melalui , membuat debugging menjadi mudah
  • Pengendalian berpenghasilan-halus terhadap batas sumber (CPU, memori, I/O) menggunakan direktif unit sistemd
  • start ulang otomatis pada kegagalan dengan penundaan dan batasan ledakan yang dapat dikonfigurkan
  • Dukungan fugon untuk pengaktifan soket dan permulaan waktu

¡Offiliasi setiap kontainer Docker dalam berkas layanan bersistem, tim operasi memperoleh antarmuka yang konsisten untuk memulai, menghentikan, dan memantau kontainer, mengurangi kebergantungan pada skrip ad-hoc dan intervensi manual.

Covene Sebuah Layanan Sistem untuk Bekas Pendobrak Tunggal

Pendekatan standard ini melibatkan penulisan file unit layanan yang menyebut perintah Docker untuk menjalankan dan menghentikan kontainer.di bawah kita berjalan melalui proses langkah demi langkah, dimulai dengan contoh dasar dan kemudian meliputi persyaratan produksi umum.

Langkah 1: Tulis File Unit Dinas

urge membuat berkas bernama . Gunakan templat berikut sebagai titik awal:

[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

Explanation of key direktifs:

  • ⁇ memastikan daemon Docker berjalan sebelum memulai kontainer.
  • [[GANDAFLT:0]] ⁇ jika Docker dihentikan, layanan ini juga berhenti.
  • ⁇ membersihkan sisa kontainer apapun dari jangka sebelumnya (prefiks berarti kegagalan di sini adalah non-fatal).
  • ⁇ menggunakan untuk secara otomatis membuang wadah ketika berhenti.
  • ] ⁇ secara anggun menghentikan kontainer dengan waktu tunggu (10 detik).
  • ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ restarst ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  • [[LLAST:0]] ⁇ tunggu 10 detik sebelum restart.
  • [[LLAST:0]] ⁇ batas restart ke 3 percobaan per interval (lalai 10 detik) untuk menghindari restart loops.

Langkah 2: Aktifkan dan Mulailah Dinas

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

ifley The memberitahu sistemd untuk membaca ulang file layanan. menciptakan symlink sehingga layanan dimulai pada boot.

Mengelola Dinas dengan Perintah Sistem Standar

Setelah layanan berjalan, Anda mengendalikannya seperti layanan sistem lainnya:

  • Start:
  • Henti:
  • Restart:]
  • Status:
  • [[LRT:0]]Logs: (follow live log)

Pola Konfigurasi Lanjutan

Pelancaran production sering kali memerlukan lebih dari satu sederhana. Dibawah ini adalah peningkatan umum anda dapat menambah file layanan sistem anda.

Pembolehubah Persekitaran Lulusan Pembolehubah Persekitaran

Rahasia atau konfigurasi rahasia pengkodean-keras-keras-keras dalam berkas layanan tidak disarankan. Sebaliknya, gunakan berkas lingkungan terpisah:

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

Parameter prefiks sebelum path berarti layanan akan dimulai walaupun berkas tidak ada (berguna selama setup awal).

Networking dan Pengikatan Port

Untuk wadah yang perlu berkomunikasi satu sama lain pada host yang sama, pertimbangkan menggunakan atau jaringan bridge definisi pengguna. Contoh:

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

Jika menggunakan jaringan suai, pastikan jaringan ada sebelum layanan dimulai. Anda dapat menambahkan perintah untuk membuatnya:

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

Ketergantungan Antar-Pemerintah

Ketika satu wadah membutuhkan wadah lain untuk siap sebelum memulai (misalnya, aplikasi web menunggu basis data), sistemd dapat memberlakukan pemesanan. Membuat berkas layanan kedua untuk basis data dan kemudian:

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

menghubungkan daur hidup aplikasi web dengan wadah basis data ⁇ jika basis data berhenti, aplikasi web juga dihentikan.

Cek Kesehatan yang Waib dan Kesiapapian

Pemeriksaan kesehatan Docker dapat diintegrasikan dengan sistemd untuk mencegah ketersediaan layanan prematur. Gunakan dengan skrip yang mengjajak pendapat titik akhir kesehatan:

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

Skrip harus keluar 0 hanya ketika kontainer sehat. Jika gagal, sistem menandai unit sebagai gagal.

Batas Sumber Daya Sumber Daya Sumber Daya Sumber Daya Sumber Daya Sumber Daya Sumber Daya Sumber Daya Sumber Daya Sumber Daya Sumber Daya Sumber Daya Sumber Daya Sumber Daya Sumber Daya Sumber Daya Sumber Daya Sumber Daya Sumber Daya Sumber Daya Sumber Daya Sumber Daya

Anda dapat menahan CPU dan memori pada tingkat cgroup tanpa bendera sumber daya Docker sendiri. Ini sangat berguna ketika menjalankan beberapa kontainer pada satu host:

[Service]
MemoryMax=512M
CPUQuota=50%

Pengaturan ini membuat batas keras yang ditegakkan sistem secara independen dari Docker.

Manual Pengolahan Berbagai Bekas: Sistemd vs. Docker Gubah

Untuk sejumlah kecil wadah (misalnya, 2-5), berkas layanan sistemal individu sederhana dan dapat dipertahankan.Namun, ketika sebuah proyek melibatkan banyak layanan yang saling berhubungan, Docker Compose menjadi lebih nyaman. Anda masih dapat menggunakan sistem untuk mengatur seluruh stack Docker Compose dengan membuat unit layanan tunggal yang menyebut . Contoh:

[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

Pendekatan ini memberikan kesederhanaan Compose untuk mendefinisikan layanan yang dikombinasikan dengan manajemen daur hidup sistem. Perlu dicatat bahwa digunakan karena keluar segera. menjaga unit dalam keadaan \"aktif\" sampai disebut.

Metode mana yang harus kau pilih?

  • [[ZOBILT:0]]Individual systemd services ⁇ terbaik untuk aplikasi warisan, layanan dengan ordering startup yang ketat, atau ketika Anda membutuhkan batas sumber per-kontainer.
  • [[GANDIFLT:0]]Docker Compose with systemd]] ⁇ ideal untuk mikroservices stacks dimana dependensi ditangani secara internal oleh Compose, dan anda ingin satu unit tunggal untuk mengelola seluruh grup.

Masalah Novemberchishooting Masalah Umum

Bahkan dengan pengaturan yang cermat, Anda mungkin menghadapi masalah.

Gagal Layanan Vioneer dengan \"Tidak dapat terhubung ke daemon Docker\"

Ini biasanya berarti layanan dimulai sebelum soket Docker siap. Pastikan unit Anda berisi dan . Periksa juga bahwa daemon Docker diaktifkan: .

Restart Ulang Bekas dalam Gelung

Jika kontainer keluar segera, sistemd akan terus menjalankan ulang sesuai dengan dan . Periksa log kontainer dengan . Peningkatan (contoh, 30 detik) dan set untuk mencegah loop sibuk.

Dinas yang Tidak Berhenti Bersih

Sebuah Leftifine yang dikonfigurasi secara salah dapat meninggalkan container running. Verifikasi bahwa menggunakan nama kontainer yang benar. Gunakan untuk memaksa menghapus kontainer jika stop gagal.

Pembolehubah Persekitaran Pembolehubah PALYAR Tidak Dimuatkan

if you use , konfirmasi file ada dan dapat dibaca oleh root. Hindari mengutip isu ⁇ systemd strips petik dari nilai variabel. Untuk injeksi rahasia, pertimbangkan menggunakan kredensial sistemd atau manajer rahasia yang didedikasikan.

Pertimbangan Keamanan

Bekas Docker yang dijalankan oleh sistem menyebabkan beberapa titik keamanan:

  • Selalu wanfi menjalankan layanan sistemd sebagai pengguna non-root jika memungkinkan (gunakan dan direktif, tetapi pastikan pengguna memiliki akses ke soket Docker atau berjalan dalam mode tanpa root).
  • Hindari menggunakan dalam satuan sistem kecuali benar-benar diperlukan.
  • Use read-only bind mounts (]) kapanpun wadah tidak perlu menulis ke host.
  • Sistem leverage ] dan untuk mengeraskan unit terhadap escape.
[Service]
ProtectSystem=strict
ReadWritePaths=/var/log/myapp
PrivateTmp=true
User=myappuser

Sumber Daya Luaran LUAR

Untuk pembacaan lebih lanjut, berkonsultasi dengan referensi resmi ini:

Kekecualian Kesimpulan

Mengintegrasikan sistem dengan Docker containers memberikan mekanisme startup yang kuat dan otomatis yang terintegrasi tanpa kesejahteraan dengan seluruh sistem Linux Anda. Dengan menulis berkas unit layanan terstruktur dengan baik, Anda dapat mengendalikan susunan startup, mengelola ketergantungan, mengatur batas sumber daya, dan memantau log menggunakan alat yang sudah diketahui oleh tim operasi Anda. Apakah Anda memilih layanan individu untuk setiap wadah atau satu unit untuk menyusun stack Compose, sistemd menyediakan keandaan dan prediksi yang diinginkan lingkungan produksi.

Mulailah dengan berkas unit sederhana, uji secara menyeluruh, lalu lapisi pada pilihan canggih seperti berkas lingkungan, pemeriksaan kesehatan, dan hardening keamanan. Dengan pendekatan ini, wadah Docker Anda akan bertahan hidup reboot, crash, dan perubahan konfigurasi tanpa intervensi manual, membebaskan tim Anda untuk fokus pada aplikasi bangunan.