웹사이트 검색

Docker 설명: Dockerfile을 사용하여 이미지 빌드 자동화


상태: 더 이상 사용되지 않음

이 문서는 더 이상 사용되지 않으며 더 이상 유지 관리되지 않습니다.

이유

이 문서의 기술은 구식이며 더 이상 Docker 모범 사례를 반영하지 않을 수 있습니다.

대신 보기

  • Docker 생태계: 공통 구성요소 소개
  • Dockerfile 참조
  • Dockerfile 작성 모범 사례

소개

Docker 컨테이너는 기본 이미지를 사용하여 생성됩니다. 이미지는 운영 체제 기본 사항만을 포함하는 기본 이미지이거나 시작할 준비가 된 정교한 사전 구축 애플리케이션 스택으로 구성될 수 있습니다.

Docker를 사용하여 이미지를 빌드할 때 수행되는 각 작업(즉, apt-get install과 같이 실행되는 명령)은 이전 레이어 위에 새 레이어를 형성합니다. 그런 다음 이러한 기본 이미지를 사용하여 새 컨테이너를 만들 수 있습니다.

이 DigitalOcean 기사에서는 이 프로세스를 최대한 자동화하는 방법을 살펴보고 Dockerfiles를 통해 Docker와 컨테이너를 최대한 활용하는 모범 사례와 방법을 보여줍니다. 기본 이미지에서 자동으로 단계별, 레이어별로.

용어 사전

1. 도커 개요

2. 도커파일

3. Dockerfile 구문

  1. 구문이란 무엇입니까?
  2. Dockerfile 구문 예

4. Dockerfile 명령

  1. 추가
  2. CMD
  3. 엔트리포인트
  4. ENV
  5. 노출
  6. 에서
  7. 관리자
  8. 실행
  9. 사용자
  10. 볼륨
  11. WORKDIR

5. Dockerfile 사용 방법

6. Dockerfile 예제: MongoDB를 설치하기 위한 이미지 생성

  1. 빈 Dockerfile 만들기
  2. 파일 및 용도 정의
  3. 사용할 기본 이미지 설정
  4. 유지 관리자 정의(저자)
  5. 응용 프로그램 저장소 목록 업데이트
  6. MongoDB 다운로드를 위한 인수 및 명령 설정
  7. MongoDB의 기본 포트 설정
  8. Dockerfile 저장
  9. 첫 번째 이미지 구축
  10. MongoDB 인스턴스 실행

도커 개요

Docker 프로젝트는 일부 Linux 커널 기능 위에 구축된 함께 작동하는 상위 수준 도구를 제공합니다. 목표는 개발자와 시스템 관리자가 모든 종속성과 함께 응용 프로그램을 포팅하고 시스템과 시스템에서 두통 없이 실행되도록 돕는 것입니다.

Docker는 "Docker 컨테이너”라고 하는 애플리케이션을 위한 안전한 LXC 기반(예: Linux 컨테이너) 환경을 생성하여 이를 달성합니다. 이러한 컨테이너는 Docker 이미지를 사용하여 생성되며, 명령을 수동으로 실행하거나 Dockerfile을 통해 자동으로.

참고: Docker 및 해당 부분(예: Docker 데몬, CLI, 이미지 등)에 대해 자세히 알아보려면 프로젝트 소개 문서인 Ubuntu 16.04에서 Docker를 설치하고 사용하는 방법을 확인하십시오.

도커파일

각 Dockerfile은 새 이미지를 생성(또는 형성)하기 위해 기본 이미지에 대한 작업을 자동으로 수행하기 위해 연속적으로 나열된 다양한 명령(지침) 및 인수로 구성된 스크립트입니다. 사물을 구성하는 데 사용되며 처음부터 끝까지 프로세스를 단순화하여 배포에 크게 도움이 됩니다.

Dockerfile은 빌드 프로세스가 시작되는 이미지를 정의하는 것으로 시작합니다. 그 대가로 다양한 다른 방법, 명령 및 인수(또는 조건)가 뒤따르면 도커 컨테이너를 만드는 데 사용할 새 이미지를 제공합니다.

다양한 방법으로 Dockerfile의 콘텐츠를 docker 데몬에 제공하여 이미지를 빌드함으로써 사용할 수 있습니다(사용 방법 섹션에서 설명).

