홍카나의 공부방

[Docker] Docker Image 빌드 프로세스 본문

Data Engineering/Docker

[Docker] Docker Image 빌드 프로세스

홍문관카페나무 2023. 6. 25. 16:49

프로그램을 Docker에서 돌아가는 Image로 만들기 위해서는 어떻게 해야 할까?


1. 대상 소프트웨어를 선택한다.

  • 어떤 SW를 Docker Image로 만들 것인지 고려한다.
  • 다수의 컴포넌트로 구성되는 SW라면, 어떤 컴포넌트를 선택할 것인지 고려한다.

2. Docker Image로 빌드한다.

  • 이를 Dockerization이라고 부르는데, Dockerfile이란 text 파일로 세부 정보를 작성한다.
  • Dockerfile에는 SW를 이미지로 바꾸기 위한 Docker에게 주는 명령들이 포함되어 있다.
  • Dockerization으로 만들어진 Docker Image는 하나의 Docker Container안에서 실행된다.

Dockerization


Docker Image의 구성 요소는 다음과 같다.

 

1. 기본 OS( 리눅스라면 우분투, 데비안 등 )와 같은 SW의 실행환경

2. 소프트웨어 자체 ( 코드들 )

3. 소프트웨어가 필요로 하는 라이브러리

4. 파일 시스템 스냅샷

5. 환경 설정 변수 : 빌드할 때 변수, 실행할 때 변수

6. 메타 데이터 : 이미지 자체에 대한 정보(버전, 작성자, 설명 등)

 

이런 정보들과 설치 관련 실행 순서들이 Dockerfile에 작성된다.

Docker Image는 다수의 파일로 구성된다.

설치된 Docker Image들은 나중에 `docker image ls`라는 명령어로 확인할 수 있다.

 

 

Docker Image는 독립된 하나의 Container 안에서 실행되는데,

docker run 이라는 명령을 사용하여 이미지를 최초 등록한다.

(docker exec는 이미 실행이 되고 있는 docker에게 명령을 내리는 명령어다.)

 


Docker Image는 Docker Registry라는 보관소에 저장을 하게 된다.

On-prem registry와 Cloud registry가 존재하는데,

docker hub가 대표적인 클라우드 기반 레지스트리 서비스다.

docker hub도 private, public registry가 존재한다는 점을 알아두자.

 


간단한 Hello World 프로그램을 만들어서 Docker에서 실행해보겠다.

console.log("Hello Docker!"); 가 작성된 app.js를 출력하는 프로그램을 만들겠다.

 

Node.js를 이용할 것이고, node 환경도 설정할 것이다.

 

1. Dockerfile 생성하기

Docker에게 소프트웨어 설치 명령을 알리기 위해 Dockerfile을 만들자.

FROM node:alpine
COPY . /app
WORKDIR /app
CMD node app.js

먼저 베이스 이미지를 FROM으로 기술한다.

node:alpine에서 alpine은 OS 종류를 적어준건데, 경량 리눅스를 선택했다.

COPY command는 해당 이미지에 포함이 될 코드들을 복사하는데 사용한다.

즉, COPY . /app 은 현재 디렉토리에 있는 파일들을 docker image의 /app에 복사한다는 뜻이다.

WORKDIR은 현재 작업 디렉토리를 지정하는 것이다.

이를 안해주면 CMD로 명령을 시작할 때 file path를 추가적으로 작성해야 한다.

CMD는 Docker Container가 실행이 될 때 해야 할 명령을 작성하는 것이다.

 

기타 dockerfile에 들어가는 키워드는 다음과 같다.

  • ARG - Docker Image를 만들 때 사용되는 변수다. 최종 이미지에 안들어간다.
  • ENV - 컨테이너가 실행될 때 사용되는 환경변수로, 최종 이미지에도 저장된다.
  • USER - 컨테이너를 실행할 때 사용할 유저 ID다.
  • EXPOSE - 서비스 사용 포트 번호를 지정하는 데 사용한다.
  • RUN - build할 때 실행해야 하는 명령들을 지정하는데 사용한다. ( ex : RUN apt-get update && apt-get install -y curl )

CMD 대신에 ENTRYPOINT 명령어로 Container 실행시 명령을 전달할 수 있고

ENTRYPOINT가 있으면 CMD 값이 파라미터로 실행된다.

하지만 ENTRYPOINT는 CMD보다 overwrite가 비교적 복잡하다.

관리의 용이성을 위하여 최대한 CMD를 사용하자.

 

 

2. Image 빌드하기

# 그냥 빌드하기
docker build .

# 이름 주는 빌드
docker build -t {나의 도커 아이디}/{저장소/프로젝트 이름}:{버전} .

ex) docker build -t hongcana/hello:latest .

# for macos
docker build --platform linux/amd64 -t hello-world-docker .

 

다음으로는 docker build 명령어로 Image를 생성했다.

> docker build .

 

-t 태그를 지정하여 docker image의 이름을 지정해줄 수 있는데,

위와 같은 양식을 따라서 이름을 지어주면 된다.

 

만일 Apple M1 chip 기반 Mac에서 빌드하는 경우,

그 이미지는 ARM 기반 아키텍처로 만들어지기 때문에 일반 리눅스에서 안돌아갈 수 있다.

이 때는 --platform 옵션을 사용하여 linux/amd64로 지정한다.

 

맨 뒤에 .이 들어갔는데, 현재 경로의 dockerfile을 기반으로 build하겠다는 것이다.

dockerfile 경로가 다르면 경로를 따로 지정해줘야 한다.

빌드 중...

빌드가 끝나면 `docker image ls`로 이미지를 확인해보자.

docker image ls

 

 

빌드 과정에서 참고해야할 것은

베이스 이미지에서 다른 종속성이나 새로운 커맨드(CMD 등)를 추가하면

임시 컨테이너를 만든 후 그 컨테이너를 토대로 새로운 이미지를 만든다는 점을 기억해야 한다.

(이미지로 컨테이너를 만들고, 그 컨테이너에 새로운 명령어나 파일 스냅샷을 추가한 다음, 이것을 토대로 새로운 이미지가 만들어짐.)

 

 

 

3. Docker Container로 실행하기

docker run hello-world-docker

docker run 명령을 쓰면서 뒤에 이미지 이름(ID)을 지정해준다.

버전이 있다면 콜론(:)을 찍고 버전을 같이 써주면 된다.

 

이러면 dockerfile의 CMD에 지정이 되었던 명령이 실행되고 끝난다.

만일 이 이미지를 다른 컴퓨터에서 실행하고 싶다면, Docker Registry로 등록한다.

 

반응형