[Docker] Dockerfile을 이용한 이미지 빌드 예제 (+ docker-compose)
본문 바로가기
DevOps 부트캠프/Docker

[Docker] Dockerfile을 이용한 이미지 빌드 예제 (+ docker-compose)

by liveloper jay 2022. 3. 25.

 

Summary


 Docker 이미지 생성은 다음과 같이 할 수 있습니다.(제가 모르는 방법이 있다면 댓글로 알려주시면 감사하겠습니다!)

 

1.  pull을 이용하여 docker hub로부터 이미지 다운로드

// 이미지 pull
sudo docker pull {image_name:tag}

//해당 이미지 docker hub에 존재하는지 확인
sudo docker serarch {image_name:tag}

 

 2.  commit을 이용하여 생성된 컨테이너를 이미지화

   이 과정에서 이미지화 하기 전 까지의 과정을 간단하게 설명하면 다음과 같습니다.

  이미지 pull  ->  이미지로 컨테이너 run(이때 베이스 이미지 없으면 자동으로 pull)  ->  내부에 코드, 필요모듈 세팅

  이후 아래와 같이 이미지화 할 수 있습니다.

// 컨테이너가 생성 되었다고 가정하고 해당 컨테이너 이용하여 이미지 생성
sudo docker commit {container_name} {new_image_name:tag}

 

3. Dockerfile을 이용한 이미지 빌드

 위의 두 방법으로도 이미지를 생성할 수 있지만 Dockerfile이라는 것을 이용하여 이미지를 만드는 것도 가능합니다. 이번 포스팅에서는  이 Dockerfile을 이용한 이미지 빌드 방법에 대해 알아보겠습니다.

 

 

 

 

 

 

Dockerfile 


Dockerfile 이란?

지금까지 도커 이미지를 다운받고, 그 다운받은 이미지를 바탕으로 컨테이너를 생성하고, 해당 컨테이너 내부에 필요한 코드, 모듈, 툴 등을 세팅하고 그것을 다시 이미지로 만드는 과정으로 진행하였습니다. 하지만 이런 과정을 배번 반복한다는 것은 효율적이지 않은 방법일 것입니다. 더군다나 혼자 작업하는 것이 아닌 여러 개발자가 작업 시에는 위와 같은 과정으로 진행할 시 실수가 발생할 가능성도 적지않게 있을 것으로 생각됩니다.

이러한 문제들을 간소화하기 위해 Dockerfile이라는 것이 존재합니다. Dockerfile이란 패키지, 소스코드, 명령어, 환경변수 등 필요한 것을 기록해놓은 파일입니다. 간단히 말하면 '이렇게 설치/설정 해줘' 라고 명시되어있는 설명서에 비유하면 좋을 것 같습니다.

 

 

Dockerfile 작성

Dockerfile 작성은 간단한 예제를 통해 알아보겠습니다.

FROM node:16-alpine
WORKDIR /usr/src/app
COPY package*.json ./

RUN npm install
COPY . .
EXPOSE 80
CMD [ "node", "app.js" ]

1. FROM : 생성할 이미지의 베이스 이미지를 지정해줍니다. 여기서는 node:16-alpine이 베이스 이미지 입니다.

2. WORKDIR : 명령어를 실행할 디렉토리입니다. 배시 셸의 cd 명령어와 같은 기능을 합니다.

3. COPY : Docker 외부의 파일을 복사하여 내부에 추가합니다. COPY . . 은 현재 디렉토리에 있는 것을 전부 복사하여 workdir로 추가하는 것을 의미합니다.

4. RUN : 이미지 빌드시 실행되는 명령어입니다.

5. EXPOSE : 이미지에서 노출할 포트를 설정합니다.

6. CMD : 컨테이너 생성 시 실행되는 명령어로, Dockerfile에서 한번만 사용할 수 있습니다.

 

💡 RUN/CMD/ENTRYPOINT 차이

   1. RUN - 도커 파일로부터 도커 이미지를 빌드하는 순간 실행되는 명령어로 라이브러리 설치 부분에서 주로 활용됩니다.

   2. CMD - 이미지로부터 컨테이너를 생성하여 최초로 실행할 때 실행되는 명령어입니다.

   3. ENTRYPOINT - CMD와 동일하나 최초 실행시 꼭 실행되어야하는 명령어가 있을때 사용합니다. (CMD는 docker run 명령어 사용 시 변경 가능)

 더 많은 내용이 있지만 추후에 Dockerfile 작성에 대한 정리를 다시 진행하겠습니다.

 

 

이 과정까지 끝나고 docker build를 하게 되면 이미지가 생성이 됩니다. 여기서 캐시를 비활성화 하려면 --no-cache를 추가하면됩니다.

sudo docker build --no-cache -t {image_name:tag} .

dockerfile을 이용한 이미지 빌드

sudo docker images

이미지 생성 확인

 

 

 

 

 

 

docker-compose.yml


 docker-compose.yml은 이렇게 생성된 다수의 컨테이너를 하나의 yml 파일로 통합하여 관리하기 위해 사용됩니다. docker-compose.yml 파일을 이용하면, 컨테이너를 쉽게 생성할 수 있습니다. 스프린트 간 사용했던 예제를 통해 간단하게 알아보겠습니다.

version: "3.0"

services:
  frontend:
    build: frontend 
    image: liveloperJay/client
    ports:
      - target: 80
        published: 80
        x-aws-protocol: http
    depends_on:
      - backend

  backend:
    build: backend
    image: liveloperJay/server
    ports:
      - target: 3333
        published: 3333
        x-aws-protocol: http

 저도 간단한 스프린트로 진행한 것이라 지금은 일단 target은 내부 포트, published는 바인딩 되어질 포트를 지정하는 것이며,  x-aws-protocol은 ALB(Application Load Balancer)를 위한 리스너 정도라는 것만 이해했습니다. 추후에 기회가 되면 해당 부분에 대한 자세한 포스팅 진행하도록 하겠습니다.

 

위 과정이 모두 끝나면 아래의 두 명령을 실행해주면 빌드 및 컨테이너 생성이 완료됩니다.

//도커 이미지 빌드
sudo docker-compose build

//compose up
sudo docker-compose up

 이 두 명령을 한꺼번에 실행하고 싶을때는 다음과 같이 작성해주면 됩니다. 또한 도커를 백그라운드로 실행하고 싶을 때는 -d 옵션을 사용합니다.

// 한꺼번에 실행
sudo docker-compose up --build

//compose up을 백그라운드 데몬으로 실행
sudo docker-compose up -d

 이렇게 실행중인 컨테이너를 종료하고 싶으면 compose down을 해주시면 됩니다.

sudo docker-compose down

 

 

 

 

참고자료:

https://velog.io/@seheon99/%EC%B5%9C%EA%B3%A0%EC%9D%98-Dockerfile-%EC%9E%91%EC%84%B1%EC%9D%84-%EC%9C%84%ED%95%9C-%EB%AA%87-%EA%B0%80%EC%A7%80-%EC%8A%B5%EA%B4%80%EB%93%A4 

'DevOps 부트캠프 > Docker' 카테고리의 다른 글

Fastify서버 Docker 실행 시 접속 문제  (0) 2022.03.31
Docker란?_ 컨테이너와 Docker  (0) 2022.03.18

댓글