base 이미지를 지정
Docker Hub에서 이미지 검색이 가능함.
FROM 이미지
FROM 이미지:태그
# Ubuntu 최신 버전을 base 이미지로 지정
FROM ubuntu:lastest
명령어를 실행할 작업 디렉터리를 지정
(만약 디렉터리가 없다면, 생성하고 작업을 진행)
WORKDIR 명령문은 cd 명령문처럼 컨테이너 상에서 작업 디렉터리로 전환을 위해 사용된다.
WORKDIR 명령문으로 작업 디렉터리를 전환하면 그 이우에 등장하는 모든 RUN, CMD, COPY, ENTRYPOINT, ADD 명령문은 해당 디렉터리를 기준으로 실행됨.
WORKDIR 이동할 경로
# /app으로 작업 디렉터리 전환
WORKDIR /app
컨테이너 이미지 메타데이터(버전 정보, 작성자, 코멘트)의 상세 정보를 키(key):값(value)형식으로 지정
LABEL title="backend-cicd-test"
LABEL version="1.0"
LABEL maintainer="testuser1<testuser1@test.com>"
컨테이너 안에서 명령어를 실행
RUN 명령문은 이미지 빌드 과정에서 필요한 커맨드를 실행하기 위해서 사용된다.
RUN [ "커맨드", "파라미터1", "파라미터2" ]
# openjdk-17 설치
RUN apt-get update
RUN apt install -y openjdk-17-jdk
컨테이너 기동 시에 실행할 명령어
ENTRYPOINT 명령문은 이미지를 컨테이너로 띄울 때 항상 실행되야 하는 커멘드를 지정할 떄 사용한다.
ENTRYPOINT [ "npm", "start" ]
컨테이너 기동 시에 실행할 명령어 인수
CMD 명령문은 해당 이미지를 컨테이너로 띄울 때 디폴트로 실행할 커맨드이다.
CMD [ "커맨드", "파라미터1", "파라미터2" ]
# codepipeline-0.0.1-SNAPSHOT.jar를 실행
CMD [ "java", "-jar", "codepipeline-0.0.1-SNAPSHOT.jar" ]
컨테이너 실행 시 Listen 할 포트를 지정
EXPOSE 명령문은 네트워크 상에서 컨테이너로 들어오는 listening하는 포트와 프로토콜을 지정하기 위해서 사용된다.
프로토콜은 TCP, UDP 중 선택할 수 있으며, 지정하지 않으면 TCP가 기본값으로 사용된다.
주의점은 EXPOSE 명령문으로 지정된 포트는 해당 컨테이너 내부에서만 유효하며, 호스트 컴퓨터에서는 이 포트를 바로 접근을 할 수가 없다.
호스트 컴퓨터로 해당 포트로의 접근을 허용하려면 docker run 커맨드의 -p 옵션을 통해 호스트 컴퓨터의 특정 포트를 포워딩(forwarding) 시켜줘야 한다.
# 5000/TCP 포트로 리스닝
EXPOSE 5000
# ubuntu 최신버전을 5000번 포트로 포워딩
docker run -d -p 5000:5000 ubuntu:latest
로컬에 있는 파일을 컨테이너로 복사
COPY 명령문은 호스트 컴퓨터에 있는 디렉터리나 파일을 Docker 이미지의 파일 시스템으로 복사하기 위해 사용된다.
WORKDIR app/
# ./build/libs/codepipeline-0.0.1-SNAPSHOT.jar에 있는 jar 파일을
# 컨테이너안에 /app/codepipeline-0.0.1-SNAPSHOT.jar로 옮김
COPY ./build/libs/codepipeline-0.0.1-SNAPSHOT.jar /app/codepipeline-0.0.1-SNAPSHOT.jar
로컬에 있는 tar.gz 파일을 압축을 풀고 파일을 컨테이너로 복사
ADD 명령어는 COPY 와 유사하게 작동하지만 몇가지 추가 기능을 제공한다.
ADD 명령어는 URL을 통해 파일을 다운로드할 수 있으며, 압축된 파일을 자동으로 추출할 수 있는 기능이 있다.
# backend-cicd-test.tar.xz 파일을 https://www.google.com에서 다운로드하고
# /app에 압축 해제하여 추가함.
ADD https://www.google.com/backend-cicd-test.tar.xz /app
COPY 는 단순하고 명확하지만, ADD 는 URL을 통해 파일을 다운로드하는 등 다양한 기능을 제공한다.COPY 는 로컬 파일에만 사용 가능하지만, ADD 는 원격 URL에서 파일 다운로드가 가능하다.ADD 는 압축된 파일을 이미지 내부에서 자동으로 압축 해제가 가능하지만 COPY 는 불가능하다.Dockerfile을 작성할 때 명료성과 예측 가능성을 위해 COPY 를 사용하는 것이 권장된다.
ADD 는 특정 상황에서 유용하지만, 추가 기능들이 필요하지 않다면 COPY 를 사용하는 것이 더 간결하고 이해하기 쉽다.
환경 변수 설정
ENV 명령어는 환경 변수를 설정하기 위해서 사용된다.
ENV 명령어로 설정된 환경 변수는 이미지 빌드 시에도 사용되고, 해당 컨테이너에서 돌아가는 애플리케이션도 접근 가능하다.
# 자바 경로를 지정
ENV JAVA_HOME=/usr/lib/jvm/default-jvm
빌드 시 넘어오는 인자 값 설정
ARG 명령어는 docker build 커맨드로 이미지 빌드 시, —build-arg 옵션을 통해 넘길 수 있는 인자를 정의하기 위해 사용
# port 인자 선언
ARG port
# port 값 넘기는게 가능해짐
$ docker build --build-arg port=8080 .
명령어 실행 계정 지정
USER 명령어는 이미지 실행이나 컨테이너파일의 RUN, CMD, ENTRYPOINT 명령을 실행하기 위한 사용자 지정이 가능하다.
USER 명령에서 지정하는 사용자는 RUN 명령으로 미리 만들어 두어야 가능하다.
# testuser1이라는 user 추가
RUN [ "adduser", "testuser1" ]
# testuser1으로 로그인
USER testuser1