DockerFile?

docker에서 사용하는 Vagrant 파일이라고 생각하면 편하다.
미리 어떤 이미지를 이용하여 어떤 로직을 이용해 환경을 구축 할 것다! 라는 것을 구성한다
사용할 이미지, 파일 실행, 네트워크 등등을 작성 할 수 있다.
실제 이해한게 맞는지 모르겠지만, Dockerfile은 기본적으로 Image파일을 생성하기 위해 사용하는 것으로 이해했다.
물론 그것에 CLI명령어를 합쳐서 사용할 수 있지만, 다중 컨테이너를 사용하려면 docker-compose를 사용하는 것이 좋아보인다.

작성 방법

DockerFile에 작성된 주석은 실제 실행 시에는 제거되고 실행된다.

FROM

Docker Image 가져오기

  • Docker hub에 존재하는 Image를 다운로드 받아서 사용 혹은 생성한 Local Image를 사용한다
    • build 전에 docker pull을 이용하여 미리 다운 받아 사용 가능하다
  • 형식은 보통 서비스명:버전 형식으로 구성이 되는 것으로 보인다.
  • 만약 build 시 예외시키고 싶은 디렉토리, 파일 등이 존재한다면, .dockerignore File을 생성하면 된다.
# .dockerignore 예시
**/__pycache__/
tests/
docs/
# FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
# FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]
# 아래 2가지 방법은 동일한 결과를 보여준다.
ARG AIRFLOW_IMAGE:apache/airflow:2.6.3-python3.7
FROM ${AIRFLOW_IMAGE}

FROM apache/airflow:2.6.3-python3.7

실행

크게는 RUN과 CMD가 존재한다

  • RUN
    • 용도
      • Docker Image를 Build 시 실행할 명령어
      • mount , network, security 설정을 할 수 있다.
        • mount : FS 를 추가하는 것.
          • 간단히 말하면 HDD/SSD같은 Disk 혹은 usb등을 PC에 삽입하고 인식시키는 것
        • 상세 설정이 필요하면 위 링크로 들어가서 확인해보자
    • \ 을 마지막에 붙여서 여러 개행하여 사용 할 수 있다.
  • CMD
    • 용도
      • Container 최초 실행 시 실행할 명령어
  • ENTRYPOINT
    • 용도
      • Container 실행 시 실행할 명령어
        • 어플리케이션 실행 명령어과 같은 것들을 주로 사용하는 것으로 보임.
# RUN은 기본적으로 /bin/bash -c를 기본값으로 실행시킨다.
# RUN 명령어
# RUN ["명령어", "param1", "param2"]
# 아래 3개는 동일하게 echo 'hello'를 출력한다.
RUN echo 'hello'
RUN /bin/bash -c echo 'hello'
RUN ["/bin/bash", "-c", "echo hello"]
# Mount 
RUN --mount=[type=<TYPE>][,option=<value>[,option=<value>]...]
# Network
RUN --network=<Type>
# Security
RUN --security=<Type>

# CMD
# 형식, 사용 방법은 RUN과 동일하다.
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2

# ENTRYPOINT
ENTRYPOINT ["executable", "param1", "param2"]
# 실제로 가장 많이 본 형식은 아래와 같이 sh 파일을 copy하여 사용하는 것을 많이 봤다.
ENTRYPOINT ["filePath/entrypoint.sh"]

MetaConfig

  1. LABEL
    1. key=value 형식으로 image에 Meta정보를 삽입하는 것
# 공백으로 구분하여 여러 LABLE을 추가 가능
LABEL version="0.0.1" createBy="bapa"
LABEL description="\
이렇게 이미지에 대한 정보를 작성할 수 있습니다.
This is how you can write information about an image.
"

변수

  1. ENV
    1. 환경 변수 등록
  2. ARG
    1. 임시 변수로써 dockerfile 내부에서만 사용되는 변수
# =은 생략 가능하
ENV key1=val1 key2=val2
ARG key=val

Network

  1. EXPOSE
    1. 외부로 노출시킬 Port 설정
# 형식
EXPOSE [<external port>]:<internal port>/[<Protocol>]
# 아래 3개는 동일
EXPOSE 80 
EXPOSE 80:80
EXPOSE 80:80/tcp
# 만약 내부 외부 포트를 다르게 하고 싶다면 아래와 같이 변경시킬 수 있다.
EXPOSE 81:80/udp 

마운트

  1. VOLUME
    • docker 영역에서 생성한 Volume과 마운트 하는 것
  2. Bind-Mount
    • Host영역에서 관리 가능한 Volume과 마운트 하는 것
    • RUN 명령어를 이용하여 마운트
    • docker doc 이곳에 적혀있는 것을 보면 Volume과 차이를 볼 수 있다.
      • the first field is the path to the file or directory on the host machine.
# 형식
VOLUME ["/data"]
VOLUME /data

# 형식
RUN --mount=[type=<TYPE>][,option=<value>[,option=<value>]...]

WORKDIR

RUN,COPY 등 이 실행될 경로
간단히 말하면 Linux의 CD명령어를 이용하여 디렉토리 변경하는 것 이라고 보면된다.
그럼으로 WORKDIR를 이용하여 명령어 실행 위치를 변경 할 수 있다.

# 형식
WORKDIR /path/to/workdir

파일 복사

  1. ADD
    1. 압축된 파일을 풀어서 복사한다.
    2. URL 혹은 local path를 이용하여 복사
  2. COPY
    1. 파일 복사
    2. Local path만 지원
    3. –parents 옵션 추가 시 src의 디렉토리 경로까지 같이 복사 됨
ADD [--chown=<user>:<group>] [--chmod=<perms>] [--checksum=<checksum>] <src> <src> <src>... <dest>
ADD [--chown=<user>:<group>] [--chmod=<perms>] ["<src>","<src>","<src>"... "<dest>"]

COPY [--chown=<user>:<group>] [--chmod=<perms>] <src> <src> <src>... <dest>
COPY [--chown=<user>:<group>] [--chmod=<perms>] ["<src>","<src>","<src>"... "<dest>"]

# --parents 추가시 아래와 같이 복사됨/
COPY ./y/a.txt /no_parents/
# /no_parents/a.txt
COPY --parents./y/a.txt /parents/
# /parents/y/a.txt

사용자 권한

  1. USER
    1. 실행 권한을 적용
# 형식
# USER <user>[:<group>]
# USER <UID>[:<GID>]

USER root
# root 권한으로 실행
USER shb
# shb 권한으로 실행

개인적으로 이해한 그림

Pasted image 20231123112207.png**

[ Reference ]


개인적으로 공부한 내용 포스팅 중
잘못된 정보는 지적해주시면 좋겠습니다!

+ Recent posts