HomeAbout Me

Docker를 이용한 서버 구축 - 커스텀 이미지 빌드

By kuper0201
Published in 서버 구축
2022-03-02
3 min read
Docker를 이용한 서버 구축 - 커스텀 이미지 빌드

Table Of Contents

01
서론
02
Dockerfile 문법
03
Dockerfile 작성 예시
04
Docker 이미지 빌드
05
커스텀 이미지 실행
06
Docker Hub에 업로드
07
결론

서론

이전 글에서는 Docker Hub에 미리 제작되어 업로드된 이미지를 사용하는 방법에 대해 다뤘습니다. 이번 글에서는 Docker 이미지를 직접 빌드하고 Docker Hub에 업로드하는 방법에 대해 알아보겠습니다.

먼저 Docker 이미지를 생성하고 업로드하기 위한 단계를 알아보겠습니다.

  1. Dockerfile 작성
  2. 작성한 Dockerfile 이용해 이미지 빌드
  3. 빌드된 이미지를 Docker Hub에 업로드

첫 번째 단계에서 Dockerfile을 작성해야 한다고 하였으므로 Dockerfile이 무엇인지 먼저 알아보겠습니다. Dockerfile은 사용자가 직접 이미지를 제작할 수 있도록 Docker에서 제공하는 스크립트 문법입니다. 문법에 맞게 Dockerfile을 작성하고 빌드하면 Docker에서 사용할 수 있는 이미지가 생성됩니다. 이제 Dockerfile을 작성하기 위한 문법을 살펴보겠습니다.


Dockerfile 문법

먼저 Dockerfile이라는 이름의 빈 파일을 생성합니다.

touch Dockerfile

만들어진 Dockerfile에 필요한 내용들을 작성하면 됩니다. Dockerfile 또한 많은 명령어를 가지고 있지만 이번 글에서는 자주 사용하는 몇가지 명령어만 다루겠습니다.

FROM 명령어

FROM 명령어는 베이스 이미지를 지정하는 명령어입니다. 베이스 이미지란 운영 체제와 필요한 의존성 등을 포함한 기본 이미지를 말합니다.

여기서 운영 체제란 전체 OS를 의미하는 것이 아니고 애플리케이션을 실행하기 위해 필요한 최소한의 OS 구성요소를 뜻합니다. (커널은 호스트의 커널을 사용하기 때문에 이미지에 포함 할 필요가 없습니다.)

애플리케이션을 실행하기 위해서는 해당 애플리케이션과 호환되는 운영 체제가 필요하므로 베이스 이미지는 반드시 필요합니다.

Docker Hub에 업로드 되어 있는 모든 이미지들이 베이스 이미지 역할을 할 수 있지만 실행할 어플리케이션에 필요한 최소한의 의존성만을 만족하기 위해 ubuntu 이미지, alpine 이미지, 파이썬 이미지 등을 주로 이용합니다.

NGINX 컨테이너를 제작하려는데 필요하지 않은 파이썬 이미지를 사용하면 그만큼의 용량과 성능의 손해가 존재할 수 있기 때문에 제작하려는 컨테이너의 특성에 따라 적절한 베이스 이미지의 선정이 필요합니다.

베이스 이미지를 선정했다면 다음과 같은 형식으로 커스텀 이미지에서 사용할 베이스 이미지를 지정할 수 있습니다.

FROM <이미지명>:<태그>

위의 형식에서 <이미지명>은 사용할 베이스 이미지의 이름을, <태그>는 해당 이미지의 버전을 나타냅니다.

베이스 이미지가 준비되었다면, 이미지에 실행할 어플리케이션을 설치하고 설정하는 작업을 진행해야 합니다.


RUN 명령어

RUN 명령어는 Docker 이미지 내에서 명령을 실행하는 명령어입니다. 이를 통해 애플리케이션의 종속성 설치, 설정, 빌드 등의 작업을 수행할 수 있습니다. 다음과 같은 형식으로 사용합니다:

RUN <Shell 명령어>

RUN 명령어에는 Shell 명령어를 전달하며 Dockerfile이 빌드되는 시점에 이미지 내에서 실행됩니다.

