[Docker] Dockerfile 및 명령어

2024. 10. 28. 11:38·OS/Docker

Dockerfile

Dockerfile은 docker에서 동작하는 컨테이너의 구성 정보를 프로비저닝(provisioning)한 텍스트 template 파일이다.

 

프로비저닝(provisioning)

사용자의 요구의 맞게 시스템 자원을 할당, 배치, 배포해 두었다가 필요 시 시스템을 즉시 사용할 수 있는 상태로 미리 준비해두는 것.

  • Dockerfile은 컨테이너에 설치해야하는 패키지, 소스코드, 명령어, 환경 변수 설정 등을 기록한 하나의 파일이다.
  • Docker 이미지는 컨테이너가 런타임 환경으로 동작하기 위해 필요한 특정 기술 또는 서비스를 사전에 구축한 환경이다 .
  • Dockerfile 은 애플리케이션 배포에 필요한 컨테이너 인프라를 코드 형태로 정의한 파일이다 . 이러한 개념을 IaCInfrastructure as Code) 라고 한다.
  • 원하는 환경의 Docker Image 개발에 필요한 Instration( 명령 ) 을 포함한 텍스트 파일
  • docker build: Dockerfile 을 사용하여 docker image 생성 과정을 트리거하는 Docker CLI
  • Image registry: 생성된 이미지를 public or private 하게 저장할 수 있는 영역
  • Docker image 에 포함된 애플리케이션 인프라에 프로세스를 붙여 서비스로 배포되는 것을 컨테이너라고 한다.

 


Dockerfile 명령어

# FROM 명령어

FROM <image>
FROM <image>:<tag>

 ex)
FROM node:12
FROM python:3.8-alpine
FROM mdock.daumkakao.io/eclipse-temurin:17-alpine as jre-build

 

Docker image는 base 이미지부터 시작해서 기존 이미지 위에 새로운 이미지를 중첩해서 여러 단계의 이미지 층을 쌓아가며 만들어 진다. 여기서 From 명령어는 base image를 지정해주기 위해서 사용되고 보통 Dockerfile 내에서 최상단에 위치한다. 


# RUN 명령어

RUN ["<커맨드>", "<파라미터1>", "<파라미터2>"]
RUN <전체 커맨드>

ex)
- curl 도구 설치 : RUN apk add curl
- npm 패키지 설치 : RUN npm install --silent
- bin utils : RUN apk add binutils 

 

RUN 명령어는 마치 shell 에서 커맨드를 실행하는 것처럼 이미지 빌드 과정에서 필요한 cmd를 실행하기 위해 사용된다. 보통 이미지 안에 특정 소프트웨어를 설치하기 위해 많이 사용된다. 보통 이미지 안에 특정 소프트웨어를 설치하기 위해 많이 사용된다.


# WORKDIR 명령어

WORKDIR <이동할 경로>
ex) /kaas/app로 작업 디렉토리 전환
WORKDIR /kass/app

 

WORKDIR 명령어는 shell의 cd 명령어처럼 컨테이너상에서 작업 디렉터리로 전환을 위해서 사용된다. WORKDIR 명령어로 작업 디렉터리를 전환하면 그 이후에 사용하는 모든 RUN, CMD, ENTYPOINT, COPY, ADD 명령어들은 해당 디렉터리를 기준으로 실행된다. 


# ENV 명령어

ENV<키><값>
ENV<키>=<값>

 

ENV 명령어는 환경 변수를 설정하기 위해서 사용된다. ENV 명령어로 설정된 환경 변수는 이미지 빌드 시에도 사용되고, 해당 컨테이너에 돌아가는 application에도 접근 할 수 있다. 

 


# COPY (layer)명령어

COPY <src>... <dest> COPY ["<src>",... "<dest>"]

COPY inex.html /usr/share/nginx/html

COPY ./runapp.py

 

COPY 명령어는 호스트 환경의 파일, 디렉터리를 이미지 안에 복사하는 경우에 작성한다. 단순한 복사 작업만 지원한다. 빌드 작업 디렉토리 외부의 파일은 COPY할 수 없다.  만약 복사가 필요한 명시적인 작업인 경우 ADD 보다는 COPY를 권장한다. COPY는 ADD 보다 더 예측 가능하고 오류가 덜 발생한다.

 


# ADD(layer) 명령어

ADD index.html /usr/share/nginx/html
ADD http://example.com/view/customer.tar.gz /workspace/data/
ADD website.tar.gz /var/www/html

 

호스트 환경의 파일, 디렉터리를 이미지 안에 복사하는 경우 뿐만 아니라, URL 주소에서 직접 다운로드하여 이미지에 넣을 수도 있다. 압축 파일(tar, tar.gx 등)인 경우에는 지정한 경로에 압축을 풀어서 추가한다.

단 , 빌드 작업 디렉터리의 외부의 파일은 ADD 할 수 없고, 디렉터리 추가 시에는 /로 끝나야한다. 

 


