SW/리눅스

Linux : Dockerfile로 Docker Images 빌드 방법, 예제, 명령어

얇은생각 2021. 9. 8. 07:30
반응형

Docker 이미지는 애플리케이션과 애플리케이션을 실행하는 데 필요한 모든 것을 포함하는 Docker 컨테이너의 Blueprint입니다. 컨테이너는 이미지의 런타임 인스턴스입니다. 

Docker 파일이 무엇인지, Docker 파일을 사용하여 Docker 이미지를 작성하는 방법 및 Docker 파일을 사용하여 Docker 이미지를 작성하는 방법에 대해 설명합니다.

 

 

Linux : Dockerfile로 Docker Images 빌드 방법, 예제, 명령어

 

 

도커 파일이란 무엇입니까?

Docker 파일은 사용자가 명령줄에서 실행하여 이미지를 생성할 수 있는 모든 명령을 포함하는 텍스트 파일입니다. 여기에는 이미지를 구축하는 데 필요한 도커의 모든 지침이 포함됩니다. 

도커 이미지는 실행 가능한 소프트웨어 응용 프로그램을 구성하는 이미지의 도커 파일에 있는 지시사항을 나타내는 일련의 파일 시스템 레이어로 구성됩니다. 

Docker 파일은 다음 형식을 사용합니다.

# Comment
INSTRUCTION arguments

 

 

명령어는 대소문자를 구분하지 않지만 이름에 대문자를 사용하는 것이 규칙입니다.

다음은 가장 많이 사용되는 Docker 파일 지침 중 일부를 간략하게 설명하는 목록입니다.

ARG - 이 지침을 사용하면 빌드 시 전달할 수 있는 변수를 정의할 수 있습니다. 기본값을 설정할 수도 있습니다.

FROM - 새 이미지를 구축하기 위한 기본 이미지입니다. 이 지침은 Docker 파일에서 코멘트가 없는 첫 번째 지침이어야 합니다. 이 규칙의 유일한 예외는 FROM 인수에 변수를 사용하려는 경우입니다. 이 경우 FROM에는 하나 이상의 ARG 지침이 선행될 수 있습니다.

LABEL - 설명, 버전, 작성자 등 이미지에 메타데이터를 추가하는 데 사용됩니다. 둘 이상의 LABEL을 지정할 수 있으며, 각 LABEL 명령은 키-값 쌍입니다.

RUN - 이 지침에 지정된 명령은 빌드 프로세스 중에 실행됩니다. 각 RUN 명령은 현재 이미지 위에 새 레이어를 만듭니다.

ADD - 지정된 원본에서 도커 이미지의 지정된 대상으로 파일 및 디렉토리를 복사하는 데 사용됩니다. 원본은 로컬 파일, 디렉터리 또는 URL일 수 있습니다. 원본이 로컬 타르 아카이브인 경우 자동으로 Docker 이미지에 압축이 해제됩니다.

COPY -  ADD와 유사하지만 원본은 로컬 파일 또는 디렉터리만 사용할 수 있습니다.

ENV - 환경 변수를 정의할 수 있습니다.

CMD - 컨테이너를 실행할 때 실행할 명령을 지정하는 데 사용됩니다. Docker 파일에는 하나의 CMDB 명령만 사용할 수 있습니다.

ENTERTPOINT - CMDB와 유사하게 이 지침에서는 컨테이너를 실행할 때 실행할 명령을 정의합니다.

WORKDIR - 이 지시문은 RUN, CMDB, ENTERPOINT, COPY 및 ADD 지시사항에 대한 현재 작업 디렉토리를 설정합니다.

USER - 다음 실행, CMDB, 진입점, 복사 및 추가 지침을 실행할 때 사용할 사용자 이름 또는 UID를 설정합니다.

VOLUME - 컨테이너에 호스트 시스템 디렉토리를 마운트할 수 있습니다.

EXPERVE - 컨테이너가 런타임에 수신하는 포트를 지정하는 데 사용됩니다.

 

이미지에 추가할 파일 및 디렉터리를 제외하려면 컨텍스트 디렉터리에 .dockerignore 파일을 생성하십시오. .dockerignore의 구문은 Git의 .gitignore 파일의 구문과 유사합니다. 

Docker 파일 지침에 대한 전체 참조 및 자세한 설명은 Docker 파일 참조 페이지를 참조하십시오.

 

 

 

Docker 파일을 생성

Docker 이미지를 생성할 때 가장 일반적인 시나리오는 (일반적으로 Docker Hub에서) 레지스트리에서 기존 이미지를 꺼내고 기본 이미지에 대해 변경할 사항을 지정하는 것입니다. 도커 이미지를 생성할 때 가장 많이 사용되는 기본 이미지는 작고 RAM에서 실행되도록 최적화되었기 때문에 알파인입니다. 

