Docker file 이란 updated_at: 2025-06-23 10:39

Dockerfile

도커파일은 docker 에서 이미지를 생성하기 위한 용도로 작성하는 파일이다.

명령어

images

로컬 이미지 목록 확인

docker images

build

docker build [옵션] [작성한 dockerfile 경로]

Dockerfile 과 Yaml 파일의 차이점

Dockerfile

Dockerfile은 Docker 이미지를 빌드하는 데 필요한 지침을 담고 있습니다. 기본 이미지를 지정하고, 파일을 추가하고, 환경 변수를 설정하고, 종속성을 설치하고, 애플리케이션 실행 방식을 정의합니다.

Yaml

YAML 파일은 특히 Docker Compose와 함께 사용될 때(예: docker-compose.yml) 다중 컨테이너 애플리케이션을 설명하고 관리합니다. 서비스, 네트워크 및 볼륨을 정의하고 컨테이너의 연결 및 구성 방식을 지정합니다.

Feature Dockerfile YAML (Docker Compose)
Function Builds a single Docker image Manages multi-container applications
Command docker build docker-compose up
Scope Single container Multiple containers
Relationship Can be referenced by Docker Compose Cannot reference Docker Compose

Dockerfile reference

Dockerfile의 기본 설명입니다.

Overview

  • ADD: 로컬 또는 원격 파일과 디렉터리를 추가합니다.
  • ARG: 빌드 타임 변수를 사용합니다.
  • CMD: 기본 명령을 지정합니다.
  • COPY: 파일과 디렉터리를 복사합니다.
  • ENTRYPOINT: 기본 실행 파일을 지정합니다.
  • ENV: 환경 변수를 설정합니다.
  • EXPOSE: 애플리케이션이 수신 대기하는 포트를 설명합니다.
  • FROM: 기본 이미지에서 새 빌드 단계를 생성합니다.
  • HEALTHCHECK: 시작 시 컨테이너의 상태를 확인합니다.
  • LABEL: 이미지에 메타데이터를 추가합니다.
  • MAINTAINER: 이미지 작성자를 지정합니다.
  • ONBUILD: 빌드에서 이미지가 사용되는 시점에 대한 지침을 지정합니다.
  • RUN: 빌드 명령을 실행합니다.
  • SHELL: 이미지의 기본 셸을 설정합니다.
  • STOPSIGNAL: 컨테이너 종료를 위한 시스템 호출 신호를 지정합니다.
  • USER: 사용자 및 그룹 ID를 설정합니다.
  • VOLUME: 볼륨 마운트를 생성합니다.
  • WORKDIR: 작업 디렉토리를 변경합니다.

예제

FROM nginx // nginx 라는 이미지로 부터 새 빌드 단계를 생성
COPY html  /usr/share/nginx/html // html폴더(혹은 파일)을 이미지의 특정 디렉토리(파일)로 copy
RUN mkdir /myvol // mkdir 명령을 실행
VOLUME /usr/share/nginx/html // /usr/share/nginx/html 으로 마운트 지점을 생성

FROM

도커는 registry 에서 linux ubuntu 18.04 버전 이미지를 다운로드하여 새로 만들 이미지의 기초가 되도록 구성한다.

FROM BaseImageName:Tag
FROM ubuntu:18.04

RUN

Image를 Build 할때 실행

# shell form
RUN <command>
RUN /bin/bash -c 'echo hello'

# exec form
RUN ["<executable>", "<param 1>", "<param 2>"]
RUN ["/bin/bash", "-c", "echo hello"]

CMD

컨테이너가 시작될 때 실행할 커맨드를 지정하는 지시어이다.
RUN 은 이미지를 빌드할 때 실행되는 것이고
CMD 는 이미 만들어진(빌드 완료된) 이미지로부터 도커 컨테이너를 시작할 때 실행되는 것이다.
CMD 는 한 도커파일 내에 CMD 가 여러번 나올 경우 맨 마지막 줄의 CMD 명령만 유효하다.
shell form 은 환경변수 인식이 가능하고 exec form 은 불가능하다.

# shell form
CMD <command>
CMD echo $HOME // $HOME의 환경변수가 출력

