실행중인 도커 컨테이너에서 파일과 stdout을 읽기 위해 호스트 컴퓨터에서 애플리케이션을 시작하려면 어떻게해야합니까?
기본적으로 이렇게하고 싶습니다.
docker start containerid
./myapp // This app will *somehow* have access files and stdout generated by the container I just stared.
어떻게할까요? 내가 이것으로 어디로 가려고하는지 좀 더 구체적으로 말하면; 도커 컨테이너의 로그와 표준 출력을 읽고 해당 로그를 다른 곳에서 처리하고 싶습니다.
또한 다른 컨테이너에서 파일과 stdout을 읽을 수있는 또 다른 도커 컨테이너를 만들려고하는데 그게 가능한지 모르겠습니다.
답변
docker 컨테이너에 의해 시작된 프로세스 의 stdout 은 docker logs $containerid
명령을 통해 사용할 수 있습니다 ( -f
영원히 진행 하는 데 사용 ). 또 다른 옵션은 도커 원격 API를 통해 직접 로그를 스트리밍하는 것 입니다.
로그 파일에 액세스하려면 (필요한 경우에만 stdout 또는 syslogd와 같은 기타 표준 솔루션에 로깅을 고려하십시오) 유일한 실시간 옵션은 로그가 컨테이너 외부에 저장되고 처리 할 수 있도록 볼륨 을 구성하는 것입니다 (Marcus Hughes가 제안한 것처럼). 호스트 또는 다른 컨테이너에서.
로그에 대한 실시간 액세스가 필요하지 않은 경우 다음을 사용하여 파일 (tar 형식)을 내보낼 수 있습니다.docker export
답변
stdout을 보려면 -i
. 물론 이렇게해도 시작된 프로세스를 떠나 컨테이너를 탐색 할 수는 없습니다.
docker start -i containerid
또는 다음 위치에서 컨테이너의 파일 시스템을 볼 수 있습니다.
/var/lib/docker/containers/containerid/root/
그러나 이들 중 어느 것도 이상적이지 않습니다. 로그 또는 영구 저장소를 보려면를-v
사용할 때 스위치 로 볼륨 을 연결하는 것이 올바른 방법 docker run
입니다. 즉, 호스트에서 로그 파일을 검사하거나 다른 컨테이너에 연결하여 검사 할 수 있습니다.
답변
조금 늦었지만 이것이 내가 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"
기타
답변
docker 컨테이너와 호스트 시스템 간 또는 별도의 컨테이너간에 파일을 공유하는 것은 볼륨을 사용하는 것이 가장 좋습니다 .
다른 컨테이너에서 앱을 실행하는 것은 전체 애플리케이션이 잘 격리되고 쉽게 배포 될 수 있도록 보장하기 때문에 아마도 최상의 솔루션 일 것입니다. 하려는 작업은 이 훌륭한 블로그 게시물에 설명 된 설정과 매우 유사하게 들립니다 . 살펴보세요!
답변
컨테이너의 파일 시스템은 다음에서 볼 수 있습니다.
/var/lib/docker/devicemapper/mnt/$CONTAINER_ID/rootfs/
그리고 당신은 단지
tail -f mylogfile.log