728x90

# 목차

[1] Images & Containers
[2] docker run node
[3] docker ps -a : docker가 생성한 모든 프로세스 표시
[4] docker run - it node
[5] Dockerfile 해석
[6] docker build .
[7] docker run -p 3000:80 image_name
[8] docker stop container_name
[9] 코드를 수정하고 난 후 그것을 반영하기 위한 방법
[10] Docker의 Image Layer
[11] Image Layer와 이를 사용한 보다 image re-build에 최적화 된 Dockerfile 코드
[12] 퀴즈


[1] Images & Containers
1. Images
 1) image는 container의 청사진
 2) 실제로 코드와 코드를 실행하는데 필요한 도구를 포함
 3) 모든 설정 명령과 모든 코드가 포함된 공유할 수 있는 패키지

2. Containers
 1) image의 구체적인 실행 instance
   즉, image를 기반으로 container를 실행
 2) container = 실행 application


[2] docker run node를 실행하면 node 이미지를 기반으로 하는 container 생성
-> 해당 경로에 node가 존재하지 않으면 Docker Hub에서 node 이미지를 가져옴


[3] docker ps -a : docker가 생성한 모든 프로세스 표시
 1) docker ps : 실행 중인 docker만 출력
 2) docker ps -a : 실행 했었던 것까지 모두 출력


[4] docker run - it node : -it는 대화형 세션을 노출하는 명령어로 노드 터미널로 접속됨


[5] Dockerfile 해석

FROM node

WORKDIR /app

COPY . /app

RUN npm install

EXPOSE 80

CMD ["node", "server.js"]

1. FROM node : FROM 뒤에 사용할 image명 기입으로 해당 이미지 구축(해당 경로에 없으면 Docker Hub에서 다운로드)

2. WORKDIR /app : 모든 명령의 실행 경로

3. COPY . /app : COPY local경로 image의 외부 경로 : .은 현재 위치에서 파일들을 복사하며 그 위치는 container의 외부, image의 외부 경로(image/container file system)
 1) /app == ./ : 상대 경로로 해당 위치이며 WORKDIR로 현재 경로를 /app으로 설정하였기 때문에 동일

4. RUN npm install : node application을 실행하기 위한 모든 종속성 설치를 실행

5. EXPOSE 80 : 80번 port로 노출
 1) 즉, localhost:80으로 노출

6. CMD ["node", "server.js"] : CMD 명령어는 배열로 구성되어 있어 node server.js를 ["node", "server.js"]로 기입해야 함
 1) RUN node server.js로 실행하지 않는 이유는 이렇게 코딩하면 이 이미지(Dockerfile)이 build될 때마다 실행이 되기 때문
  즉, 이미지가 생성될 때 실행
 2) CMD는 이미지가 생성될 때 실행되지 않고 이미지를 기반으로 컨테이너가 시작될 때 실행
 3) docker run 해당 image명으로 CMD에 있는 명령을 실행할 수 있음
  즉, 여기서는 node server.js가 실행됨

[6] docker build . : Dockerfile 명령에 따라 image를 생성 명령어, '.'은 해당 local 경로에 있는 Dockerfile을 실행
# Terminal창에서 docker build . 실행 결과

image_name : d0015a76169c697cdcba4bf2b5181872b0994b5cf11a07586503aef9a4f8d483

 

[7] docker run -p 3000:80 image_name : -p 뒤에 local port 그 후에 docker container에 노출할 port
(EXPOSE 뒤에 Port number와 같게)

# docker run -p 3000:80 d0015a76169c697cdcba4bf2b5181872b0994b5cf11a07586503aef9a4f8d483 실행 결과(d0015a76169c697cdcba4bf2b5181872b0994b5cf11a07586503aef9a4f8d483 전체를 기입하지 않고 고유 식별자를 갖는d0015a76169c까지 기입하여도 실행이 가능)

# localhost:3000 사이트 접속

 

[8] docker stop container_name : 실행 중이던 컨테이너와 그 내부에서 실행 중인 노드 서버도 종료

# docker stop gracious_sutherland

 

[9] 코드를 수정하고 난 후 그것을 반영하기 위한 방법

1. image는 닫힌 Template이기 때문에 코드를 수정하고 docker run으로는 수정된 코드를 반영할 수 없음

2. 다시 docker build를 하여 image 재 생성
 1) image를 재 생성하면 cache를 이용하여 그 전에 생성한 것을 고려하여 빠르게 생성 됨

 

[10] Docker의 Image Layer

1. Dockerfile의 모든 명령image의 layer를 의미

2. image는 읽기 전용(Read-only)이며 일단 명령이 실행되고 image가 build 되면 image가 잠김
따라서 image를 재 생성하지 않으면 변경된 코드를 적용할 수 없음

3. docker build를 하면 image layer를 생성하고 생성된 layer는 cache가 됨
따라서 코드의 변경이 없으면 cache를 사용하여 빠르게 build 함

4. image re-build를 최적화 하기 위해서는 자주 변경이 되지 않는 명령들을 먼저 실행하여 layer를 쌓아 놓는 것이 좋음

 

[11] Image Layer와 이를 사용한 보다 image re-build에 최적화 된 Dockerfile 코드

# server.js 수정한 부분

# 최적화 시킨 Dockerfile 코드

FROM node

WORKDIR /app

COPY pakage.json /app

RUN npm install

COPY . /app

EXPOSE 80

CMD ["node", "server.js"]

1. COPY pakage.json /app : node JS의 설정 파일을 가진 pakage.json을 먼저 업로드
 1) 이를 먼저 설정하는 이유는 npm을 설치할 때
  프로젝트의 종속성을 관리하는 파일이 pakage.json이기 때문

2. RUN npm install : 그 다음 npm install을 실행하여 매 번 npm을 재 설치할 가능성을 낮추어 코드 최적화

3. COPY . /app : 그 다음에 나머지 파일들을 복사하여 변경된 파일들을 적용

# docker build . 로 image 재 생성 결과

→ CACHED를 사용하여 빠르게 처리 된 것을 볼 수 있음

# docker re-build 하여 image 재 생성하여 docker run -p를 하여 실행하고
사이트를 접속하여 변경한 코드가 적용 되었는지 확인한 결과

 


[12] 퀴즈

Q1) Docker의 Image는?
A1) image는 읽기/쓰기 Access 권한이 있는 application의 instance를 실행하는 container의 청사진

Q2) Image와 Container가 있는 이유는? 왜 Container만으로는 안되는가?
A2) 동일한 image를 기반으로 여러 container들이 독립적으로 사용할 수 있음

Q3) Container와 관련하여 Isolation의 의미는?
A3) container는 서로 독립적이며 default로 공유하는 데이터나 상태는 없음

Q4) Container란?
A4) Image를 기반으로 하는 독립적인 Software Unit이며, Image의 실행 중인 Instance
Container = Image의 실행 중인 Instance

Q5) Image의 내부 내용(Context)에서 Layer란?
A5) image의 모든 명령은 cache가 가능한 layer를 생성하며, layer는 image 재 구축 및 공유를 도움

Q6) docker build . 명령어의 의미는?
A6) image를 구축

Q7) docker run node 명령어의 의미는?
A7) ‘node’ 이미지를 기반으로 container를 생성하여 실행

 

 

 

 

728x90

'DevOps > Docker' 카테고리의 다른 글

Docker Image & Container02  (0) 2023.02.01
Window 10에서 Docker를 이용한 Kubernetes 설치  (0) 2023.01.30
[ Docker ] 도커의 기본 개념  (0) 2023.01.27

+ Recent posts