Tech Note

도커를 활용한 서비스 배포하기 (Dockerfile) #8

Dominic-Kim 2022. 6. 27. 11:15
728x90
현재까지는 Docker Hub에서 제공하는 이미지를 pull하여 사용하였는데
누군가를 통해 완성된 이미지를 가져오는 것은 간편하고 유용한 기능들이 포함되어 있지만
직접 배포 및 운영을 해야하는 개발자의 경우 불필요한 프로세스는 제거해야 하고, 배포 용량에 대한 
고민도 충분히 필요하다. 지속적인 개발로 인해 컨테이너는 용량이 늘어나게 되고
어디서 문제가 발생했는지 확인하기가 힘들어지는데, 직접 이미지 설정이 어떻게 되어있는지 알고
개선 할 점을 찾기 위해서는 Dockerfile을 직접 작성해보는 게 도움이 될거라고 생각하고
이후 다루게 될 이미지 경량화의 이해를 위해서 정리를 하게 되었다.

Dockerfile?

  • Dockerfile은 Docker Image를 생성하기 위한 설정 파일이다.
  • Dockerfile에 기록된 명령어를 순차대로 입력하며 이미지를 생성합니다.

Dockerfile의 사용법

docker build 명령을 통해  Dockerfile을 build한다.

Dockerfile 내에 작성된 내용을 이미지에 포함시켜 생성하게 된다.

docker build .

 

Dockerfile 작성방법

레퍼런스에 설명이 되어 있으니, 본인이 가장 주로 사용 할 것 위주로 정리해려고 한다.

초심자의 경우 아래 몇가지만 사용하면 충분히 원하는 이미지를 만들어 낼 수 있을 것이다.

중급자 이상은 이 블로그를 볼 리가 없으니, 패스

Dockerfile에서 지원되는 환경변수는 아래와 같다.
  • FROM
    • 인터넷에 연결되어 있다면 Docker-hub를 통해 다양한 이미지를 받아오는 게 가능하다.
    • Dockerfile에서 주로 사용되는 이미지는 alpine(5mb 내외)의 경량화된 이미지로 보인다.
예) FROM alpine
  • LABEL
    • 생성될 이미지의 정보를 입력 할 수 있다.
예)
LABEL com.example.version="1.0.0-web-svr"
LABEL com.example.writer="Dominic Kim"
LABEL com.example.reg-date"2022-06-26"
  • VOLUME
  • RUN
    • 사실상 Dockerfile의 핵심 요소 중 하나라고 볼 수 있다.
    • 컨테이너 운영체제 내의 명령어를 입력 할 수 있다. ( yum install, yum update 등 )
    • RUN은 중복되어 사용 할 수 있으나, 여러줄로 분할 관리하는 것이 좋다. 단독으로 사용하는 경우 캐시 문제로 인해 이후 동작이 되지 않는 경우가 있다.
예) CENT OS 7 기준, 샘플이므로 따라하지마세요.
RUN yum update && yum install -y\
         net-tools \
         ssh \
         mongo \
   && yum clean packages  # 캐시된 패키지 정보를 모두 삭제
   && yum clean metadata  # 캐시된 XML 기반의 메타데이터를 삭제
   && yum clean dbcache   # 캐시된 모든 데이터베이스 파일을 삭제
   && yum clean all             # 사용하지 않는 불필요한 디스크 공간을 정리하고, 동시에 이전 커맨드와 같이 캐시된 모든 파일을 삭제
그 외 환경변수 값들
  • ADD
  • COPY
  • ENV
  • EXPOSE
  • STOPSIGNAL
  • USER
  • WORKDIR
  • ONBUILD

 

Dockerfile Build 실습

먼저 원하는 경로에 dockerfile 폴더를 생성해주고, Dockerfile을 확장자 없이 작성한다.

FROM centos:7

ENV container docker
MAINTAINER The CentOS Project <cloud-ops@centos.org>

RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;

VOLUME [ "/sys/fs/cgroup" ]

CMD ["/usr/sbin/init"]

 

 

블로그는 블로그일 뿐, 모든 내용은 해당 레퍼런스에 존재한다. 

https://docs.docker.com/engine/reference/builder/

 

Dockerfile reference

 

docs.docker.com