Docker Hub는 Docker 이미지를 공용 또는 개인 리포지토리에 보관하는 데 사용되는 클라우드 기반 레지스트리 서비스입니다.

이 예에서는 Redis 서버에 대한 Docker 이미지를 생성합니다. 최신 ubuntu 18.04를 기본 이미지로 사용하겠습니다.

 먼저 Docker 파일과 모든 필요한 파일을 포함할 디렉토리를 생성합니다.

mkdir ~/redis_docker

 

 

디렉터리로 이동하여 다음 Docker 파일을 생성합니다.

cd ~/redis_docker
nano Dockerfile

 

 

# Dockerfile

FROM ubuntu:18.04

RUN apt-get update && \
    apt-get install -y redis-server && \
    apt-get clean

EXPOSE 6379

CMD ["redis-server", "--protected-mode no"]

 

 

도커 파일에 있는 각 행의 의미를 설명하겠습니다.

1번 라인에서는 기본 이미지를 정의하고 있습니다.

3번 라인에서 시작하는 RUN 명령은 apt 인덱스를 업데이트하고 "redis-server" 패키지를 설치하고 apt 캐시를 치료합니다. 지침에 사용된 명령은 Ubuntu 서버에 다시 설치하는 데 사용할 명령과 동일합니다.

EXPOSE 명령은 redis 서버가 수신하는 포트를 정의합니다.

마지막 줄에서는 CMDB 명령을 사용하여 컨테이너가 실행될 때 실행할 기본 명령을 설정하는 중입니다.

파일을 저장하고 편집기를 닫습니다.

 

 

 

이미지를 구축

다음 단계는 이미지를 만드는 것입니다. 이렇게 하려면 Docker 파일이 있는 디렉토리에서 다음 명령을 실행합니다.

옵션 -t는 이미지 이름과 선택적으로 'username/imagename:tag' 형식으로 사용자 이름과 태그를 지정합니다.

빌드 프로세스의 출력은 다음과 같습니다.

docker build -t jjeongil/redis .

# Sending build context to Docker daemon  3.584kB
# Step 1/4 : FROM ubuntu:18.04
#  ---> 7698f282e524
# Step 2/4 : RUN apt-get update &&     apt-get install -y gosu redis-server &&     apt-get clean
#  ---> Running in e80d4dd69263
# ...
# Removing intermediate container e80d4dd69263
#  ---> e19fb7653fca
# Step 3/4 : EXPOSE 6379
#  ---> Running in 8b2a45f457cc
# Removing intermediate container 8b2a45f457cc
#  ---> 13b92565c201
# Step 4/4 : CMD ["redis-server", "--protected-mode no"]
#  ---> Running in a67ec50c7048
# Removing intermediate container a67ec50c7048
#  ---> d8acc14d9b6b
# Successfully built d8acc14d9b6b
# Successfully tagged linuxize/redis:latest

 

 

빌드 프로세스가 완료되면 새 이미지가 이미지 목록에 나열됩니다.

docker image ls

# REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
# jjeongil/redis      latest              d8acc14d9b6b        4 minutes ago       100MB
# ubuntu              18.04               7698f282e524        5 days ago          69

 

 

이미지를 도커 허브로 밀어넣으려면 도커 컨테이너 이미지를 도커 허브로 밀어넣기를 참조하십시오.

 

 

 

컨테이너를 실행

이제 이미지가 생성되었으므로 다음을 실행하여 해당 이미지에서 컨테이너를 실행합니다.

docker run -d -p 6379:6379 --name redis jjeongil/redis

 

 

-d 옵션은 Docker에게 컨테이너를 분리 모드로 실행하도록 지시하고 -p 6379:6379 옵션은 포트 6379를 호스트 시스템에 게시하며 --name redis 옵션은 컨테이너 이름을 지정합니다. 마지막 인수 jjeongil/redis는 컨테이너 실행에 사용되는 이미지의 이름입니다.

컨테이너가 시작되면 다음 명령을 사용하여 실행 중인 모든 컨테이너를 나열합니다.

docker container ls

# CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                    NAMES
# 6b7d424cd915        linuxize/redis:v0.0.1   "redis-server '--pro…"   5 minutes ago

 

 

레디스 cli을 사용하여 도커 컨테이너에 연결하는 모든 작업이 제대로 작동하는지 확인하려면 다음을 수행합니다.

redis-cli ping

 

 

redis 서버는 PONG으로 응답해야 합니다.

반응형