실행중인 Docker 컨테이너에서 파일 및 stdout을 읽는 방법


78

실행중인 도커 컨테이너에서 파일과 stdout을 읽기 위해 호스트 컴퓨터에서 애플리케이션을 시작하려면 어떻게해야합니까?

기본적으로 이렇게하고 싶습니다.

docker start containerid   
./myapp // This app will *somehow* have access files and stdout generated by the container I just stared. 

어떻게할까요? 내가 이것으로 어디로 가려고하는지 좀 더 구체적으로 말하면; 도커 컨테이너의 로그와 표준 출력을 읽고 해당 로그를 다른 곳에서 처리하고 싶습니다.

또한 다른 컨테이너에서 파일과 stdout을 읽을 수있는 또 다른 도커 컨테이너를 만들려고하는데 그게 가능한지 모르겠습니다.

답변:


119

docker 컨테이너에 의해 시작된 프로세스 의 stdoutdocker logs $containerid명령을 통해 사용할 수 있습니다 ( -f영원히 진행 하는 데 사용 ). 또 다른 옵션은 도커 원격 API를 통해 직접 로그를 스트리밍하는 것 입니다.

로그 파일에 액세스하려면 (필요한 경우에만 stdout 또는 syslogd와 같은 기타 표준 솔루션에 로깅을 고려하십시오) 유일한 실시간 옵션은 로그가 컨테이너 외부에 저장되고 처리 할 수 ​​있도록 볼륨구성하는 것입니다 (Marcus Hughes가 제안한 것처럼). 호스트 또는 다른 컨테이너에서.

로그에 대한 실시간 액세스가 필요하지 않은 경우 다음을 사용하여 파일 (tar 형식)을 내보낼 수 있습니다.docker export


1
잘 찾았습니다. 그것은 버전 1.1.0에서 소개 된 미행 컨테이너 로그처럼 보이는
rexposadas

@rexposadas -f옵션은 매우 오랫동안 존재했습니다 (어쨌든 docker의 시간 척도에서). 이 문제에 따라 적어도 7개월 : github.com/dotcloud/docker/issues/2997
아벨 Muiño

일부 로그를 잘 저장하는 Cloudwatch를 설정했지만 stdout 로그는 저장하지 않습니다. 솔루션이 작동했습니다. docker logs 명령을 실행하여 이러한 로그를 볼 수 있지만 어떻게 Cloudwatch에 계속 푸시 할 수 있습니까?
Ondrej Tokar

1
@OndrejTokar 저는 Cloudwatch에 익숙하지 않지만 docker logs명령을 파일에 파이프하여 해당 파일을 감시하거나 컨테이너 내에서 직접 수행하고 로그 파일을 볼륨으로 노출 할 수 있습니다.
Abel Muiño 2016 년

1
@OndrejTokar, awslogs 드라이브 ( docs.docker.com/engine/admin/logging/awslogs )를 참조하고있는 것 같습니다 . 다른 사람들이 관심이있을 경우 여기에 게시하십시오.
wanghq

16

stdout을 보려면 -i. 물론 이렇게해도 시작된 프로세스를 떠나 컨테이너를 탐색 할 수는 없습니다.

docker start -i containerid

또는 다음 위치에서 컨테이너의 파일 시스템을 볼 수 있습니다.

/var/lib/docker/containers/containerid/root/

그러나 이들 중 어느 것도 이상적이지 않습니다. 로그 또는 영구 저장소를 보려면를-v 사용할 때 스위치 로 볼륨연결하는 것이 올바른 방법 docker run입니다. 즉, 호스트에서 로그 파일을 검사하거나 다른 컨테이너에 연결하여 검사 할 수 있습니다.


6

조금 늦었지만 이것이 내가 journald. 꽤 강력합니다.

.NET을 사용하는 OS에서 도커 컨테이너를 실행해야합니다 systemd-journald.

docker run -d --log-driver=journald myapp

이렇게하면 로그 정리, 저장 형식 등과 같은 항목을 처리하는 호스트의 journald로 전체를 파이프하고 볼 수있는 몇 가지 멋진 옵션을 제공합니다.

journalctl CONTAINER_NAME=myapp -f

기록되는대로 콘솔에 피드됩니다.

journalctl CONTAINER_NAME=myapp > output.log

파일의 전체를 제거 할 수 있습니다.

journalctl CONTAINER_NAME=myapp --since=17:45

또한 docker logs ....원하는 경우 로그를 계속 볼 수 있습니다 .

더 이상 > my.log또는 -v "/apps/myapp/logs:/logs"기타


1
이것은 그들 모두의 더 나은 대답입니다!
Basit Anwer

4

docker 컨테이너와 호스트 시스템 간 또는 별도의 컨테이너간에 파일을 공유하는 것은 볼륨을 사용하는 것이 가장 좋습니다 .

다른 컨테이너에서 앱을 실행하는 것은 전체 애플리케이션이 잘 격리되고 쉽게 배포 될 수 있도록 보장하기 때문에 아마도 최상의 솔루션 일 것입니다. 하려는 작업은 이 훌륭한 블로그 게시물에 설명 된 설정과 매우 유사하게 들립니다 . 살펴보세요!


제안 해 주셔서 감사합니다. 볼륨 사용은 옵션이 아닐 수 있습니다. 특정 볼륨 / 디렉토리에 로그를 저장하도록 이미지 생성자에게 말하고 싶지 않습니다. 목표는 앱 제작자가 기록하는 로그 파일을 읽는 것이 었습니다.
rexposadas

4

컨테이너의 파일 시스템은 다음에서 볼 수 있습니다.

/var/lib/docker/devicemapper/mnt/$CONTAINER_ID/rootfs/

그리고 당신은 단지

tail -f mylogfile.log

3
그 DIRS 나를 위해 비어
cdmckay

OSX 사용자의 경우 docker가 boot2docker VM에서 실행되므로이 ​​위치가 비어 있으므로 VM에서 해당 위치를 찾아야합니다.
Michael Barton

OSX에서 로그는 ~ / Library / Containers / com.docker.docker / Data / com.docker.driver.amd64-linux / log / docker.log에있을 수 있습니다. 도커 1.12.3을 사용하고 있습니다.
wanghq

2
제 상황에서는 다음 위치에서 로그를 찾았습니다. /var/lib/docker/containers/<containerID>/<containerID>-json.log
cs94njw
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.