티스토리 뷰

인프라/Docker

도커 이미지 빌드

_andy_ 2022. 2. 11. 14:00

이번 글에서는 도커 컨테이너를 실제 배포하기 위해 도커 이미지로 빌드하는 것에 대해 알아보려고 한다. 도커 이미지 구조를 알아보고, Dockerfile에 대해 알아본다.

 

 

 

도커 이미지 구조

다음 이미지는 도커 이미지의 구조를 도식화한 그림이다. 왼쪽은 도커 이미지이고, 오른쪽은 도커 컨테이너이다.

 

Docker Image에는 ubuntu, nginx, web app 의 세 가지 이미지로 구성되어 있다. nginx는 ubuntu 를 기반으로 만들어졌다고 가정하고, web app 이미지는 nginx 이미지를 기반으로 만들어졌다고 가정하겠다. Ubuntu 이미지의 경우 Layer A, B, C 의 세 레이어로 구성되어 있는 것을 볼 수 있는데, 실제로 도커 이미지의 구조는 레이어 아키텍처로, 새로운 변경 사항이 레이어로 쌓이는 형태로 볼 수 있다.

 

nginx 이미지의 경우 ubuntu 이미지를 기반으로 하기 때문에 ubuntu의 세 레이어가 있는 상태로 위에 nginx 이미지가 쌓이고, web app 의 경우도 Layer A, B, C 위에 nginx 이미지가 있고, 그 위에 web app 의 실제 소스가 레이어 형태로 쌓이는 것을 볼 수 있다.

 

Docker Container 의 예시를 보면 Web app 이미지를 사용하는 것을 볼 수 있는데, 이렇게 컨테이너를 생성하게 되면 web app 이미지가 Image Layer 라는 형태로 컨테이너가 실행될 때 복사된다. Container 에서의 Layer read-only (읽기 전용) 으로 복제되기 때문에 변경이 불가능한 상태이며, 컨테이너가 생성될 때마다 해당 컨테이너의 Container Layer 가 생성된다. 이때 Container Layer는 Read 와 Write 가 가능한 Layer 이다. 다만, Container 가 종료되어 삭제될 때 Container Layer 도 함께 삭제된다.

 


이제 실습 환경에서 확인해 보자.

 

현재 실행 중인 도커 컨테이너는 없으며,

 

docker images 명령어를 통해 현재 호스트 운영 체제의 로컬에 보관 중인 이미지 리스트를 확인할 수 있다.

 

또한 다음 명령어를 이용하여 docker image 의 상세 정보를 확인할 수 있다.

docker image inspect [REPOSITORY]:[TAG]

 

결과로 json 형식의 텍스트가 출력되는데, 이중 최하단의 "RootFS" 의 Layers 를 보면, 다음과 같이 여러 레이어로 구성된 것을 확인할 수 있다.

 

 

Dockerfile 없이 이미지 생성하기

docker commit 명령어는 Dockerfile 없이 이미지를 생성하는 방법이다. commit 명령어의 경우 git 의 commit 명령어와 비슷하게 변경 사항을 저장하는 명령어이다. 기존 컨테이너를 기반으로 해당 컨테이너에서 변경 사항을 만들고 나서 새로운 이미지로 커밋을 할 수 있다.

 

test-ubuntu 라는 이름으로 새로운 ubuntu container 를 만들어 보자.

docker run -it --name test-ubuntu ubuntu:focal

 

쉘에 접속하여 다음과 같이 파일 하나를 생성한다.

 

이 상태에서, Ctrl + P + Q 단축키를 이용하여 컨테이너를 종료하지 않고 쉘을 빠져나올 수 있다.

 

해당 컨테이너가 실행 중인 것을 확인할 수 있다.

 

이 상태에서 다음 명렁어를 통해 해당 컨테이너를 이미지로 저장해 보자.

 # -a : [author] 커밋을 한 사람
 # -m : [message] 커밋 메시지
 # test-ubuntu : 이미지 대상 컨테이너
 # my-ubuntu:v1 : 이미지 이름과 태그
 
 docker commit -a tester -m "Add test_file" test-ubuntu my-ubuntu:v1

 