Dockerfile 구문

Dockerfile에 대해 이야기하기 전에 구문과 이것이 실제로 의미하는 바를 빠르게 살펴보겠습니다.

구문이란 무엇입니까?

간단히 말해서 프로그래밍의 구문은 명령, 인수 및 절차(예: 함수/명령 모음)를 수행하기 위해 응용 프로그램을 프로그래밍하는 데 필요한 모든 것을 주문하는 구조를 의미합니다.

이러한 구조는 명확하고 명시적으로 정의된 규칙을 기반으로 하며 프로그래머는 이를 사용하거나 예상하는 컴퓨터 응용 프로그램(예: 인터프리터, 데몬 등)과 인터페이스하기 위해 따라야 합니다. 스크립트(즉, 수행할 일련의 작업을 포함하는 파일)가 올바르게 구조화되지 않은 경우(즉, 잘못된 구문) 컴퓨터 프로그램은 스크립트를 구문 분석할 수 없습니다. 대략적인 구문 분석은 의미를 이해하는 최종 목표로 입력을 검토하는 것으로 이해할 수 있습니다.

Dockerfile은 간단하고 깨끗하며 명확한 구문을 사용하므로 생성 및 사용이 매우 쉽습니다. 그들은 특히 훌륭하고 적절하게 작성된 응용 프로그램 소스 코드처럼 주석을 달 수 있기 때문에 자명하도록 설계되었습니다.

Dockerfile 구문 예

Dockerfile 구문은 주석과 명령 + 인수의 두 가지 기본 라인 블록으로 구성됩니다.

# Line blocks used for commenting
command argument argument ..

간단한 예:

# Print "Hello docker!"
RUN echo "Hello docker!"

Dockerfile 명령(지침)

현재 Dockerfile에 Docker가 이미지를 빌드하도록 포함할 수 있는 약 12가지의 다양한 명령 세트가 있습니다. 이 섹션에서는 Dockerfile 예제를 작업하기 전에 모든 항목을 개별적으로 살펴보겠습니다.

참고: 이전 섹션(Dockerfile 구문)에서 설명한 대로 이러한 모든 명령은 단일 일반 텍스트 파일(예: Dockerfile) 내에서 수행(예: 실행)하려는 순서대로 연속적으로 나열(예: 작성)되어야 합니다. 이미지를 빌드하는 docker 데몬. 그러나 이러한 명령 중 일부(예: MAINTAINER)는 실행을 구성하는 것이 아니라 정의 값(즉, 일부 추가 정보).

추가하다

