본문 바로가기
INFRA

[Docker] Dockerfile 작성법

by BTC_하동녹차 2023. 5. 12.

 

베하~! BTC_녹차공원 팀의 하동녹차 입니다.

이번주는 Dockerfile 에 대한 설명과 Dockerfile 작성법에 대해 설명 해드리겠습니다!

 

Dockerfile 이란?


 

Dockerfile은 Docker 이미지를 빌드하기 위한 파일입니다.

Dockerfile은 일련의 명령문을 포함하며, 이 명령문은 Docker 이미지를 빌드할 때 순차적으로 실행됩니다.

Dockerfile을 사용하면 이미지에 필요한 패키지, 라이브러리, 구성 파일 등을 지정할 수 있으며,
이렇게 빌드된 Docker 이미지는 동일한 환경을 가진 여러 대의 컨테이너에서 실행할 수 있습니다.

Dockerfile은 Docker CLI를 사용하여 빌드됩니다.

Dockerfile을 작성한 후, Docker CLI를 사용하여 이미지를 빌드하고, Docker Hub와 같은
이미지 레지스트리에 이미지를 업로드할 수 있습니다.


Dockerfile 명령어


• FROM
베이스 이미지를 지정합니다.
태그를 넣어 주지 않으면 latest 버전으로 지정 됩니다.
예시

 

 

• COPY
호스트 환경의 파일. 디렉터리를 Docker 이미지로 복사 합니다.
빌드 작업 디렉터리 외부의 파일은 COPY 할 수 없습니다.
예시

 

 
• ADD
COPY와 유사하지만, 로컬 파일 뿐만 아니라 URL이나 압축 파일도 추가할 수 있습니다.
빌드 작업 디렉터리 외부의 파일은 ADD 할 수 없고, 디렉터리 추가 시에는 /로 끝나야 합니다.
예시

 

 

• RUN
명령어를 실행합니다. 일반적으로 패키지 설치 등을 위해 사용됩니다.
1개 이상 작성이 가능합니다.

예시

# 주의사항

•  docker build 시  -y 플래그를 사용하지 않으면 apt 명령어가 사용자의 확인을 묻기 때문에, build 중에 중단됩니다.

 RUN 명령어의 개별 명령 수를 최소화 하고 이미지의 레이어 수 를 감소 시키기 위해 설치 명령은 연결 하는 것이 좋습니다.

예시

 

 

 

• CMD
컨테이너가 시작될 때 실행할 명령어를 지정합니다. 하나의 Dockerfile에서 한 번만 사용될 수 있습니다.
여러개 의 CMD를 작성해도 마지막 하나만 처리 됩니다. #ENTRYPOINT 를 사용 하면 여러개 사용 가능 합니다.

일반 적으로 이미지의 컨테이너 실행 시 애플리케이션 데몬이 실행되도록 하는 경우 유용합니다.

예시

 

 

 

• ENTRYPOINT
CMD와 유사하지만, 컨테이너가 시작될 때 실행되는 프로그램 또는 스크립트를 지정합니다.
CMD와 함께 사용될 수 있습니다.

여러 개의 CMD 를 사용하는 경우 ENTRYPOINT 명령문과 함께 사용합니다.

예시

# CMD 와 ENTRYPOINT 비교

• CMD 는 도커 컨테이너 실행 시 다양한 명령어를 지정하는 경우 유용 합니다.

• ENTRY 포인트는 도커 컨테이너 실행 시 항상 수행해야하는 명령어(웹 서버나 데이터베이스등의 데몬 실행) 를 지정 합니다.

• 즉, CMD는 컨테이너가 실행될 때 기본적으로 실행될 명령어를 정의하는 것이고,

ENTRYPOINT는 컨테이너가 실행될 때 실행될 명령어를 정의하고, 이 명령어와 함께 사용될 인수를 지정하는 것 입니다.

 

 

 
• ENV
환경 변수를 설정합니다.

Dockerfile 에서 ENV를 설정하면 RUN,WORKDIR 등에서 환경 변수를 사용해 반복을 피할 수 있습니다.

예시

 

 

 

• ARG
빌드 시간에 사용되는 변수를 지정합니다.
비밀키, 계정 비밀번호 같은 민감한 정보 사용 시 이미지에 그대로 존재하여 노출될 위험이 있습니다.
예시

 

 

 
• WORKDIR
작업 디렉토리를 설정합니다.

WORKDIR을 설정하면 RUN, CMD, ENTRYPOINT, COPY, ADD 명령문은 해당 디렉터리를 기준으로 실행 합니다.

지정 된 경로가 없으면 자동으로 생성됩니다.

예시

 

 

 

• EXPOSE
컨테이너가 사용하는 포트를 지정합니다.

Dockerfile에서 컨테이너가 실행될 때 노출할 포트를 지정하는 명령어입니다.

예시

 

 

# 개인 적으로 가장 헷갈렸 던 부분이 docker run -p 옵션 과 Dockerfile EXPOSE 차이 입니다! 

• docker run -p 옵션 

-p 옵션은 docker run 명령어에서 사용되며, 호스트와 컨테이너 간의 포트 매핑을 지정하는 옵션입니다.

 

• Dockerfile EXPOSE 

EXPOSE 명령어는 Dockerfile에서 사용되며, 컨테이너가 실행될 때 노출할 포트를 지정하는 명령어입니다.

 

사실 이것만 읽더라도 저는 잘 이해가 가지 않았습니다.

이제, 제가 이해한 방식에 대하여 설명 드리겠습니다.

 

예를 들어, docker run -p 8080:80 nginx 명령어는 호스트의 8080 포트를 컨테이너의 80 포트로 매핑합니다. 

이제 호스트에서 http://localhost:8080으로 접속하면 컨테이너의 80 포트로 연결됩니다.


반면에, EXPOSE 명령어는 Dockerfile에서 사용되며, 컨테이너가 실행될 때 노출할 포트를 지정하는 명령어입니다. EXPOSE 8080은 컨테이너가 8080 포트를 노출하도록 지정합니다.

 

하지만, EXPOSE 명령어만으로는 호스트와 컨테이너 간의 포트 매핑을 지정하는 것은 아닙니다. 

포트 매핑을 설정하려면 docker run 명령어에서 -p 옵션을 사용해야 합니다.


따라서, docker run -p 8080:80과 Dockerfile에서 EXPOSE 8080을 함께 사용하면, 호스트의 8080 포트와 컨테이너의 80 포트를 매핑하고, 컨테이너가 8080 포트를 노출하도록 지정할 수 있습니다.

 

이상 BTC_녹차공원 팀이였습니다!

베빠~!

 

'INFRA' 카테고리의 다른 글

[Git] Git 개요 및 사용법  (0) 2023.06.22
[Docker] Docker Buildx 란?  (0) 2023.05.25
Gitlab에대해  (1) 2022.09.27
무정지를 위한 인프라 (2) 웹서버 이중화  (0) 2022.06.15
프로세스 상태 전이도  (0) 2022.05.26

댓글