ComputerScience/Docker

[Docker] 10. Dockerfile을 사용한 구성 관리

kyungmin.yu 2019. 5. 14. 20:41

Dockerfile 이란?

이전에는 명령을 이용한Docker 이미지 작성을 했다면, Dockerfile을 이용하는 방법은 베이스가 되는 Docker 이미지를 바탕으로 Docker 컨테이너를 생성하고, 생성한 Docker 컨테이너 안에서 OS의 설정이나 미들웨어의 설치, 파라미터의 수정들을 수동으로 수행하고 만들어진 컨테이너에서 서버를 구축한 상태를 바탕으로 Docker 이미지를 생성함.

 

이를 위해서는 아래와 같은 정보를 인프라 설계서나 파라미터 시트 등에 별도로 남겨두어야 함

    -베이스가 될 Docker이미지

    -Docker 컨테이너 안에서 수행한 조작 명령

    -환경변수 등의 설정

    -Docker 컨테이너 안에서 작동시켜 둘 데몬 생성

 

Dockerfile은 이처럼 Docker 상에서 작동시킬 컨테이너의 구성 정보를 기술하기 위한 파일임

 

Dockerfile 기본 구문

Dockerfile은 텍스트 형식의 파일로, 에디터 등을 이용하여 작성함

확장자는 따로 필요 없으며, ‘Dockerfile이라는 이름의 파일에 인프라 구성 정보를 기술하며, Dockerfile 이외의 파일 명으로도 작동하지만, 이 때는 Dockerfile에서 이미지를 빌드할 때 파일명을 명시적으로 지정해야 함

Dockerfile은 아래와 같은 구문을 사용함

명령 인수

    Dockerfile의 명령

    

    FROM: 베이스 이미지 지정

    RUN: 명령실행

    CMD: 컨테이너 실행명령

    ENTRYPOINT: 컨테이너 실행명령

    (CMDENTRYPOINT는 컨테이너가 생성될 때 실행되는 것은 동일하지만 docker run에서 동작 방식이 다름,

    docker run 명령에서 실행할 파일을 설정하면 CMD무시됨)

    LABEL: 라벨 설정

    EXPOSE: 포트 익스포트(노출시킬 포트 설정)

    ENV: 환경변수

    ADD: 파일/디렉토리 추가 

    COPY: 파일복사

    VOLUME: 볼륨마운트    

    USER: 사용자 지정

    WORKDIR: 작업 디렉토리

    ARG: Dockerfile 안의 변수

    ONBUILD: 빌드 완료 후 실행되는 명령

    STOPSIGNAL: 시스템 콜 시그널 설정

    HEALTHCHECK: 컨테이너의 헬스체크

    SHELL: 기본 쉘 설정

 

Dockerfile 작성

Dockerfile에서는 ‘Docker 컨테이너를 어떤 Docker 이미지로부터 생성할지라는 정보를 반드시 기술해야 함

이 이미지를 베이스 이미지라고 함. 베이스 이미지는 아래와 같은 서식으로 기술함

FROM [이미지명]
FROM [이미지명]:[태그명]
FROM [이미지명]@[다이제스트]

 

Dockerfile로부터 Docker 이미지 만들기

Dockerfile로부터 이미지를 생성하려면 아래와 같은 docker build명령을 사용함

docker build –t [생성 할 이미지명]:[태그명] [Dockerfile의 위치]
docker build –t [생성 할 이미지명]:[태그명] -f [Dockerfile 명] [Dockerfile의 위치]

 

Docker의 이미지 레이어 구조

Dockerfile을 빌드하여 Docker 이미지를 작성하면 Dockerfile명령별로 이미지를 작성함

작성된 여러 개의 이미지는 레이어 구조를 가지고 있음

예를 들어 다음 4개의 명령으로 구성된 Dockerfile로부터 이미지를 작성하는 경우

# Step1: ubuntu(base image)
FROM ubuntu:latest

# Step2: install nginx
RUN apt-get update && apt-get install -y -q nginx

# Step3: file copy
COPY index.html /usr/share/nginx/html/

# Step4: start nginx
CMD ["nginx", "-g", "daemon off;"]

아래와 같은 결과를 볼 수 있고 로그를 확인하면 Dockerfile의 명령 한 줄마다 이미지가 작성되는 것을 알 수 있음

dockerfile build result

빌드 결과 이미지의 레이어 구조는 아래와 같음

 

이미지 레이어 구조

마지막 이미지를 만들기 위해 3개의 추가적인 이미지를 더 만들게 되는 것을 볼 수 있음

이 이미지들은 다음 빌드에서 재사용 될 수도 아닐 수 도 있음

 

2019.05.16

이거 왜 따로 집어넣은 index.html이 안보여지나 했는데 nginx의 html 경로가 저 위치가 아니어서 발생했던 문제였음

/usr/share/nginx/html이 아니라 /var/www/nginx/html로 사용할 html 파일들을 옯겨야 사용이 가능함