명령어가 정상적으로 실행되면 다음과 같이 해시값이 나온 것을 볼 수 있다.

 

docker images 명령어로 확인해 보면 방금 생성한 my-ubuntu 이미지가 정상적으로 생성된 것을 확인할 수 있다.

 

여기서 다시 한 번 inspect 를 실행하면, 다음과 같이 충 두 개의 Layer 가 존재하는 것을 확인할 수 있다.

 

우리가 이 이미지를 만들 때 사용했던 ubuntu:focal 이미지도 inspect 로 살펴보면 다음과 같이 하나의 레이어가 존재하는 것을 확인할 수 있다.

 

기존의 ubuntu:focal 이미지를 기반으로 만든 my-ubuntu 이기 때문ㅁ에, ubuntu:focal 의 이미지 레이어를 그대로 가져와서 새로운 컨테이너 레이어로 쌓이는 것을 확인할 수 있다. 이렇게 도커 이미지는 레이어 아키텍처로 되어 있는 것을 실습으로 확인해 보았다.

 


 

이제 우리가 생성한 이미지가 제대로 동작하는지 확인해 보자.

정확한 동작을 확인하기 위해 현재 작동 중인 ubunbu:focal 이미지를 삭제해 보자.

 

그리고, 다음 명령어를 통해 이전에 만들었던 이미지를 실행해 보자.

정상적으로 접속되며, 이전에 만들었던 파일 또한 정상적으로 존재하는 것을 확인할 수 있다.

 

 

Dockerfile 이용하여 이미지 생성

Dockerfile 은 콘솔에서의 명령어를 Dockerfile 의 문법으로 생성하여 파일 기반으로 이미지를 생성할 수 있도록 하는 파일이다. 다음은 Dockerfile 문법의 예시이다.

FROM node:12-alpine
RUN apk add --no-cache python3 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]

 

위 명령어들이 차례대로 실행된다고 보면 되며, 아래 명령어를 통해 Dockerfile 을 기반으로 이미지를 생성할 수 있다.

# docker build [OPTIONS] PATH
# ./ 디렉토리를 빌드 컨텍스트로 ap_app:v1 이미지 빌드 (Dockerfile 이용)
$ docker build -t my_app:v1 ./

# ./ 디렉토리를 빌드 컨텍스트로 my_app:v1 이미지 빌드 (example/MyDockerFile 이용)
$ docker build -t my_app:v1 -f example/MyDockerFile ./

 

실습을 진행하기 위해 임시의 node 기반 프로젝트를 준비한다. 준비된 프로젝트가 없는 경우 필자의 Repo 에서 Clone 하셔도 된다.

https://github.com/wkdgus1164/react-starter

 

GitHub - wkdgus1164/react-starter

Contribute to wkdgus1164/react-starter development by creating an account on GitHub.

github.com

 

프로젝트를 클론하면 기본 React 프로젝트가 생길 것인데, Root 디렉토리에 다음과 같이 Dockerfile 을 생성한다.

 

그리고, Dockerfile 에 다음과 같이 작성한다.

 

자세한 Dockerfile 의 문법에 대해서는 다음 글에서 다룰 예정이니, 우선 Dockerfile 내의 구문이 순차적으로 실행된다고 이해하면 된다. 그리 어려운 내용은 아니어서 직관적으로 이해가 가능할 수도 있다.

 

Dockerfile이 준비되었으면, 다음 명령어를 통해 build 를 시작한다.

docker build -t my-app:v1 ./

 

빌드가 차례대로 실행될 것이며, 빌드가 완료된 후 docker images 명령어를 실행하여 다음과 같이 방금 빌드한 이미지가 리스트에 보이면 빌드가 성공한 것이다.

'인프라 > Docker' 카테고리의 다른 글

도커 이미지 압축 저장 및 불러오기  (0) 2022.02.13
Dockerfile 문법 알아보기  (0) 2022.02.12
도커 컨테이너 로그  (0) 2022.02.10
도커 컨테이너 네트워크  (0) 2022.02.09
도커 컨테이너 명령어 실행 (exec)  (0) 2022.02.08
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함