Apache dans Docker: Comment puis-je «access.log»?

17

Je viens de commencer avec Docker et richt maintenant j'essaie de comprendre comment configurer mon premier environnement Apache 2 / PHP docké. Jusqu'à présent, j'utilisais des machines virtuelles Linux complètes, où j'utilisais des fichiers journaux écrits dans / var / log / apache2, puis j'utilisais "logrotate" pour accéder à un nouveau fichier chaque jour.

Les fichiers journaux étaient principalement utilisés pour la détection immédiate des erreurs (c'est-à-dire pour se connecter au serveur et utiliser moins pour ouvrir les fichiers access.log et error.log actuels) et pour fail2ban.

Si je ne me trompe pas, cela n'est pas possible dans un environnement Docker - principalement parce que vous ne pouvez généralement pas vous connecter aux conteneurs pour consulter les journaux. De plus, les journaux seront perdus si le conteneur est retiré.

Donc: Quelle est la méthode la plus courante pour travailler avec / émuler / remplacer access.log / error.log dans cette situation? Quelles sont les solutions courantes pour les environnements de production et de développement?

Jusqu'à présent, mes idées incluent l'utilisation d'un partage NFS (lent et peut provoquer des collisions de noms de fichiers si ce n'est pas prudent) et logstash ( je ne sais pas si cela vaut la peine et pratique pour les petits sites ou même les environnements de développement?), Mais je suis sûr que les gens intelligents avez trouvé de meilleures solutions?

Je ne sais pas si cela fait une différence, mais actuellement je fonde mon image Docker sur php: 5.6-apache .

BlaM
la source

Réponses:

13

Vous pouvez toujours utiliser la docker exec -it <your container name> /bin/bashcommande pour entrer dans votre conteneur et faire votre travail normal. Ou peut-être pouvez-vous modifier /bin/bashvotre commande ou le script .shde votre commande pour l'exécuter.

Pour sortir votre fichier du conteneur, utilisez docker cp <container name:/path/to/file> </your local machine/path/>

Et pour votre travail quotidien, vous pouvez utiliser cronpour cronjob ces commandes. Je vous recommande fortement d'avoir alias vos fréquentes commandes docker. Pour que je puisse utiliser Docker avec bonheur avec quelques clés.

La docker logs <container name/id>commande permet d'afficher le journal à partir de l'exécution de l'image docker. Il affiche la sortie de redirection vers stdout.

Fony Lew
la source
De plus, docker attach <container name>c'est le bon moyen de voir la sortie standard de votre conteneur. Mais sachez que si vous faites ctrl + d ou ctrl + c, cela mettra fin (sigkill) à votre tâche en cours. Vous devez donc le détacher correctement en utilisant la touche d'échappement ctrl+p+q. Si vous voulez simplement décortiquer dans votre conteneur, je préfère utiliser la execcommande ci-dessus.
Fony Lew
6

Que diriez-vous d'écrire le journal des accès et des erreurs sur stderr et 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

Une journalisation centralisée avec ELK permettrait cependant une surveillance plus proactive. Mais vous y avez déjà pensé vous-même.

JayMcTee
la source
1

Jusqu'à présent, j'ai constaté que les « journaux de docker » étaient mentionnés à plusieurs reprises.

Je suis un vrai Docker newb, donc cela pourrait détenir la solution à mon problème - mais jusqu'à présent, je n'ai pas complètement compris le concept derrière cette commande.

Docker semble conserver toutes les sorties stdout dans les fichiers JSON dans / var / lib / docker / containers / et me donne une chance d'y accéder via la commande logs.

Jusqu'à présent, je ne sais pas vraiment comment utiliser la sortie.

BlaM
la source
1

Peut-être que cette fonctionnalité n'existait pas lorsque la question a été posée, mais avec l'argument -v de run, vous pouvez monter un répertoire sur l'hôte sur un répertoire dans le conteneur.

docker run -v [host_dir]:[container_dir]

De cette façon, les fichiers journaux (ou autres) survivront lorsque le conteneur est supprimé et vous pouvez accéder aux fichiers comme si apache était installé sur l'hôte plutôt que dans un conteneur.

Alternativement, vous pouvez en quelque sorte pousser les fichiers journaux modifiés vers un emplacement central. La pile Kibana utilise filebeat pour y parvenir, mais il devrait être possible d'exécuter filebeat indépendamment si vous ne vous souciez pas du reste de la pile.

Erik Lievaart
la source
1
Docker avait lié les volumes de montage il y a trois ans.
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'image de docker que j'ai choisie vient de lier tous les fichiers * .log à / dev / stdout et / dev / stderr, donc je n'ai pas pu les lire.

après avoir supprimé les fichiers et redémarré apache, je peux obtenir les journaux de / var / log / dans le menu fixe.

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

Dans le fichier de configuration d'apache, vous pouvez ajouter:
CustomLog / dev / stdout
ErrorLog / dev / stderr

et pour voir les journaux, utilisez la commande ci-dessous:
docker logs container_id

S.Bao
la source