Контейнер Docker сохраняет журналы в каталоге хоста

У меня есть вопрос, похожий на этот вопрос. Когда я запускаю свой файл docker-compose.yml, я автоматически создаю образ докера и, как указано в моем файле dockerfile, запускаю определенные приложения. Эти приложения создают некоторые журналы, но эти журналы записываются внутри контейнера Docker в папке /home/logs/.

Как я могу указать, что эти журналы записываются вне контейнера, на мой адрес /path/on/host? Просто потому, что если контейнер вышел из строя, мне нужно увидеть логи и не потерять их!

Это мой docker-compose.yml:

version: '3'
services:
  myapp:
    build: .
    image: myapp
    ports:
      - "9001:9001"

а вот мой dockerfile:

FROM java:latest
COPY myapp-1.0.jar /home
CMD java -jar /home/myapp-1.0.jar

И я просто запускаю его на рабочей машине с docker-compose up -d.

(Кстати, я новичок в докерах. Все ли мои шаги верны? Я что-то упустил?! Я вижу, что все в порядке, но мое приложение работает!)


person Tina J    schedule 26.01.2019    source источник


Ответы (2)


Все, что вам нужно, это том докера для сохранения файлов журнала. Итак, в том же каталоге, что и ваш docker-compose.yml, создайте каталог журналов, а затем определите монтирование тома. При определении монтирования помните, что синтаксис <host_machine_directy>:<container_directory>.

Попробуйте следующий том и дайте мне знать, что вы получите в ответ.

version: '3'
services:
  myapp:
    build: .
    image: myapp
    ports:
      - "9001:9001"
    volumes:
      - ./logs:/home/logs

Также стоит отметить, что при таком подходе настойчивость работает в обоих направлениях. Любые изменения, внесенные в файлы из контейнера, отражаются обратно на хост. Любые изменения с хоста также отражаются внутри контейнера.

person Nebri    schedule 26.01.2019
comment
Привет. Я пытался использовать volumes. При запуске докера я вижу папку /logs на хосте. Но почему-то внутри ничего. Unable to create file logs/processor.log java.io.IOException: Could not create directory /home/logs - person Tina J; 07.02.2019

  • Да, вы можете смонтировать том с хоста в контейнер, как указано в приведенном выше ответе, используя bind mount.

  • В производственной среде я бы настоятельно рекомендовал отправлять журналы всех контейнеров в какое-то центральное место, так что даже если весь узел докера выйдет из строя, у вас все равно будет доступ к журналам и, возможно, вы сможете легко анализировать, фильтровать, устанавливать наблюдатели за ошибками журнала и создавать панель мониторинга. , например ELK

https://docs.docker.com/config/containers/logging/configure/

Чтобы это работало, вам нужно настроить приложение для отправки журналов на стандартный вывод вместо этого, а затем настроить демон docker для отправки журналов в одну из ваших конечных точек, например logstash, после чего вы можете настроить logstash для выполнения некоторую предварительную обработку (при необходимости), а затем передать ее в ваш экземпляр elasticsearch.

Если сделать еще один шаг, вы можете рассмотреть систему управления контейнерами, такую ​​как kubernetes, с централизованным ведением журналов в ELK и измерением в promethous.

person Ijaz Ahmad Khan    schedule 27.01.2019