# MAINTAINER 명령어

MAINTAINER DW <DW@smaple.com>

 

일반적으로 이미지를 빌드한 작성자 이름과 이메일을 작성한다.


#LABEL(layer) 명령어

LABEL purpose=’Nginx for webserver’
LABEL version=’1.0
LABEL description=’web service application using Nginx’

권장사항) LABEL purpose=’Nginx for webserver’ \

 

이미지의 작성 목적으로 버전, 타이틀, 설명, 라이선스 및 작성자 정보 등을 작성하여 이미지 관리에 도움을 준다. 하나 이상 작성 가능하다.


#CMD 명령어

[Shell 방식 ]
CMD apachectl -D FOREGROUND
[Exec 방식 ]
CMD [ˮ/usr/sbin/apachectlˮ, “-Dˮ, “FOREGROUNDˮ]
CMD [ˮnginxˮ, “-gˮ, “daemon off;ˮ]
CMD [ˮpythonˮ, “app.pyˮ]

 

생성된 이미지를 컨테이너로 실행할 때 실행되는 명령이고, ENTRYPOINT 명령문으로 지정 된 커맨드에 디폴트로 넘길 파리미터를 지정할 때 사용한다. 여러개의 CMD를 작성해도 마지 막 하나만 처리된다. 일반적으로 이미지가 컨테이너 실행 시 애플리케이션 데몬이 실행되도록 하는 경우 유용하다.

 


#ENTRYPOINT

동일 환경에 entrypoint.sh 쉘 스크립트를 이미지에 넣고(ADD) 실행 권한 설정(RUN) 후 컨 테이너 실행 시 entrypoint.sh를 실행(ENTRYPOINT)
….
ADD ./entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT [”/bin/bash”,”/entrypoint.sh”]

 

CMD와 마찬가지로 생성된 이미지가 컨테이너로 실행될 때 사용되지만 다른 점은 컨테이너가 실행될 때 명령어 인자 값을 전달해여 실행한다.


#VOLUME

사용방법)
VOLUME /var/log
VOLUME /var/www/html
VOLUME /etc/nginx
## HOST OS의 Volume 기본 경로와 container 내부의 /project 연결
VOLUME [”/project”]

 

볼륨을 이미지 빌드에 미리 설정하는 경우 작성한다.

도커 컨테이너에서 사용된 파일과 디렉 터리는 컨테이너 삭제와 함께 사라진다. 따라서, 사용자 데이터의 보존과 지속성을 위해 볼륨 사용을 권장한다. VOLUME으로 지정된 컨테이너의 경로는 볼륨의 기본 경로인 /var/lib/docker와 자동으로 연결된다.

 


 

저작자표시 비영리 변경금지 (새창열림)

'OS > Docker' 카테고리의 다른 글

[Docker] 이미지 경량화  (1) 2024.10.28
[Docker] Dokerfile 빌드 (개발 & 배포 과정)  (0) 2024.10.28
[Docker] Web container log 유지 및 실시간 확인 Volume 구성  (0) 2024.10.28
[Docker] 암시적 docker volumes  (0) 2024.10.28
[Docker] Proxy vs Reverse Proxy 차이  (0) 2024.10.21
'OS/Docker' 카테고리의 다른 글
  • [Docker] 이미지 경량화
  • [Docker] Dokerfile 빌드 (개발 & 배포 과정)
  • [Docker] Web container log 유지 및 실시간 확인 Volume 구성
  • [Docker] 암시적 docker volumes
Kouji
Kouji
Journey to Becoming a Data & Server Engineer
  • Kouji
    Kouji's Data & Server Journey
    Kouji
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Programming
        • Python
        • SQL
      • Data & AI
        • Data Analysis
        • Ai
      • Cloud(AWS)
      • OS
        • Linux
        • Docker
        • Jenkins
        • Ubuntu
        • Window
        • Kubernates
        • Ansible
      • Network
        • NVIDIA
        • Network[이론]
        • Network[GNS3, Packet]
        • Network[On-Premise]
        • Network [L2, L3]
      • 트러블 슈팅
      • Life
        • My Career Stories
        • Personal
      • 개발 + OS 지식 함양
  • 블로그 메뉴

    • 홈
    • 관리 페이지
    • 글쓰기
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    도커
    보안
    네트워크관리사
    L3
    스위치
    오블완
    시스템엔지니어
    dns
    네트워크
    리눅스
    인프라엔지니어
    ubuntu
    VMware
    Linux
    화이팅
    알고리즘
    라우팅
    클라우드엔지니어
    네트워크엔지니어링
    네트워크엔지니어
    인프라
    AWS
    OS
    CISCO
    docker
    IT
    티스토리챌린지
    서버
    웹
    서버엔지니어
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Kouji
[Docker] Dockerfile 및 명령어
상단으로

티스토리툴바