이미지와 컨테이너 관계

이미지는 모든 설정 명령과 모든 코드가 포함된 공유 가능한 패키지이다.

즉, 이미지는 한 번 생성되면 내부 코드를 수정할 수가 없다. 

이미지는 컨테이너를 실행하기 위한 설계도와 같다. 컨테이너는 이미지를 기반으로 실행된다.

 

 

이미지 가져오기

이미지를 가져오는 대표적인 방법은 도커 허브 사이트를 이용하는 것이다.

https://hub.docker.com/

 

Docker Hub Container Image Library | App Containerization

Deliver your business through Docker Hub Package and publish apps and plugins as containers in Docker Hub for easy download and deployment by millions of Docker users worldwide.

hub.docker.com

도커는 도커허브에 연결하는 기능을 내장하고 있어, 만약 로컬에서 해당하는 이름에 이미지가 없다면 추가로 도커 허브를 탐색한다.

위의 경우 도커 허브에서 공식 노드 이미지를 받아 실행하게 된다.

도커 허브에서 이미지를 받을 때 가장 최신 버전을 받게 된다.

 

커스텀 이미지 만들기

이미지 생성의 핵심은 Dockerfile 이다.

Dockerfile 은 도커에 의해 식별되는 특별한 이름이다.

Dockerfile을 작성했다면, 빌드하는 명령어는 아래와 같다.

 

docker build .

빌드 과정을 보면 도커파일에 명시한 순서대로 빌드하는 것을 알 수 있다.

도커는 레이어 기반으로 쌓아가면서 이미지 파일을 생성한다.

 

마지막 해시값은 이미지를 생성할 때 이름을 부여하지 않았을 시 이름 역할을 하게 된다.

 

이미지 기반으로 컨테이너 생성하기

생성된 이미지는 docker run 명령어로 컨테이너를 생성과 구동을 할 수 있다.

컨테이너를 구동할 때 컨테이너 내부에서 사용할 포트와 실제 호스트 머신에서 접근할 포트 정보를 매핑해줘야한다.

-p 호스트포트:도커포트  

도커 포트는 컨테이너 내부에서 외부로 노출할 포트번호다. 도커를 구동하는 호스트 머신에서 이를 변경해서 매핑할 수 있다.

 

3000번 포트로 접속

코드를 변경한 후 컨테이너를 재기동

 

변경된 코드가 반영이 안된 것을 볼 수 있다. 이는 이미지는 빌드될 당시 상태를 스냅샷한 것과 같고, 한 번 빌드된 이미지는 읽기전용이다.  자바로 따지면 final 특성을 가진것이다. 따라서 수정을 할 수 없다. 

코드를 변경한 상태로 이미지를 다시 빌드를 해야 적용된다.

 

 

 

레이어 기반

이미지는 레이어 기반 구조로 이뤄진다.

이미지를 빌드하거나 이미지를 다시 빌드할 때 변경된 부분의 명령과 그 이후의 모든 명령이 재평가된다.

이미 빌드된 이미지를 다시 빌드할 때 CAHED로 빠르게 빌드가 수행된 것을 알 수 있다.

 

변경을 가한 WORKDIR 부터 이후 전부 재평가된 것을 볼 수 있다.

이러한 구조를 레이어 기반 아키텍처라 한다.

명령어 하나 하나가 레이어 처럼 쌓인다. 그렇기에 이전 명령어가 변경되면 이후 명령어는 전부 재평가되는 것이다.

다른 말로 이전 레이어의 변경은 이후 모든 레이어에 영향을 미친다.

 

이 레이어 기반 구조를 이해하면 빌드 시 최적화 방안을 모색할 수 있다.

앞서 빌드할 때 RUN npm install 로 종속성 다운로드 시 오래걸렸다. 이를 방지하기 위해 종속성 관련 package.json 앞으로 먼저 COPY한다면,  다른 소스 코드는 수정을 해도 오래걸리는 npm install 재평가되어 실행되지 않아 빠르게 빌드할 수 있다.

 

이미지와 컨테이너를 구성하고 관리

기본적으로 모든 명령어에 --help 도움을 받을 있다.

 

자주 사용하는 핵심 명령어

docker ps -a

   모든 컨테이너 목록

docker run

   이미지를 기반으로 컨테이너를 만들고 컨테이너 시작

docker start

   기존 컨테이너 시작

 

attached(연결) 모드, detached(분리) 모드

docker start 로 시작하는 경우, detached 모드가 디폴트

docker run으로 실행하는 경우, attached 모드가 디폴트

 

attached

attached 모드에선 컨테이너에 연결된 상태를 유지하기 때문에 서버에서 발생시킨 로그를 볼 수 있다.

detached

detached 모드에서 서버에서 발생한 로그를 보고 싶을 땐 docker logs 명령어를 사용하면 된다.

 

인터렉티브 모드

컨테이너와 통신하는 방법

attached 모드는 단순히 서버로부터 출력만 받는다.

 

docker run 사용 -it 상호작용 가능

run 시 상호작용 방법
start 시 상호작용 방법

이미지, 컨테이너 삭제하기

컨테이너 삭제

 

이미지 삭제 rmi(remove image)

 

 

사용하지 않는 컨테이너나 이미지를 일괄 삭제할 수도 있다.

prune 사용

자주쓰는 옵션 -rm

컨테이너를 재시작하지 않는 경우가 많다.

이유는 컨테이너를 재시작하는 시나리오는 대부분 코드의 변경이며 코드 변경은 다시 빌드해야됨을 의미한다. , 기존 컨테이너는 불필요해지는 경우가 많다.

 

컨테이너를 매번 새로 만들어 실행하기 위한 편리한 옵션(자동제거)

 

 

 

 

 

 

 

 

+ Recent posts