도커 로그확인방법 및 내부 파일 복사 붙여넣기

2021. 9. 15. 10:49도커

반응형

##DB이관전에 VM에 도커를 설치하여 Mysql or MariaDB의 설정파일을 바꿔보던 도중 컨테이너가 run이 안되면서 아무런 메세지를 찾을수가 없는 사태가 발생했다..로그파일을 어떻게 보는지 하다가 찾아보게 된 로그확인방법..! 내가바꾼 my.cnf파일에 설정값이 올바르지 않아서 해당 파일을 바꿔줘야했다..(설정이 올바르지 않으니 run조차 안됬던것!) ㅠㅠㅠ##

먼저, 도커의 컨테이너에 대한 정보는 대부분 /var/lib/docker/containers/[Container-ID] directory 내에 저장된다.

당연히 로그 파일도 /var/lib/docker/containers/[Container-ID]/[Container-ID]-json.log란 포맷으로 해당 컨테이너 directory 밑에 존재한다. 

이외에도 docker inspect [container명] 명령어를 통하여 해당 container의 ID/Hostname/LogPath/Resource 등 전반적인 모든 정보를 알 수 있다.

inspect에 출력되는 정보는 json형태로 출력되기 때문에 jq를 통하여도 파싱하여 사용할 수 있다.

 

[Commands]

- 컨테이너의 모든 정보 확인 : docker inspect [컨테이너명]

root$ docker inspect testcontainer
[
    {
        "Id": "62147(생략)",
        "Created": "2020-10-28T02:16:14.807240106Z",
        "Path": "/init",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 28586,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2020-11-16T02:29:14.937533566Z",
            "FinishedAt": "2020-11-13T21:53:33.814430587Z"
        },
        "Image": "sha256:891ac5(생략)",
        "ResolvConfPath": "/var/lib/docker/containers/62147(생략)/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/62147(생략)/hostname",
        "HostsPath": "/var/lib/docker/containers/62147(생략)/hosts",
        "LogPath": "/var/lib/docker/containers/62147(생략)/62147(생략)-json.log",
        "Name": "/testcontainer",
        (이하 생략)

컨테이너의 ID/Hostname/LogPath/Resource 등의 모든 정보를 확인할 수 있다.

 

 

- 컨테이너 로그 확인 : docker logs [옵션] [컨테이너명]

Ex) docker logs mariadb(컨테이너명)

 

root$ docker logs -h
Flag shorthand -h has been deprecated, please use --help

Usage:  docker logs [OPTIONS] CONTAINER

Fetch the logs of a container

Options:
      --details        Show extra details provided to logs
  -f, --follow         Follow log output
      --since string   Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
      --tail string    Number of lines to show from the end of the logs (default "all")
  -t, --timestamps     Show timestamps
      --until string   Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)

그냥 docker logs [컨테이너명]을 입력하면 모든 로그가 출력되어 버린다. 따라서, 아래 옵션들을 참고하여 활용하면 상황에 따라 필요한 부분만 로그를 확인할 수 있다.

ex) 2020/11/16 02:00:00 이후 로그 출력하되, timestamp를 적용하여 출력

root$ docker logs testcontainer -t --since 2020-11-16T02:00:00 | head -n 5
2020-11-16T02:29:15.031044702Z [s6-init] making user provided files available at /var/run/s6/etc...exited 0.
2020-11-16T02:29:15.095762504Z [s6-init] ensuring user provided files have correct perms...exited 0.
2020-11-16T02:29:15.097730678Z [fix-attrs.d] applying ownership & permissions fixes...
2020-11-16T02:29:15.099645048Z [fix-attrs.d] done.
2020-11-16T02:29:15.101067907Z [cont-init.d] executing container initialization scripts...

 

출처: <https://devopsnet.tistory.com/42>

 

도커로 설치한 mariadb 설정파일 변경시 오류로 인해서 실행안되던것 때문에 찾아보게된 것들.

My.cnf 파일을 바꿔주었음.

Ex)

docker cp CONTAINERID:/etc/mysql /data/deploy

Mysql 설정파일 있는곳 폴더를 deploy 가져와봄.

docker cp /deploy CONTAINERID:/etc/mysql

수정 컨테이너 내부에 다시 돌려놓고 start시켜봄

 

 

톰캣 이미지가 설치된 컨테이너를 run으로 실행할 경우

 

docker run --name tomcat8 -i -t -d -p 8088:8080 tomcat-set1

 

톰캣이 자동으로 실행되면서 발생한 오류로 Docker 컨테이너가 실행되지 않았다.

아래 명령어로 컨테이너 에러 로그를 열어 보았고

 

docker logs -t CONTAINER ID

 

원인은 톰캣 실행시 server.xml에 설정한 경로가 존재하지 않아서 였다.

server.xml을 수정해야 하는데 컨테이너 자체가 실행되지 않기 때문에 방법을 고민하다가 결국 구글에 검색해보니 스택오버플로우의 <how-to-edit-files-in-stopped-not-starting-docker-container> 이 글의 답변 중 적절한 해결 방법을 찾았다.

 

 

해결방법

컨테이너는 정지 상태에 있지만 안에 있는 파일을 호스트OS로 복사할 수 있었다.

파일을 복사해와서 안에 있는 설정 파일을 수정 후 다시 붙여 넣으면 된다.

 

 

1. 컨테이너 ID 확인 후 호스트OS로 파일 복사

docker ps -a

 

docker cp CONTAINERID:/컨테이너 내부 경로 /호스트OS 경로

 

ex)

docker cp CONTAINERID:/usr/local/tomcat/ /home/ubuntu

 

 

2. 파일 수정 후 다시 붙여 넣기

호스트OS -> 컨테이너 내부 경로로 파일 복사

아래 코드에서 tomcat 폴더는 현재 경로(/home/ubuntu)에 위치해 있다. 그리고 tomcat  폴더를 덮어씌우기 때문에 

컨테이너 경로가 위와는 다르다.

 

docker cp tomcat/ CONTAINERID:/usr/local/

 

3. 실행 여부 확인

docker start -i CONTAINERID

 

실행이 잘되면 컨테이너를 이미지로 만든 후 다시 docker run하면 된다.

docker commit <CONTAINERNAME> <NEWIMAGENAME>

 

출처: <https://midas123.tistory.com/233>

반응형