Rumah > Artikel > Operasi dan penyelenggaraan > Bagaimana untuk menatal log nginx dalam docker
penggunaan docker
1. docker ps to view running containers
2. docker images to view docker images
3. docker rm id (ID kontena) Padamkan bekas (ID kontena boleh dilihat melalui docker ps, bekas mesti dihentikan sebelum ia boleh dipadamkan)
3.1 Padam semua bekas docker rm `docker ps -a -q`
7. docker run -it ubuntu:16.04 Cipta dan jalankan bekas kontena
-t bermaksud untuk menentukan terminal atau terminal pseudo dalam yang baharu bekas
-i bermaksud benarkan kami Berinteraksi dengan (stdin) dalam bekas
-p menentukan port yang dipetakan
-d menjalankan bekas di latar belakang dan mencetak bekas id
7.1 docker run -dit ubuntu:16.04 Cipta dan jalankan bekas di latar belakang
7.2 docker run -ditp 8080:8080 (host port: container port) ubuntu:16.04 Cipta dan jalankan bekas di latar belakang dan petakan port kontena
8. id lampiran docker (id Container) Masukkan persekitaran kontena yang sedang berjalan
9. Keluar dari bekas
9.1 exit Exit bekas terus dan tamatkan bekas berjalan
9.2 [ctrl+p]+[ ctrl+q] (kekunci pintasan) Keluar dari bekas, tetapi ia tidak akan menamatkan bekas berjalan
10. docker commit -m'version idification' id (id kontena) ubuntu:16.04 (imej dan nombor versi) Serahkan imej dan Hasilkan imej (anda boleh menggunakan arahan ini untuk membungkus bekas yang dibina ke dalam imej baharu atau menulis ganti imej asal ( iaitu, ubah suai kandungan imej asal, dan nama imej yang dijana boleh terus ditulis ganti jika nama imej yang dihasilkan adalah sama dengan nombor versi))
Baiklah, semua orang tahu tentang Docker. Berikut adalah perkara utama artikel ini. nginx sendiri tidak menangani masalah guling balak, ia menendang bola kepada pengguna. Biasanya, anda boleh menggunakan alat logrotate untuk menyelesaikan tugasan ini, atau jika anda mahu, anda boleh menulis pelbagai skrip untuk menyelesaikan tugas yang sama. Pengarang artikel ini memperkenalkan cara menatal fail log nginx yang berjalan di docker (gambar di bawah adalah dari Internet).
Berfikir
nginx official sebenarnya memberi arahan tentang cara memutar log:
berputar log-filesuntuk memutar fail log, ia perlu dinamakan semula terlebih dahulu selepas itu isyarat usr1 harus dihantar ke proses induk kemudiannya akan membuka semula semua fail log yang sedang dibuka dan menetapkannya sebagai fail yang tidak mempunyai hak istimewa pengguna di mana proses pekerja sedang berjalan, sebagai pemilik selepas berjaya membuka semula, proses induk menutup semua fail yang terbuka dan menghantar mesej kepada proses pekerja untuk meminta mereka membuka semula fail baru dan menutup fail pemampatan lama serta-merta. Akibatnya, fail lama hampir serta-merta tersedia untuk pemprosesan pos, seperti Namakan semula fail log lama
•Kemudian hantar isyarat usr1 ke proses induk nginx•Proses induk nginx. akan melakukan beberapa pemprosesan selepas menerima isyarat, dan kemudian meminta proses pekerja membuka semula fail log
•Pekerja Proses membuka fail log baharu dan menutup fail log lama
Malah, satu-satunya kerja yang kita benar-benar yang perlu dilakukan ialah dua mata pertama!
Buat persekitaran ujian
Dengan mengandaikan bahawa docker telah dipasang dalam sistem anda, di sini kami menjalankan kontena nginx secara langsung:
$ docker run -d \ -p 80:80 \ -v $(pwd)/logs/nginx:/var/log/nginx \ --restart=always \ --name=mynginx \ nginx:1.11.3Perhatikan bahawa kami mengikat log nginx Dipasang pada direktori log dalam direktori semasa.
Simpan kandungan berikut ke dalam fail test.sh:
#!/bin/bash for ((i=1;i<=100000;i++)) do curl http://localhost > /dev/null sleep 1 doneKemudian jalankan skrip ini untuk mensimulasikan pengelogan berterusan. Skrip untuk mencipta log bergolekBuat fail rotatelog.sh dengan kandungan berikut:
#!/bin/bash getdatestring() { tz='asia/chongqing' date "+%y%m%d%h%m" } datestring=$(getdatestring) mv /var/log/nginx/access.log /var/log/nginx/access.${datestring}.log mv /var/log/nginx/error.log /var/log/nginx/error.${datestring}.log kill -usr1 `cat /var/run/nginx.pid`fungsi getdatestring mengambil masa semasa dan memformatkannya menjadi rentetan, seperti " 201807241310 ", penulis lebih suka menamakan fail dengan tarikh dan masa. Ambil perhatian bahawa zon waktu ditentukan di sini melalui tz='asia/chongqing', kerana secara lalai formatnya ialah waktu UTC, yang pelik untuk digunakan (anda perlu memikirkan +8 jam dalam masa nyata). Dua arahan mv berikut digunakan untuk menamakan semula fail log. Akhir sekali, hantar isyarat usr1 ke proses induk nginx melalui arahan bunuh.
Tambahkan kebenaran boleh laku pada fail rotatelog.sh melalui arahan berikut dan salin ke direktori $(pwd)/logs/nginx:
$ chmod +x rotatelog.sh $ sudo cp rotatelog.sh $(pwd)/logs/nginxLakukan operasi rolling dengan kerap
Nginx kami berjalan dalam bekas, jadi kami perlu menghantar isyarat usr1 ke proses induk nginx dalam bekas. Oleh itu, kita perlu melaksanakan skrip rotatelog.sh dalam bekas mynginx melalui arahan docker exec:
Melaksanakan arahan di atas sekali akan menghasilkan sekumpulan fail log baharu sebagai dijadualkan: Seterusnya kami mengkonfigurasi arahan ini dalam tugas yang dijadualkan dan biarkan ia dilaksanakan sekali setiap pagi pada pukul 1. Jalankan arahan crontab -e dan tambah baris berikut pada penghujung fail: Simpan dan keluar. Gambar di bawah adalah kesan tatal setiap 5 minit semasa ujian pengarang: Mengapa tidak mv fail log terus dalam hos? Secara teorinya ini mungkin, kerana kandungan volum data yang dipasang melalui bind adalah sama apabila dilihat dari hos dan dari bekas. Tetapi apabila anda benar-benar melakukan ini, anda mungkin menghadapi masalah kebenaran. Dalam mesin hos, anda biasanya menggunakan pengguna biasa, dan pemilik fail log yang dijana dalam bekas akan menjadi pengguna khas, dan secara amnya pengguna lain tidak akan diberikan kebenaran menulis dan melaksanakan: Sudah tentu, jika anda menggunakan pengguna root pada mesin hos, tidak akan ada masalah. Bolehkah isyarat dihantar dari mesin hos? Malah, nama penuh soalan ini sepatutnya: Bolehkah isyarat dihantar dari hos ke proses induk nginx dalam bekas docker? Jawapannya, ya. Penulis memperkenalkan masalah penangkapan isyarat dalam bekas dalam artikel ini. Dalam artikel itu kami memperkenalkan perintah bunuh buruh pelabuhan yang menghantar isyarat kepada proses dalam bekas. Kita boleh menghantar isyarat usr1 untuk memproses No. 1 (master nginx) dalam bekas melalui arahan: (kaedah ini hanya boleh menghantar isyarat untuk memproses No. 1 ): Menggabungkan dua soalan di atas, kita boleh menulis cara lain untuk menatal log masuk docker nginx. Kaedah ini tidak memerlukan pelaksanaan perintah dalam bekas melalui arahan docker exec, tetapi melengkapkan semua operasi pada mesin hos: •Namakan semula fail log dahulu dalam volum data kontena* 1 * * * docker exec mynginx bash /var/log/nginx/rotatelog.sh
$ docker container kill mynginx -s usr
• Hantar isyarat usr1 untuk memproses No 1 dalam bekas
Atas ialah kandungan terperinci Bagaimana untuk menatal log nginx dalam docker. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!