[docker] 완벽가이드 책 리뷰 10일차

오현우·2022년 7월 22일
0

docker

목록 보기
10/11
post-thumbnail

DockerFile을 통한 이미지 빌드하기

도커 컨테이너를 cli 환경에서 차근차근 빌드해갈 수 있지만 해당 방법은 일관되지 못하다.

구체적으로 우리가 전체적인 환경 세팅에 대해서는 알고 있어도 구체적인 의존관계 그리고 설치해야 하는 순서를 기억하는 것은 솔직히 어렵다.

또한 도커의 일관된 환경조성과도 맞지 않는 부분이라고 생각한다.

이러한 문제를 해결하기 위한 방법론이 도커 파일을 통한 컨테이너 빌드이다.

DockerFile: 인프라 구성을 기술한 파일

  • 베이스가 될 도커 이미지
  • 도커 컨테이너 안에서 수행한 조작
  • 환경변수 등의 설정
  • 도커 컨테이너 안에서 작동시켜줄 데몬 실행

도커파일에 쓰이는 명령어를 구체적으로 명시하지는 않겠지만 해당 내용들을 참조할 수 있는 링크들을 아래쪽에 남겨 두겠다.

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

그럼에도 불구하고 알아야 하는 명령어는 조금만 써놓겠다.

간단한 명령어

FROM : 생성할 이미지
RUN : 내부에서 실행하는 명령
ADD : 파일을 추가, 파일은 Dockerfile이 위치한 디렉토리에서 가져옴
WORKDIR : 워킹 디렉토리 이동
EXPOSE : Dockerfile의 빌드로 생성된 이미지에서 열어줄 포트
CMD : 컨테이너 실행시 실행할 명령

주석은 # 로 가능하다.

도커파일로 이미지 빌드하기

docker build -t [which i will make image]:[tag] [docker file location]

간단하게 실습

mkdir sample && cd $_
touch DockerFile
nano DockerFile 을 통해 해당 내용을 다음과 같이 서술해주자.

FROM centos:centos7

docker build -t sample:1.0 location_dockerfile

바보같이 도커 데몬을 실행시키지 않았다. 도커 데몬을 실행시키자.!

정상적으로 빌드가 되었다.

해당 이미지의 리스트를 확인해보자.

docker imamge ls

확인하고 모두 다시 지워주자.

docker system prune --all

Docker Image 레이어 구조

도커는 도커파일에 지정된 명령별로 이미지를 만든다.

때문에 명령어가 여러줄이면 여러개의 이미지를 겹쳐서 하나의 이미지를 만드는 것이다.

즉 크레페 케이크를 생각하면 편하다.

기본 이미지를 바탕으로 하나하나 쌓아나가면서 하나의 이미지를 만든다.

# 우분투 베이스 이미지
FROM ubuntu:latest

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

# 파일 복사
COPY index.html /usr/share/nginx/html/

# 엔진엑스 시작
CMD ["nginx", "-g", "daemon off;"]

위의 도커파일 대로 진행하면 4개의 이미지가 생긴다.

위의 특성을 이용하여 다양한 이미지를 도커허브에서 기존이미지를 바탕으로 다양한 이미지를 만들 수 있다.

각종 옵션에 대한 정보는 아래에서 확인이 가능하다.

https://docs.docker.com/engine/reference/commandline/build/

베이스 이미지에 레이어 쌓기

베이스 이미지에 다양한 미들웨어 어플리케이션을 설치하기 위해서는 우리는 RUN 명령어를 사용한다.

RUN 명령어 사용법 2가지를 구분하자.

  • SHELL 형식
    RUN apt-get install -y nginx 처럼 직접적으로 쉘에 입력할 때 쓰는 방법이다.

-Exec 형식
쉘을 경유하지 않고 직접 실행한다. 때문에 명령 인수에 환경변수를 지정할 수 없다. 또한 명령은 json 배열로 지정한다.
또한 기본쉘이 아닌 다른 쉘을 이용할 때 사용한다.

RUN ["/bin/bash", "-c", "apt-get install -y nginx"]

대부분 기본 쉘을 사용하지만 그 외의 경우 exec 를 사용하는 것이 좋다.

이미지 레이어를 줄이는 법

엄청나게 중요한 작업이 아니고 기본 미들웨어 설치나 간단한 것들중 반복되는 녀석들은 한번에 기술하는 것이 오버헤드를 줄인다.

구체적으로

RUN apt-get install -y nginx
RUN apt-get install -y php
RUN apt-get install -y httpd
RUN apt-get install -y php-pear

의 경우 모두 이미지가 생성되지만 아래와 같이 기술하면 한번의 이미지만 생성된다.

RUN apt-get install -y\
			nginx\
            php\
            httpd\
            php-pear

컨테이너 데몬 실행시키기

CMD

CMD 명령을 통해 이미지를 바탕으로 생성된 컨테이너 안에서 명령을 실행시킨다. 여러개면 마지막만 유효. RUN 과 유사하지만 이미지 작성을 위해 실행되는 것이 아닌 컨테이너 안에서 작동하는 명령어이다.

  • EXEC 형식
    CMD ["nginx", "-g", "daemon off";]

  • SHELL 형식
    CMD nginx -g 'daemon off;'

# base image
FROM ubuntu:18.04

# nginx install
RUN apt-get update &&\
	apt-get install -y upgrade &&\
    apt-get install -y nginx

# expose port 
EXPOSE 80

# RUN SERVER
CMD nginx -g "daemon off;"
  • ENTRY POINT 명령의 파라미터 형식의 인수

ENTRYPOINT

  • Exec 형식
  • Shell 형식
# 베이스 이미지 선택
FROM ubuntu:18.04

# top 실행
ENTRYPOINT ["top"]
CMD ["-d", "10"]

docker container run -it sample : 위의 엔트리 포인트를 실행하고 cmd로 지정한 아규먼트를 디폴트로 실행
docker coninaer run -it sample -d 2: 엔트리 포인트를 사용하지만 세부 아규먼트를 직접적으로 지정하여 cmd 아규먼트들을 사용하지 않는다.

Onbuild

우리는 도커파일을 기반으로 작성된 이미지 위에 실행하고 싶은 명령어가 있을 것이다.

구체적으로 아래의 예시를 보자

우리는 엔진엑스를 바탕으로 웹 페이지를 구성하고 싶다.

그러면 엔진엑스 기반의 이미지를 만들고 해당 이미지를 바탕으로 웹 컨텐츠를 전개한다고 가정하자.

그러면 총 도커 파일을 2개 만들어서 2번의 이미지 생성과정을 거쳐야 한다.

그러한 귀찮은 과정을 온빌드를 통해 없앨 수 있다.

# base image
FROM ubuntu:18.04

# nginx install
RUN apt-get update &&\
	apt-get install -y upgrade &&\
    apt-get install -y nginx

# expose port 
EXPOSE 80

# web contents 
ONBUILD ADD website.tar /var/www/html/

# RUN SERVER
CMD nginx -g "daemon off;"

profile
핵심은 같게, 생각은 다르게

0개의 댓글