# exec form
CMD ["<executable", "<param>"]
CMD ["/usr/bin/wc","--help"]
CMD [ "echo", "$HOME" ] // $HOME 가 출력

ENTRYPOINT

ENTRYPOINT 역시 컨테이너 시작 시 실행될 command 를 지정한다.
CMD 와 거의 동일하지만 컨테이너 실행 시 param 값을 대체할 수 없다는 점에서 다르다. (CMD 는 대체 가능)
한 도커파일 내에 ENTRYPOINT 가 여러번 나올 경우 맨 마지막 줄의 명령만 유효하다.

# shell form
ENTRYPOINT command param1 param2

# exec form
ENTRYPOINT ["executable", "param1", "param2"]
  • 예. CMD 가 ENTRYPOINT 의 additional param 이 되는 형태.
FROM ubuntu
ENTRYPOINT ["/bin/echo", "Hello"]
CMD ["world"]

컨테이너를 실행할 때 param 지정 없이 일반적으로 실행할 경우 그 결과는 다음과 같다.

$ docker run -it --rm --name test
$ docker run -it --rm --name test params  // 컨테이너를 실행할 때 param 을 지정하는 경우

ENTRYPOINT 의 param 인 'Hello' 가 아닌 CMD 의 param 인 'world' 가 대체된다.
그래서 보통 CMD 는 ENTRYPOINT 와 같이 쓰이면서 default 값을 갖는 param 역할을 하는 경우가 많다.       

LABEL

key-value 형식으로 작성된 메타데이터를 이미지에 추가한다.

LABEL <key>=<value> <key>=<value> <key>=<value> ...
LABEL version="1.0"
LABEL description="label's values can span \
multiple lines."

ENV

ENV 는 환경변수(Environment Variables) 를 설정하는 지시어이다.
key-value 형식으로 환경변수명과 그 값을 지정한다.
LABEL 과 사용법이 같지만 LABEL 은 메타데이터를 설정하는 것이고, ENV 는 환경변수를 설정한다
환경변수 값에 " (따옴표) 와 같은 인용문자를 넣으려면 \ (백슬래시) 를 붙여주어야 한다. (escape 처리)

ENV <key>=<value> <key>=<value> <key>=<value> ...

EXPOSE

EXPOSE 지시어는 컨테이너가 실행될 때 컨테이너로 들어오는 트래픽을 특정 포트(port) 로 받아들일 수 있도록(listen) 지정하는 역할을 한다.
프로토콜을 따로 지정하지 않는 경우 기본적으로 TCP 로 인식된다.

EXPOSE <포트>/<프로토콜>
EXPOSE 80/udp

COPY

Host 내에 있는 파일 또는 디렉토리를 컨테이너의 파일시스템으로 복사.

COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
  • --chown 옵션으로 파일과 디렉토리에 대한 소유 권한을 지정할 수 있다.  

ADD

ADD 역시 파일 또는 디렉토리를 컨테이너로 복사한다.
COPY 와 거의 동일하나, ADD 는 Host 내에 있는 파일 외에도 경로(URL)를 지정하여 remote 파일/디렉토리를 복사해올 수 있다는 점이 다르다.

ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]

ADD http://example.com/foobar /pondol/

USER

컨테이너 안에서 명령을 실행할 유저명, 유저그룹을 설정한다. 기본적으로 컨테이너는 root 계정으로 실행되는데 이를 사용자계정 등으로 변경하기 위함이다.

USER <user>[:<group>]
USER <UID>[:<GID>]

위와 같이 user 명, group 명으로 지정할 수도 있고 uid, gid 로 지정할 수도 있다.
도커파일 내에서 USER 가 선언되면 그 이후의 명령들(RUN, CMD, ENTRYPOINT, COPY 등)에 적용된다.
 

WORKDIR

작업 디렉토리(Working Directory) 를 설정한다.
리눅스의 cd 명령어와 유사하나, 이동하려는 디렉토리가 존재하지 않을 경우 해당 디렉토리를 생성하여 이동한다.

WORKDIR /path/to/workdir

VOLUME

