Dockerfile 사용법

choko's avatar
Jun 29, 2024
Dockerfile 사용법
 
 

dockerfile로 도커 필드

docker build . -t {{image_tag}}
 
 

DockerFile 기본 명령어

 

FROM

FROM <image>:<tag> FROM ubuntu:16.04
  • 베이스 이미지를 지정합니다.
    • 반드시 지정해야 하며 어떤 이미지도 베이스 이미지가 될 수 있다.
    • tag는 될 수 있으면 latest(기본값)보다 구체적인 버전(16.04 등)을 지정하는 것이 좋음
    • 이미 만들어진 다양한 베이스 이미지는 Docker hub에서 확인할 수 있다.
 

MAINTAINER

MAINTAINER <name> MAINTAINER subicura@subicura.com
  • Dockerfile을 관리하는 사람의 이름 또는 이메일 정보를 적습니다. 빌드에 딱히 영향을 주지는 않음
 

COPY

COPY source(도커 호스트 OS 파일) dest(이미지 내 위치) COPY . /usr/src/app
  • 파일이나 디렉토리를 이미지로 복사한다. 일반적으로 소스를 복사하는 데 사용한다. 
  • target디렉토리가 없다면 자동으로 생성
 

ADD

ADD source(로컬 파일) dest(이미지 내 위치) ADD . /usr/src/app
  • COPY명령어와 매우 유사하나 몇가지 추가 기능이 있다. src에 파일 대신 URL을 입력할 수 있고 src에 압축 파일을 입력하는 경우 자동으로 압축을 해제하면서 복사됨
 

RUN

RUN <command> RUN ["executable", "param1", "param2"] RUN bundle install
  • 새 레이어에 컨테이너 내의 명령을 실행하고, 그 결과를 새로운 이미지 레이어로 저장한다
  • 패키지 설치, 소프트웨어 설치, 파일 다운로드 등을 위해 사용됨
    • 내부적으로 /bin/sh -c 뒤에 명령어를 실행하는 방식.
 

CMD

CMD ["./bc-backend"]
  • Dockerfile에서 이미지를 빌드할 때 컨테이너가 시작될 때 실행되는 기본 명령을 정의
    • 여러 개의 CMD가 존재할 경우 가장 마지막 CMD만 실행된다
    • 한꺼번에 여러 개의 프로그램을 실행하고 싶은 경우에는 run.sh파일을 작성하여 데몬으로 실행하거나 supervisord나 forego와 같은 여러 개의 프로그램을 실행하는 프로그램을 사용함
 
 

WORKDIR

WORKDIR /path/to/workdir
RUN, CMD, ADD, COPY등이 이루어질 기본 디렉토리를 설정합니다. 각 명령어의 현재 디렉토리는 한 줄 한 줄마다 초기화되기 때문에 RUN cd /path를 하더라도 다음 명령어에선 다시 위치가 초기화 됩니다. 같은 디렉토리에서 계속 작업하기 위해서 WORKDIR을 사용합니다.
 

EXPOSE

EXPOSE <port> [<port>...] EXPOSE 4567
도커 컨테이너가 실행되었을 때 요청을 기다리고 있는(Listen) 포트를 지정합니다. 여러개의 포트를 지정할 수 있습니다.
 

VOLUME

VOLUME ["/data"]
컨테이너 외부에 파일시스템을 마운트 할 때 사용합니다. 반드시 지정하지 않아도 마운트 할 수 있지만, 기본적으로 지정하는 것이 좋습니다.
 

ENV

ENV <key> <value> ENV <key>=<value> ... ENV DB_URL mysql
컨테이너에서 사용할 환경변수를 지정합니다. 컨테이너를 실행할 때 -e옵션을 사용하면 기존 값을 오버라이딩 하게 됩니다.
 
 

사용 예시

  1. Dockerfile 생성
# 기본 이미지 선택 FROM golang:1.20-alpine # 작업 디렉토리 설정 WORKDIR /app # 필요한 파일 복사 COPY . . # Go 애플리케이션 빌드 RUN apk add --no-cache git openssh-client RUN go build -o myapp . # 애플리케이션 실행 명령어 CMD ["./myapp"]
 
  1. docker build
docker build -t go-board:v0 . --build-arg SSH_PRIVATE_KEY="$SSH_PRIVATE_KEY" # --build-arg : 환경변수 전달 (SSH_PRIVATE_KEY="$SSH_PRIVATE_KEY" 사용안함) # -t : 이미지 이름 지정 빌드
 
  1. docker run(로컬 실행)
docker run -p 8080:8080 go-board:v0
 
주의 - docker에서는 localhost나 127.0.0.1을 사용하면 컨테이너 내부의 포트로 인식하기 때문에, 대신 host.docker.internal 를 사용한다.
 
  1. docker hub에 업로드
    1. 이미지에 태그 추가
      1. docker tag go-board:v0 spspid/go-board:v0 #docker tag local-image:tag username/repository:tag
    2. 태그된 이미지 푸쉬
      1. docker push spspid/go-board:v0 #docker push username/repository:tag
       
 
Share article

Tom의 TIL 정리방