Table of Contents
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:
- Dokumentasi Polisi Ulang Ulang Ulang Ulang-ulang Docker
- Systemd Service Unit Manual
- [[ErCharles:0]]Docker Compose Overview
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.