예를 들어 ubuntu:latest 이미지를 베이스 이미지로 사용하는 경우 RUN apt-get install -y nginx를 실행하여 NGINX를 설치할 수 있습니다.

이는 베이스 이미지에 apt-get 명령어가 존재하기 때문입니다.

즉, 베이스 이미지에 이미 설치되어 있는 명령어를 사용할 수 있습니다.

하지만 RUN apk add nginx 명령은 설치가 이루어지지 않습니다.

이는 apk 명령어가 Alpine 리눅스의 패키지 관리자 명령어이기 때문에 Ubuntu에는 존재하지 않기 때문입니다.


COPY 명령어

COPY 명령어는 호스트에 존재하는 파일을 이미지 내부로 복사하는 명령어입니다. 이미지를 제작할 때 개발한 애플리케이션의 바이너리 파일, 설정 파일 등을 이미지 내에 복사해야 하는 경우 사용합니다.

형식은 다음과 같습니다.

COPY <호스트 파일 경로> <이미지 파일 경로>

예를 들어, 컨테이너의 NGINX가 직접 개발한 index.html 파일을 로딩하게 하고 싶다면 다음과 같이 작성할 수 있습니다.(index.html 파일은 Dockerfile과 같은 경로에 존재한다고 가정합니다)

COPY ./index.html /var/www/html/index.html

위 명령어는 호스트의 index.html 파일을 이미지의 /var/www/html/index.html 경로로 복사합니다.


CMD 명령어

CMD 명령어는 컨테이너의 시작점을 정의하는 명령어입니다. 즉, 컨테이너가 시작될 때 실행되어야 하는 프로세스를 지정합니다.

컨테이너 내에서 시작점으로 정의된 프로세스가 종료되거나 Foreground 프로세스가 존재하지 않으면 컨테이너가 종료됩니다. 따라서 컨테이너가 지속적으로 실행되어야 하는 경우에는 프로세스를 Foreground 모드로 지속적으로 실행시켜야 합니다.

CMD ["프로세스", "옵션", "매개변수", ...]

예를 들어, NGINX 컨테이너에서는 웹 서버를 실행하기 위해 nginx 명령어를 사용할 수 있습니다. CMD ["nginx", "-g", "daemon off;"]와 같이 작성하면 NGINX 웹 서버가 컨테이너 시작 시 자동으로 실행됩니다.

-g daemon off; 명령은 NGINX의 데몬 모드를 중지해 Foreground에서 동작하도록 하여 컨테이너의 중지를 막기 위한 명령입니다.


ENV 명령어

ENV 명령어는 환경 변수를 설정하는 명령어입니다. 환경 변수는 컨테이너 내에서 사용되는 변수로, 애플리케이션 설정, 구성 등에 사용됩니다.

리눅스에서의 export 명령과 같습니다.

ENV 명령은 다음과 같은 형식으로 사용합니다.

ENV <변수명> <값>

예를 들어, 애플리케이션에서 사용할 DB의 주소를 환경 변수로 설정하고자 한다면 다음과 같이 작성할 수 있습니다.

ENV DB_IP 192.168.0.2

EXPOSE 명령어

EXPOSE 명령어는 Docker 컨테이너가 공개할 포트를 지정하는 명령어입니다. 다른 컨테이너나 호스트의 외부에서 컨테이너 내부의 애플리케이션에 접근하기 위해서는 EXPOSE로 지정한 포트를 사용해야 합니다.

형식은 아래와 같습니다.

EXPOSE <포트번호>

예를 들어 NGINX 컨테이너가 8080포트를 통해 외부에서 접근 할 수 있게 하고싶다면 다음과 같이 작성할 수 있습니다.

EXPOSE 8080

8080 포트를 열어두어 외부에서 접근 할 수 있게 하겠다는 의미입니다.

EXPOSE 명령어는 컨테이너의 포트를 열기만 하기 때문에 호스트와의 포트 매핑은 별도로 수행해야 합니다.

docker run 명령어의 -p 옵션을 이용해 호스트와의 매핑을 처리 할 수 있습니다.

docker run의 자세한 사항은 이전 글에 정리해 두었습니다.


