본문 바로가기

Computer/Docker

Dockerfile (1) - 개요

반응형

Docker에서는 인프라의 구성 관리를 Dockerfile 로 기술합니다. Dockerfile 에는 베이스가 되는 이미지에 각종 미들웨어와 애플리케이션의 실행 기반의 모든 구성 정보를 기술합니다. 지난 포스트에서는 생성된 기존 이미지에 컨테이너 생성 시의 설정을 수동으로 수행하였으나 이를 dockerfile에 종합적으로 기술하여 관리할 수 있습니다. Dockerfile 에는 다음과 같은 컨테이너의 구성 정보를 담을 수 있습니다.

  • 베이스가 될 Docker 이미지
  • Docker 컨테이너 안에서 수행할 명령
  • 환경변수 등의 설정

Dockerfile 

Dockerfile은 텍스트 형식의 파일로 임의의 에디터를 사용하여 작성할 수 있습니다. 가장 먼저 기술되어야 할 내용은 docker 컨테이너를 어떤 도커 이미지로부터 생성할지 에 대한 정보로 FROM [이미지명]:[태그명] 명령으로 기술합니다. 예를 들어 CentOS의 버전 7을 베이스 이미지로 지정할 때는 다음과 같고 태그명이 생략되면 베이스 이미지의 최신 버전으로 centos:latest 가 이미지 이름이 됩니다.

FROM centos:centos7

 

Dockerfile build

Dockerfile을 빌드하면 Dockerfile에 정의된 구성을 바탕으로 한 도커 이미지를 생성합니다.

docker build -t [생설할 이미지명]:[태그명] [Dockerfile 위치]

 

FROM centos:centos7 로 구성된 dockerfile을 빌드하고 'docker image ls' 명령어를 통해 sample:1.0 이라는 이미지가 생성된 것을 확인할 수 있습니다.

또한 베이스 이미지가 이미 로컬에 저장되어 있을 경우 다시 다운받지 않으므로 이미지를 바로 작성할 수 있습니다. 이때, 만들어진 sample:2.0 의 이미지 ID와 기존 sample:1.0 의 이미지 ID가 똑같고 같은 실체를 가진 동일한 이미지입니다.


다음과 같이 리눅스 표준 입력 리다이렉션을 통해 dockerfile을 빌드할 수도 있습니다. 이때, dockerfile의 내용이 docker build 명령어의 인수로 전달되므로 표준 입력 (<) 앞에 하이픈을 (-) 지정합니다.

이러한 경우에는 빌드에 필요한 파일을 포함시킬 수 없기 때문에 다른 파일과 dockerfile을 tar 압축한 파일로부터 이미지를 빌드합니다.

 

Docker 이미지의 레이어 구조

Dockerfile을 빌드하여 도커 이미지를 작성하면 dockerfile 명령별로 이미지를 작성합니다. 다음 4개의 명령으로 되어 있는 dockerfile의 내용은 각 스텝 별로 실행됩니다.

  • STEP 1: 베이스이미지
    FROM ubuntu:latest
  • STEP 2: Nginx 설치
    RUN apt-get update && apt-get install -y -q nginx
  • STEP 3: 파일 복사
    COPY index.html /usr/share/nginx/html
  • STEP 4: Nginx 실행
    CMD ['nginx', '-g', 'daemon off;']

각 명령마다 개별적인 이미지 ID를 부여받아 생성되는 것을 볼 수 있습니다. 또한, 작성한 이미지는 다른 이미지와 공유됩니다. 예를 들어 공통된 우분투 베이스 이미지를 사용한다고 했을 때 베이스 이미지 레이어가 공유됩니다. 따라서 모든 이미지를 다 가지고 있기에는 디스크 용량에 한계가 있기에 도커에서는 이미지를 레이어로 겹쳐서 작성함으로써 공통되는 이미지를 공유하여 디스크의 용량을 효율적으로 이용합니다.

 


Dockerfile (2) - RUN, CMD, ENTRYPOINT

 

반응형

'Computer > Docker' 카테고리의 다른 글

Dockerfile (2) - RUN, CMD, ENTRYPOINT  (1) 2021.04.30
Docker container 실행 - docker run (2)  (0) 2021.04.14
Docker container 실행 - docker run (1)  (2) 2021.04.13
Docker 이미지 커맨드  (0) 2021.04.03
Docker의 작동 구조  (0) 2021.03.27