VOLUME 은 컨테이너 내의 특정 디렉토리를 컨테이너 외부 경로에 마운트(mount) 시켜주는 지시자이다.
컨테이너 내부 데이터는 보통 컨테이너가 삭제되면 날아가버린다.
이를 막기 위해, 즉 컨테이너가 삭제되어도 데이터가 보존될 수 있도록 컨테이너 내부 경로를 외부로 연결시켜주는 것이 마운트 작업이다.
연결된 외부 경로에 데이터가 쌓이면서 영구 보존이 가능해진다.

VOLUME ["/data"]

VOLUME 지시자는 컨테이너 내의 디렉토리만 지정하면 되며 /var/lib/docker/volumes/{volume명} 이 기본적으로 경로이다.

Docker Hub에 업데이트

Docker Image는 두가지 방식으로 사용가능하다.
하나는 Docker Image 생성후 로컬에서 처리하는 방식과 DOcker Hub로 업데이트 후 그것을 다시 다운받아서 처리하는 방식이다.

Docker Image 만들기

Docker 파일을 생성후 Build는 와 같이 처리한다.

docker build -t YOUR_DOCKER_USERNAME/IMAGE_NAME:TAG [Docker file 위치]
docker build -t YOUR_DOCKER_USERNAME/IMAGE_NAME:TAG .

Local 에서 처리하기

로컬에서 처리할 경우는 yaml 파일 생성시 기존 Docker Hub에 존재할 지도 모르는 이미지와 충돌을 피하기 위해 imagePullPolicy를 Never 로 추천드립니다.

docker build -t php-8-2-fpm:1.0.0 .
containers:
  # Our PHP-FPM application
  - image: php-8-2-fpm:1.0.0
    imagePullPolicy: Never # IfNotPresent
  • IfNotPresent (Default)

이미지가 로컬에 존재하지 않는 경우에만 이미지를 가져옵니다.
주로 상용 서비스시 사용

  • Always

kubelet이 컨테이너를 실행할 때마다 kubelet은 컨테이너 이미지 레지스트리를 쿼리하여 이름을 이미지 다이제스트로 변환합니다. kubelet이 로컬에 캐시된 해당 다이제스트를 포함하는 컨테이너 이미지를 가지고 있는 경우, kubelet은 캐시된 이미지를 사용합니다. 그렇지 않은 경우, kubelet은 해결된 다이제스트를 포함하는 이미지를 가져와서 해당 이미지를 사용하여 컨테이너를 실행합니다.
주로 개발서버에서 사용

  • Never

kubelet은 이미지를 가져오지 않습니다. 이미지가 이미 로컬에 존재하는 경우, kubelet은 컨테이너 시작을 시도합니다. 그렇지 않으면 시작이 실패합니다. 자세한 내용은 미리 가져온 이미지를 참조하세요.

Docker Hub로 올려서 처리하기

1. 계정생성

Docker Hub 에서 계정을 생성한다.

2. 계정으로 로그인

터미널에서 docker login 을 이용하여 Docker Hub로 로그인
참조로 로그아웃시는 'docker logout'을 사용한다.

docker login

3. 이미지 생성

이미지 생성시 tag를 부여하지 않으면 latest 가 적용

docker build -t my-image .

4. 이미지 생성확인

docker images

현재 생성된 images 가 뜨게 되는데 내가 만든 my-image 가 없을 경우 다른 docker context를 사용중인 경우입니다. 이때는

docker context ls

를 하여 나온 목록중 내가 작업하고 있는 context롤 이동하면 됩니다.

docker context use desktop-linux

5. tag 생성

tag 생성시 자신의 docker 계정을 포함하여 생성하여야 한다.

docker tag ssh-multiuser:latest myusername/my-image:1.0.0

6. 이미지 업로드

docker push myusername/my-image:1.0.0

7.yaml 생성

이미지가 docker hub에 있으면 아래와 같이 이미지를 불러오면 된다.

containers:
  - name: nginx
    image: myusername/my-image:1.0.0
..........

Docker Image 삭제

//  image id 로 삭제
docker rmi sha256:[image id]

// image tag로 삭제
docker rmi ubuntu:latest

// 사용중인 이미지 강제 삭제
docker rmi -f sha256:[image id]
평점을 남겨주세요
평점 : 5.0
총 투표수 : 1

질문 및 답글