Apache di Docker: Bagaimana cara "mengakses.log"?

17

Saya baru saja mulai dengan Docker dan richt sekarang saya mencoba mencari cara untuk mengatur lingkungan Apache 2 / PHP dockerized pertama saya. Sampai sekarang saya telah menggunakan VM Linux penuh, di mana saya menggunakan file-file log yang ditulis ke / var / log / apache2, kemudian menggunakan "logrotate" untuk melompat ke file baru setiap hari.

File log terutama digunakan untuk deteksi kesalahan langsung (mis. Log on ke server dan gunakan lebih sedikit untuk membuka file access.log dan error.log saat ini) dan untuk fail2ban.

Jika saya benar, hal itu tidak dapat dilakukan di lingkungan Docker - terutama karena Anda biasanya tidak dapat masuk ke wadah untuk melihat log. Log juga akan hilang jika wadah dihapus.

Jadi: Apa metode yang paling umum untuk bekerja dengan / meniru / mengganti access.log / error.log dalam situasi itu? Apa solusi umum untuk lingkungan produksi dan pengembangan?

Ide saya sejauh ini termasuk menggunakan berbagi NFS (lambat dan dapat menyebabkan tabrakan nama file jika tidak hati-hati), dan logstash (tidak yakin apakah itu sepadan dengan usaha dan praktis untuk situs yang lebih kecil atau bahkan lingkungan dev?) Tapi saya yakin orang pintar telah datang dengan solusi yang lebih baik?

Tidak yakin apakah itu membuat perbedaan, tetapi saat ini saya mendasarkan gambar Docker saya di php: 5.6-apache .

BlaM
sumber

Jawaban:

13

Anda masih dapat menggunakan docker exec -it <your container name> /bin/bashperintah untuk masuk ke wadah Anda dan melakukan pekerjaan rutin Anda. Atau mungkin Anda bisa mengubah /bin/bashperintah atau skrip .shdari perintah Anda untuk menjalankannya.

Untuk mengeluarkan file Anda dari penggunaan wadah docker cp <container name:/path/to/file> </your local machine/path/>

Dan untuk pekerjaan sehari-hari Anda, Anda bisa menggunakan croncronjob perintah-perintah itu. Saya sangat merekomendasikan Anda untuk memiliki alias docker Anda yang sering. Sehingga saya bisa menggunakan buruh pelabuhan dengan senang hati dengan beberapa kunci.

The docker logs <container name/id>perintah untuk melihat log dari eksekusi gambar buruh pelabuhan. Ini menunjukkan redirect output ke stdout.

Fony Lew
sumber
Selain itu, docker attach <container name>adalah cara yang baik untuk melihat stdout dari wadah Anda. Tetapi harap berhati-hati bahwa Jika Anda melakukan ctrl + d atau ctrl + c, itu akan MENGHENTIKAN (sigkill) tugas Anda yang sedang berlangsung. Jadi, Anda harus melepaskannya dengan benar menggunakan kunci melarikan diri ctrl+p+q. Jika Anda hanya ingin shell ke wadah Anda, saya lebih suka menggunakan execperintah di atas.
Fony Lew
6

Bagaimana dengan menulis akses dan kesalahan log ke stderr dan stdout?

https://mail-archives.apache.org/mod_mbox/httpd-users/201508.mbox/%3CCABx2=D-wdd8FYLkHMqiNOKmOaNYb-tAOB-AsSEf2p=ctd6sMdg@mail.gmail.com%3E

https://gist.github.com/afolarin/a2ac14231d9079920864

LARI di -sf / dev / stdout /var/log/nginx/access.log

Jalankan ln -sf / dev / stderr /var/log/nginx/error.log

Namun, logging terpusat dengan ELK akan memungkinkan pemantauan yang lebih proaktif. Tapi Anda sudah memikirkannya sendiri.

JayMcTee
sumber
1

Sejauh ini saya telah menemukan " buruh pelabuhan " disebutkan beberapa kali.

Saya seorang pemula Docker absolut, sehingga mungkin memegang solusi untuk masalah saya - tapi sejauh ini saya belum sepenuhnya memahami konsep di balik perintah itu.

Docker tampaknya menyimpan semua stdout output dalam file JSON di / var / lib / docker / container / dan memberi saya kesempatan untuk mengaksesnya melalui perintah log.

Sejauh ini saya tidak yakin bagaimana cara benar-benar menggunakan output.

BlaM
sumber
1

Mungkin fitur ini tidak ada ketika pertanyaan diajukan, tetapi dengan argumen run's -v Anda dapat me-mount direktori pada host ke direktori dalam wadah.

docker run -v [host_dir]:[container_dir]

Dengan cara ini file log (atau lainnya) akan bertahan ketika wadah dihapus dan Anda dapat mengakses file seolah-olah apache diinstal pada host daripada dalam wadah.

Atau, Anda dapat mendorong file log yang dimodifikasi ke lokasi pusat. Tumpukan Kibana menggunakan filebeat untuk mencapai hal ini, tetapi harus dimungkinkan untuk menjalankan filebeat secara independen jika Anda tidak peduli dengan sisa stack.

Erik Lievaart
sumber
1
Docker telah mengikat volume mount tiga tahun lalu.
womble
0
root@my_docker:~ # ls -l /var/log/apache2/
total 0
lrwxrwxrwx 1 root root 11 Jul 17 04:55 access.log -> /dev/stdout
lrwxrwxrwx 1 root root 11 Jul 17 04:55 error.log -> /dev/stderr
lrwxrwxrwx 1 root root 11 Jul 17 04:55 other_vhosts_access.log -> /dev/stdout
root@my_docker:~ #

gambar buruh pelabuhan yang saya pilih hanya menautkan semua file * .log ke / dev / stdout dan / dev / stderr, jadi saya tidak bisa membacanya.

setelah menghapus file dan me-restart apache saya bisa mendapatkan log dari / var / log / di buruh pelabuhan.

docker-compose exec apache bash -c "tail -f /var/log/apache2/*.log"
Ohad Cohen
sumber
0

Dalam file konfigurasi apache Anda dapat menambahkan:
CustomLog / dev / stdout
ErrorLog / dev / stderr

dan untuk melihat log gunakan perintah di bawah ini:
buruh pelabuhan log container_id

S.Bao
sumber