ADD 명령은 소스와 대상이라는 두 가지 인수를 가져옵니다. 기본적으로 호스트의 소스에서 설정된 대상의 컨테이너 자체 파일 시스템으로 파일을 복사합니다. 그러나 소스가 URL(예: http://github.com/user/file/)인 경우 URL의 내용이 다운로드되어 대상에 배치됩니다.

예:

# Usage: ADD [source directory or URL] [destination directory]
ADD /my_app_folder /my_app_folder

CMD

RUN과 유사한 명령 CMD는 특정 명령을 실행하는 데 사용할 수 있습니다. 그러나 RUN과 달리 빌드 중에는 실행되지 않고 빌드 중인 이미지를 사용하여 컨테이너가 인스턴스화될 때 실행됩니다. 따라서 이미지를 기반으로 컨테이너 생성과 함께 실행(즉, 실행)되는 초기 기본 명령으로 간주해야 합니다.

명확히 하기 위해: CMD의 예는 이미지 내에서 RUN(예: RUN apt-get install …)을 사용하여 이미 설치된 컨테이너 생성 시 애플리케이션을 실행하는 것입니다. CMD로 설정된 이 기본 애플리케이션 실행 명령은 기본값이 되며 생성 중에 전달되는 모든 명령을 대체합니다.

예:

# Usage 1: CMD application "argument", "argument", ..
CMD "echo" "Hello docker!"

진입 지점

ENTRYPOINT 인수는 이미지를 사용하여 컨테이너가 생성될 때마다 사용되는 구체적인 기본 애플리케이션을 설정합니다. 예를 들어 이미지 내에 특정 애플리케이션을 설치하고 이 이미지를 사용하여 해당 애플리케이션만 실행하는 경우 ENTRYPOINT로 명시할 수 있으며 해당 이미지에서 컨테이너가 생성될 때마다 애플리케이션이 대상이 됩니다.

ENTRYPOINT와 CMD를 결합하면 CMD에서 \응용 프로그램\을 제거하고 ENTRYPOINT로 전달될 \인수\만 남길 수 있습니다.

예:

# Usage: ENTRYPOINT application "argument", "argument", ..
# Remember: arguments are optional. They can be provided by CMD
#           or during the creation of a container.
ENTRYPOINT echo

# Usage example with CMD:
# Arguments set with CMD can be overridden during *run*
CMD "Hello docker!"
ENTRYPOINT echo  

ENV

ENV 명령은 환경 변수(하나 이상)를 설정하는 데 사용됩니다. 이러한 변수는 스크립트와 응용 프로그램 모두에서 컨테이너 내에서 액세스할 수 있는 "키 값\ 쌍으로 구성됩니다. Docker의 이 기능은 프로그램 실행에 엄청난 유연성을 제공합니다.

예:

# Usage: ENV key value
ENV SERVER_WORKS 4

폭로하다

EXPOSE 명령은 지정된 포트를 연결하여 컨테이너 내부에서 실행 중인 프로세스와 외부 세계(즉, 호스트) 간의 네트워킹을 활성화하는 데 사용됩니다.

예:

# Usage: EXPOSE [port]
EXPOSE 8080

Docker 네트워킹에 대해 알아보려면 Docker 컨테이너 네트워킹 설명서를 확인하십시오.

에서

FROM 지시어는 아마도 Dockerfile의 다른 모든 지시어 중에서 가장 중요할 것입니다. 빌드 프로세스를 시작하는 데 사용할 기본 이미지를 정의합니다. 이전에 만든 이미지를 포함하여 모든 이미지가 될 수 있습니다. 호스트에서 FROM 이미지를 찾을 수 없는 경우 Docker는 Docker Hub 또는 다른 컨테이너 리포지토리에서 해당 이미지를 찾고 다운로드하려고 시도합니다. Dockerfile 내에서 선언된 첫 번째 명령이어야 합니다.

예:

# Usage: FROM [image name]
FROM ubuntu

정비사

파일의 어느 곳에서나 설정할 수 있는 명령 중 하나는 MAINTAINER입니다. 이 비실행 명령은 작성자를 선언하므로 이미지의 작성자 필드를 설정합니다. 그럼에도 불구하고 FROM 뒤에 와야 합니다.

예:

# Usage: MAINTAINER [name]
MAINTAINER authors_name

달리다

RUN 명령은 Dockerfile의 중앙 실행 지시문입니다. 명령을 인수로 사용하고 실행하여 이미지를 형성합니다. CMD와 달리 실제로 이미지를 빌드하는 데 사용됩니다(커밋된 이전 레이어 위에 다른 레이어 형성).

예:

# Usage: RUN [command]
RUN aptitude install -y riak

사용자

USER 지시문은 빌드 중인 이미지를 기반으로 컨테이너를 실행할 UID(또는 사용자 이름)를 설정하는 데 사용됩니다.

예:

# Usage: USER [UID]
USER 751

용량

VOLUME 명령은 컨테이너에서 호스트 머신의 디렉터리로의 액세스를 활성화하는 데 사용됩니다(예: 마운트).

예:

# Usage: VOLUME ["/dir_1", "/dir_2" ..]
VOLUME ["/my_files"]

WORKDIR

WORKDIR 지시문은 CMD로 정의된 명령이 실행될 위치를 설정하는 데 사용됩니다.

예:

# Usage: WORKDIR /path
WORKDIR ~/

Dockerfile 사용 방법

Dockerfiles를 사용하는 것은 Docker 데몬을 실행하는 것만큼 간단합니다. 스크립트 실행 후 출력은 새 도커 이미지의 ID가 됩니다.

용법:

# Build an image using the Dockerfile at current location
# Example: docker build -t [name] .
docker build -t my_mongodb .    

Dockerfile 예제: MongoDB를 설치할 이미지 생성

Dockerfiles에 대한 이 마지막 섹션에서는 Dockerfile 문서를 만들고 MongoDB 컨테이너를 실행하기 위한 docker 이미지를 만드는 데 사용할 수 있는 Dockerfile이 있는 최종 결과로 단계별로 채웁니다.

참고: Dockerfile 편집을 시작한 후 아래 섹션의 모든 콘텐츠와 인수는 Docker 구문 섹션의 예제와 설명에 따라 그 안에 연속적으로 작성(추가)됩니다. 이 연습의 최신 섹션에서 최종 결과가 어떻게 표시되는지 확인할 수 있습니다.

빈 Dockerfile 만들기

nano 텍스트 편집기를 사용하여 Dockerfile 편집을 시작하겠습니다.

nano Dockerfile

파일 및 목적 정의

선택 사항이기는 하지만 자신과 모든 사람이 (필요한 경우) 이 파일이 무엇인지, 무엇을 하려는지 파악하도록 하는 것은 항상 좋은 습관입니다. 이를 위해 Dockerfile을 멋진 주석(#)으로 시작하여 설명합니다.

############################################################
# Dockerfile to build MongoDB container images
# Based on Ubuntu
############################################################

사용할 기본 이미지 설정

# Set the base image to Ubuntu
FROM ubuntu

메인테이너 정의하기 (저자)

# File Author / Maintainer
MAINTAINER Example McAuthor

MongoDB 다운로드를 위한 인수 및 명령 설정

################## BEGIN INSTALLATION ######################
# Install MongoDB Following the Instructions at MongoDB Docs
# Ref: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/

# Add the package verification key
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

# Add MongoDB to the repository sources list
RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/mongodb.list

# Update the repository sources list
RUN apt-get update

# Install MongoDB package (.deb)
RUN apt-get install -y mongodb-10gen

# Create the default data directory
RUN mkdir -p /data/db

##################### INSTALLATION END #####################

MongoDB의 기본 포트 설정

# Expose the default port
EXPOSE 27017

# Default port to execute the entrypoint (MongoDB)
CMD ["--port 27017"]

# Set default container command
ENTRYPOINT usr/bin/mongod

Dockerfile 저장

모든 것을 파일에 추가한 후에는 저장하고 종료할 차례입니다. CTRL+X를 누른 다음 Y를 눌러 Dockerfile을 확인하고 저장합니다.

최종 파일은 다음과 같습니다.

############################################################
# Dockerfile to build MongoDB container images
# Based on Ubuntu
############################################################

# Set the base image to Ubuntu
FROM ubuntu

# File Author / Maintainer
MAINTAINER Example McAuthor

################## BEGIN INSTALLATION ######################
# Install MongoDB Following the Instructions at MongoDB Docs
# Ref: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/

# Add the package verification key
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

# Add MongoDB to the repository sources list
RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/mongodb.list

# Update the repository sources list
RUN apt-get update

# Install MongoDB package (.deb)
RUN apt-get install -y mongodb-10gen

# Create the default data directory
RUN mkdir -p /data/db

##################### INSTALLATION END #####################

# Expose the default port
EXPOSE 27017

# Default port to execute the entrypoint (MongoDB)
CMD ["--port 27017"]

# Set default container command
ENTRYPOINT usr/bin/mongod

첫 번째 이미지 구축

이전의 설명을 사용하여 docker로 첫 번째 MongoDB 이미지를 만들 준비가 되었습니다!

docker build -t my_mongodb .

참고: 여기서 -t [name] 플래그는 이미지에 태그를 지정하는 데 사용됩니다. 빌드 중에 수행할 수 있는 다른 작업에 대해 자세히 알아보려면 docker build --help를 실행하세요.

MongoDB 인스턴스 실행

빌드한 이미지를 사용하여 이제 최종 단계로 진행할 수 있습니다. 선택한 이름(원하는 경우 -name [이름] 사용)을 사용하여 내부에서 MongoDB 인스턴스를 실행하는 컨테이너를 생성합니다.

docker run -name my_first_mdb_instance -i -t my_mongodb

참고: 이름이 설정되지 않은 경우 docker ps -l을 사용하여 모든 컨테이너를 나열하여 얻을 수 있는 복잡한 영숫자 ID를 처리해야 합니다.

참고: 컨테이너에서 자신을 분리하려면 이스케이프 시퀀스 CTRL+P 다음에 CTRL+Q를 사용하십시오.

즐기다!

제출자: