이번 게시물에서는 docker명령어들로 Container를 관리하는 방법을 살펴보겠다.
보통 Dockerfile의 맨 마지막에는 도커 컨테이너에서 어떤 프로세스를 메인으로 실행할지 결정한다. Ubuntu의 메인 프로세스는 bash shell이다. 그래서 exit를 누르면 메인 프로세스가 종료된다.
반면에 nginx의 메인 프로세스는 Dockerfile의 entrypoint다. 그래서 nignx 컨테이너에 접속하기 위해서는 새로운 bash shell을 컨테이너 내에서 실행해 접근해야 한다.
docker exec를 통해 가능하다.
docker info로 Default logging 드라이버를 확인할 수 있다.
docker inspect로 로그 파일의 경로 또한 확인할 수 있는데 실제 경로로 들어가보면
[컨테이너 아이디]-json.log파일을 확인할 수 있다. 이 파일이 바로 컨테이너의 로그 파일이다.
cat [컨테이너 아이디]-json.log
cat 명령어를 사용해 log를 확인할 수 있다. 이 밖에
docker logs [container 이름]
을 사용해 컨테이너의 로그를 읽을 수도 있다.
docker logs의 여러 옵션을 활용해 실시간으로 로그를 확인하거나 원하는 위치부터 로그를 읽기, 원하는 시간대의 로그를 읽기 등의 작업을 수행할 수 있다.
컨테이너를 기동해 운영하다보면 많은 파일들이 변경된다. docker diff
명령어로 컨테이너가 실행된 이후의 파일 변경 내용들을 추적할 수 있다.
컨테이너를 기동한 뒤 필요한 파일들을 설치해 운영하던 컨테이너를 이미지화 할 수 있다 여기에는 몇가지 방법이 있다.
docker image history [이미지 이름]
위의 사진을 보면 nginx 이미지가 여러개의 이미지로 이루어진 것을 확인할 수 있다. 이 이미지로 지금까지 했던 작업을 수행하면 nginx의 여러 이미지 중 최상위 Container layer에 작업 내용이 기록된다. 이렇게 만들어진 새로운 이미지인 nx를 이미지화 하기 위해서는 다음의 명령어를 입력하면 된다.
이렇게 새로운 이미지를 생성할 수 있다.
컨테이너를 tar파일로 저장하고 이미지로 import 하는 방식이다.
docker container export [컨테이너 이름 or ID] -o [파일 이름].tar
docker image import [파일 이름] [이미지 이름]
하지만 이 방법은 잘 쓰이지 않는다.
사진을 보면 layer가 하나가 된 것을 알 수 있다. 이러면 docker가 layer를 캐싱 처리해 기존 레이어를 재활용해 디스크 저장 크기는 물론 이미지 처리 시간까지 단축해주는 docker의 장점을 놓치게 된다.
이를 해결하기 위해 이미지 자체를 tar로 만드는 방식을 많이 사용한다.
해당 이미지가 어떤 버전인지 명시하는 것이 필요하고 새롭게 이미지가 푸쉬되었으면 이미지를 교체해야하는데 보통은 이미지를 교체할 때
docker run -d nginx
이 명령어를 실행 해 자동으로 latest 버전을 pull한다. 비록 latest여도 버전 확인이 필요하기 때문에 버전확인, 배포 이렇게 2가지 용도의 태그가 필요하다.
docker tag [이미지 이름]:[버전] [이미지 이름]:[새로운 태그]