# 목차
[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를 생성하여 실행
'DevOps > Docker' 카테고리의 다른 글
Docker Image & Container02 (0) | 2023.02.01 |
---|---|
Window 10에서 Docker를 이용한 Kubernetes 설치 (0) | 2023.01.30 |
[ Docker ] 도커의 기본 개념 (0) | 2023.01.27 |