Dockerfile 작성 예시

위에서 소개한 명령어를 활용하여 ubuntu 이미지를 베이스로 한 NGINX 컨테이너를 제작해 보겠습니다.

# 베이스 이미지 정의
FROM ubuntu:latest

# NGINX 설치
RUN apt-get update && apt-get install -y nginx

# index.html 파일 복사
COPY ./index.html /var/www/html/index.html

# 컨테이너 실행 시 NGINX 서비스 시작
CMD ["nginx", "-g", "daemon off;"]

# 80 포트 개방
EXPOSE 80

위 예시에서는 다음과 같은 작업을 수행합니다.

  1. 베이스 이미지로 ubuntu:latest 사용
  2. RUN 명령어를 통해 apt-get update 및 apt-get install -y nginx를 실행하여 NGINX 설치
  3. COPY 명령어를 통해 호스트의 index.html 파일을 컨테이너의 /var/www/html/index.html 경로로 복사
  4. CMD 명령어를 통해 컨테이너 실행 시 NGINX를 시작
  5. EXPOSE 명령어를 통해 80 포트 개방

Docker 이미지 빌드

Dockerfile의 작성이 완료되었으므로 이를 이용해 이미지를 빌드하는 방법에 대해 알아보겠습니다.

이미지의 빌드 과정은 간단합니다.

  1. Dockerfile 디렉토리로 이동
  2. 빌드 명령을 이용해 이미지 빌드

아래 명령어를 사용하여 Docker 이미지를 빌드합니다. <이미지명>과 <태그>는 원하는 이미지의 이름과 버전으로 대체해야 합니다.

docker build -t <이미지명>:<태그> .

커스텀 이미지 실행

이미지의 빌드가 완료되었다면 실제로 어플리케이션이 정상 동작 하는지 테스트 해 보겠습니다.

docker run -p 80:80 <이미지명>:<태그>

docker run 명령을 이용해 포트를 매핑하고 이미지를 실행했습니다.

아래의 이미지와 같이 정상적인 NGINX 컨테이너가 실행 되고 있는 것을 볼 수 있습니다.

정상 실행
정상 실행

또한 80 포트를 이용해 컨테이너의 NGINX에 접속해 보면 작성한 index.html 파일이 정상적으로 로딩되는 것을 볼 수 있습니다.

index.html 화면
index.html 화면


Docker Hub에 업로드

Docker 이미지 빌드가 성공적으로 완료되었다면 아래 명령어를 사용하여 이미지를 Docker Hub에 업로드합니다. <이미지명>과 <태그>는 빌드한 이미지의 이름과 버전으로 대체해야 합니다.

이미지를 Docker Hub에 업로드 하기 위한 명령은 다음과 같습니다.

docker push <이미지명>:<태그>

결론

이번 글을 통해 Dockerfile 문법과 Docker 이미지 빌드 및 업로드 과정을 알아보았습니다. Dockerfile을 작성하여 커스텀 이미지를 생성하고, Docker Hub에 업로드하여 다른 사람들과 공유할 수 있습니다.

또한 Dockerfile의 다양한 명령어와 옵션을 활용하여 더 복잡한 이미지 빌드 프로세스를 구성할 수 있습니다. 예를 들어, 다중 단계 빌드를 사용하여 애플리케이션의 빌드와 배포를 분리하거나, 환경 변수를 동적으로 설정하는 등의 기능을 추가할 수 있습니다.

Dockerfile 공식 문서를 참고하면 더 심화된 Dockerfile 작성 방법을 확인할 수 있습니다.

Docker Hub와 커스텀 이미지를 적절히 활용하여 성능, 확장성, 편의성 등의 이점을 누리며 서버 운영을 할 수 있을 것 입니다.


Tags

#server#docker
Previous Article
BOJ 10814 나이순 정렬
kuper0201

kuper0201

안녕하세요!

Related Posts

Docker를 이용한 서버 구축 - Docker란 무엇인가?
Docker를 이용한 서버 구축 - Docker란 무엇인가?
2022-03-02
4 min

Quick Links

HomeAbout Me

Social Media