Apache in Docker: come posso "access.log"?


17

Sto appena iniziando con Docker e Richt ora sto cercando di capire come impostare il mio primo ambiente Apache 2 / PHP dockerizzato. Fino ad ora ho usato macchine virtuali Linux complete, dove ho usato i file di registro scritti in / var / log / apache2, quindi ho usato "logrotate" per passare a un nuovo file ogni giorno.

I file di log sono stati utilizzati principalmente per il rilevamento immediato degli errori (ad esempio, accedere al server e utilizzare meno per aprire i file access.log e error.log correnti) e fail2ban.

Se ho ragione, ciò non è praticabile in un ambiente Docker, principalmente perché di solito non è possibile accedere ai contenitori per dare un'occhiata ai registri. Inoltre i log andranno persi se il contenitore viene rimosso.

Quindi: qual è il metodo più comune con cui lavorare / emulare / sostituire access.log / error.log in quella situazione? Quali sono le soluzioni comuni per ambienti di produzione e sviluppo?

Le mie idee finora includono l'uso di una condivisione NFS (lenta e può causare collisioni di nomi di file se non attenti) e logstash (non sei sicuro che valga la pena e praticabile per siti più piccoli o persino ambienti di sviluppo?) Ma sono sicuro che le persone intelligenti hai trovato soluzioni migliori?

Non sono sicuro che faccia la differenza, ma attualmente sto basando la mia immagine Docker su php: 5.6-apache .

Risposte:


13

Puoi ancora usare il docker exec -it <your container name> /bin/bashcomando per entrare nel tuo contenitore e fare il tuo lavoro normale. O forse puoi cambiarlo /bin/bashnel tuo comando o script .shdel tuo comando per eseguirlo.

Per estrarre il file dal contenitore, utilizzare docker cp <container name:/path/to/file> </your local machine/path/>

E per il tuo lavoro quotidiano, puoi usare croncronjob quei comandi. Ti consiglio vivamente di avere alias i tuoi frequenti comandi docker. In modo che io possa usare felicemente la finestra mobile con poche chiavi.

Il docker logs <container name/id>comando serve per visualizzare il registro dall'esecuzione dell'immagine docker. Mostra l'output di reindirizzamento su stdout.


Inoltre, docker attach <container name>è il buon modo per vedere stdout dal tuo contenitore. Ma tieni presente che se fai ctrl + d o ctrl + c, TERMINERA (sigkill) il tuo compito in corso. Quindi devi staccarlo correttamente usando il tasto Esc ctrl+p+q. Se vuoi solo sgusciare nel tuo contenitore, preferisco usare il execcomando sopra.
Fony Lew,

6

Che ne dite di scrivere l'accesso e il registro degli errori su stderr e 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

RUN ln -sf / dev / stdout /var/log/nginx/access.log

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

La registrazione centralizzata con ELK consentirebbe tuttavia un monitoraggio più proattivo. Ma hai già pensato a quello da solo.


1

Finora ho trovato più volte " registri docker " menzionati.

Sono un newb assoluto di Docker, quindi potrebbe contenere la soluzione al mio problema, ma finora non ho compreso appieno il concetto alla base di quel comando.

Docker sembra mantenere tutto l'output stdout nei file JSON in / var / lib / docker / containers / e mi dà la possibilità di accedervi tramite il comando logs.

Finora non sono sicuro di come utilizzare effettivamente l'output.


1

Forse questa funzione non esisteva quando è stata posta la domanda, ma con l'argomento run -v è possibile montare una directory sull'host su una directory nel contenitore.

docker run -v [host_dir]:[container_dir]

In questo modo i file di registro (o altri) sopravviveranno quando il contenitore viene eliminato e puoi accedere ai file come se apache fosse installato sull'host anziché in un contenitore.

In alternativa, è possibile in qualche modo trasferire i file di registro modificati in una posizione centrale. Lo stack di Kibana utilizza filebeat per raggiungere questo obiettivo, ma dovrebbe essere possibile eseguire filebeat in modo indipendente se non ti interessa il resto dello stack.


1
Docker aveva volumi di mount vincolanti tre anni fa.
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:~ #

l'immagine docker che ho scelto ha appena collegato tutti i file * .log a / dev / stdout e / dev / stderr, quindi non sono riuscito a leggerli.

dopo aver rimosso i file e aver riavviato Apache posso ottenere i log da / var / log / nella finestra mobile.

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

0

Nel file di configurazione di apache è possibile aggiungere:
CustomLog / dev / stdout
ErrorLog / dev / stderr

e per vedere i log usa il comando seguente:
docker logs container_id

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.