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
- CMD
- 용도
- Container 최초 실행 시 실행할 명령어
- 용도
- ENTRYPOINT
- 용도
- Container 실행 시 실행할 명령어
- 어플리케이션 실행 명령어과 같은 것들을 주로 사용하는 것으로 보임.
- 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
- LABEL
- key=value 형식으로 image에 Meta정보를 삽입하는 것
# 공백으로 구분하여 여러 LABLE을 추가 가능
LABEL version="0.0.1" createBy="bapa"
LABEL description="\
이렇게 이미지에 대한 정보를 작성할 수 있습니다.
This is how you can write information about an image.
"
변수
- ENV
- 환경 변수 등록
- ARG
- 임시 변수로써 dockerfile 내부에서만 사용되는 변수
# =은 생략 가능하
ENV key1=val1 key2=val2
ARG key=val
Network
- EXPOSE
- 외부로 노출시킬 Port 설정
# 형식
EXPOSE [<external port>]:<internal port>/[<Protocol>]
# 아래 3개는 동일
EXPOSE 80
EXPOSE 80:80
EXPOSE 80:80/tcp
# 만약 내부 외부 포트를 다르게 하고 싶다면 아래와 같이 변경시킬 수 있다.
EXPOSE 81:80/udp
마운트
- VOLUME
- docker 영역에서 생성한 Volume과 마운트 하는 것
- 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
파일 복사
- ADD
- 압축된 파일을 풀어서 복사한다.
- URL 혹은 local path를 이용하여 복사
- COPY
- 파일 복사
- Local path만 지원
- –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
사용자 권한
- USER
- 실행 권한을 적용
# 형식
# USER <user>[:<group>]
# USER <UID>[:<GID>]
USER root
# root 권한으로 실행
USER shb
# shb 권한으로 실행
개인적으로 이해한 그림
**
[ Reference ]
개인적으로 공부한 내용 포스팅 중
잘못된 정보는 지적해주시면 좋겠습니다!