Dockerfille 명령어 이해

2026. 6. 12. 23:57Docker


Ⅰ. RUN

RUN


구분 설명
정의
Docker 이미지를 생성할 때 컨테이너 안에서 실행할 명령어 정의
주용도


업데이트 / 패키지 설치
설정 파일 수정
서비스 환경 구성
실행할 명령어 유형 업데이트, 업데이트 관련
애플리케이션, 미들웨어 설치 및 설정 관련
서비스 환경 구축을 위한 명령어 실행 관련
서비스 환경 구축을 위한 서버 프로세스 활성화 및 비활성화 관련
형태 Shell 형식
Exec 형식

 

● RUN - Shell 형식

RUN - Shell 형식 구분 설명
개념 /bin/sh -c로 실행
형식 RUN < 쉘 명령>
특징 쉘 연산자 (&&, |, 리다이렉션) 용이
예시 RUN apt-get update && apt-get install -y curl
RUN echo "v1" > version.txt

 

● RUN - Exec 형식

RUN - Exec 형식 구분 설명
개념 쉘을 거치지 않고 직접 실행
형식 RUN ["명령", "arg1", "arg2"] (JSON 배열)
특징 인자 / 이스케이프 안전
쉘 기능을 쓰려면 bash -lc로 명시
예시 RUN ["apt-get", "update"]
RUN ["bash", "-lc", "echo hello > /msg"]

 


Ⅰ - Ⅰ. RUN 명령어 사용 예시

 

cd docker/04_run/ 명령을 통해 홈 디렉터리에서 /docker/04_run 디렉터리로 이동

 

vi Dockerfile1 명령을 통해 vi 편집기 사용하여 Dockerfile1 파일을 생성한 후, 그 파일 안에 내용 입력

 

cat Dockerfile1 명령을 통해 입력한 내용 확인

 

[ Dockerfile1 파일의 내용 ]

 

FROM ubuntu 명령을 통해 빌드할 이미지의 베이스가 될 이미지로 Ubuntu 공식 이미지 지정

 

Shell 형식으로 작성된 RUN echo Shell 형식입니다.

 

Exec 형식으로 작성된 RUN [“echo”, “Exec 형식입니다.”]

 

Exec 형식으로 작성된 RUN ["/bin/bash", "-c", "echo /bin/bash를 실행한 Exec 형식입니다."]

 

 

# run-sample 이미지 생성

 

docker image build . -t run-sample 명령을 통해 현재 디렉터리에 run-sample 이미지 생성

 

--no-cache 옵션을 통해 빌드 시 캐시를 사용하지 않고 각 단계를 처음부터 다시 실행

 

--progress plain 옵션을 통해 빌드 진행 상황을 단순한 텍스트로 보여주도록 지정

 

-f Dockerfile1 옵션을 통해 이미지 빌드할 때 Dockerfile1 파일의 내용 사용하도록 설정

 

docker image ls 명령을 통해 이미지가 잘 생성되었는지 확인

 

 

docker history run-sample 명령을 통해 run-sample 이미지의 빌드 과정을 계층별로 확인

 

 

# 이미지 삭제

 

irm 명령을 통해 이미지 모두 삭제

 

docker image ls 명령을 통해 이미지가 잘 삭제되었는지 확인


Ⅱ. CMD & ENTRYPOINT

CMD & ENTRYPOINT 설명
이미지를 사용하여 컨테이너를 생성 및 구동할 때 실행
Dockerfile에는 하나의 CMD와 ENTRYPOINT 명령어 사용 가능
여러 개의 CMD와 ENTRYPOINT 명령 사용하면 마지막 명령만 유효함

 

● CMD

CMD 구분 설명
개념 컨테이너 시작 시 실행할 기본 명령 (메인 프로세스) 지정
컨테이너 시작할 때 실행하고 싶은 명령을 정의해도 'docker container run' 명령 실행할 때

인수로 새로운 명령어 지정한 경우, CMD 명령이 아닌 인수로 지정한 새로운 명령 실행
컨테이너 시작할 때 프로세스를 다른 것으로 변경 가능
우선순위 docker run ... <명령>을 주면 CMD는 덮어씀
ENTRYPOINT와의 관계 ENTRYPOINT와 함께 쓰면 ENTRYPOINT의 기본 인자 역할 가능
형태 Shell 형식
Exec 형식

 

 

● CMD - Shell 형식

CMD - Shell 형식 구분 설명
개념 명령을 /bin/sh 쉘에서 실행하는 형식으로 기술하는 방법
RUN 명령의 Shell 형식과 동일
형식 CMD < 쉘 명령 > (내부적으로 /bin/sh -c)
예시 CMD nginx -g 'daemon off;'

 

● CMD - Exec 형식

CMD - Exec 형식 구분 설명
개념 쉘을 경유하지 않고 직접 실행
명령 인수에 $HOME과 같은 환경 변수 지정 불가능
다른 쉘을 사용할 경우, CMD 명령어에 쉘 경로 지정한 다음 실행하고 싶은 명령 지정
실행하고 싶은 명령은 JSON 배열 ({key : value} 또는 {key : {v1 : v2 : v3}}) 형식으로 지정
RUN 명령 Exec 형식과 동일
특징 신뢰성 높고 이식성 좋음 (권장)
형식  CMD ["명령", "arg1", "arg2]
예시 CMD ["nginx", "-g", "daemon off;"]

 

● ENTRYPOINT 

ENTRYPOINT 구분 설명
개념 지정한 명령어가 반드시 컨테이너에서 실행되어야 함
컨테이너 시작 시 반드시 실행할 명령 고정
실행할 때 명령 인수 지정하면 CMD 명령과 조합되어 사용됨
컨테이너를 시작할 떄 프로세스를 다른 것으로 변경 불가능
컨테이너에서 무조건 실행되어야 하는 명령 또는 스크립트 파일 지정
CMD와의 관계 CMD는 ENTRYPOINT의 인자로 전달
변경 docker run에서 다른 명령을 줘도 ENTRYPOINT 자체는 유지
형태 Shell 형식
Exec 형식

 

● ENTRYPOINT - Shell 형식

ENTRYPOINT

Shell 형식
구분 설명
개념 CMD 명령처럼 명령 실행 가능
형태 ENTRYPOINT <쉘 명령>
예시 ENTRYPOINT nginx -g 'daemon off;'

 

● ENTRYPOINT - Exec 형식

ENTRYPOINT

Exec 형식
구분 설명
개념 CMD처럼 명령 실행 가능
형태 ENTRYPOINT ["명령", "arg1", ...]
예시 ENTRYPOINT ["nginx", "-g", "daemon off;"]

 

● RUN  vs CMD & ENTRYPOINT

구분 설명
RUN 이미지 빌드할 때 명령 실행
업데이트 및 설치할 때 주로 사용
CMD & ENTRYPOINT 컨테이너가 구동될 때 컨테이너 안에서 명령 실행
컨테이너 안에서 애플리케이션 실행할 때 사용

 


Ⅱ - Ⅰ. CMD & ENTRYPOINT 명령 사용 예시

 

top –d 10 명령을 통해 시스템의 현재 상태와 실행 중인 프로세스 목록을

 

10초 주기로 업데이트하여 실시간으로 모니터링

 

 

vi Dockerfile2 명령을 통해 vi 편집기를 사용하여 Dockerfile2 파일을 생성하고 그 파일 안에 내용 입력

 

cat Dockerfile2 명령을 통해 Dockerfile2 파일에 저장된 내용 확인 -> CMD Shell 형식

 

[ Dockerfile2 파일의 내용 ]

 

FROM ubuntu:16.04 명령을 통해 빌드할 이미지의 베이스 이미지로

 

이미지의 안정성과 재현성을 보장하는 Ubuntu 16.04 버전 이미지로 지정

 

RUN apt-get update 명령을 통해 이미지가 빌드되는 동안 패키지 목록을 최신 상태로 업데이트

 

RUN apt-get –y upgrade 명령을 통해 이미 설치된 모든 패키지를 최신 버전으로 업데이트

 

RUN apt-get –y install nginx 명령을 통해 Nginx 패키지 설치

 

EXPOSE 80 명령을 통해 컨테이너가 80번 포트를 노출할 것임을 Docker에게 알림

 

Shell 형식으로 작성된 CMD nginx –g daemon off; 명령을 통해 Nginx를 포그라운드에서 실행하도록 설정

 

 

# run-sample 이미지 생성

 

docker image build . -t run-sample 명령을 통해 현재 디렉터리에 run-sample 이미지 빌드

 

--no-cache 옵션을 통해 빌드 시 캐시를 사용하지 않고 각 단계를 처음부터 다시 실행

 

--progress plain 옵션을 통해 빌드 진행 상황을 단순한 텍스트로 보여주도록 함

 

-f Dockerfile2 옵션을 통해 이미지 빌드할 때 Dockerfile2 파일의 내용 사용하도록 설정

 

docker image ls 명령을 통해 이미지가 잘 생성되었는지 확인

 

 

# 컨테이너 생성 및 실행

 

docker container run run-sample:latest 명령을 통해 run-sample:latest 이미지 사용하여 컨테이너 생성 및 실행

 

-d 옵션을 통해 생성한 컨테이너를 백그라운드로 구동

 

--rm 옵션을 통해 실행이 끝나면 컨테이너가 자동으로 삭제되도록 설정

 

-p 80:80 옵션을 통해 호스트의 80번 포트와 컨테이너의 80번 포트 매핑

 

cls 명령을 통해 컨테이너가 잘 생성되었는지 확인

 

 

# 컨테이너 생성 및 실행

 

docker container run run-sample:latest 명령을 통해 run-sample:latest 이미지 사용하여 컨테이너 생성 및 실행

 

-d 옵션을 통해 생성한 컨테이너를 백그라운드로 구동

 

-p 80:80 옵션을 통해 호스트의 80번 포트와 컨테이너의 80번 포트 매핑

 

cls 명령을 통해 컨테이너가 잘 생성되었는지 확인

 

 

# 이미지 삭제

 

irm 명령을 통해 이미지 모두 삭제

 

 

# 컨테이너 삭제

 

crm 명령을 통해 컨테이너 모두 삭제

 

docker image ls 명령을 통해 이미지가 잘 삭제되었는지 확인

 

docker container ls –a 명령을 통해 컨테이너가 잘 삭제되었는지 확인

 

 

vi Dockerfile2 명령을 통해 vi 편집기를 사용하여 Dockerfile2 파일을 생성하고 그 파일 안에 내용 입력

 

cat Dockerfile2 명령을 통해 Dockerfile2 파일에 저장된 내용 확인 -> CMD Exec 형식

 

[ Dockerfile2 파일의 내용 ]

 

FROM ubuntu:16.04 명령을 통해 빌드할 이미지의 베이스 이미지로

 

이미지의 안정성과 재현성을 보장하는 Ubuntu 16.04 버전 이미지로 지정

 

RUN apt-get update 명령을 통해 이미지가 빌드되는 동안 패키지 목록을 최신 상태로 업데이트

 

RUN apt-get –y upgrade 명령을 통해 이미 설치된 모든 패키지를 최신 버전으로 업데이트

 

RUN apt-get –y install nginx 명령을 통해 Nginx 패키지 설치

 

EXPOSE 80 명령을 통해 컨테이너가 80번 포트를 통해 서비스를 제공할 것임을 Docker에게 알림

 

Exec 형식으로 작성된 CMD [“nginx”, “-g”, “daemon off;”] 명령을 통해 Nginx를 포그라운드에서 실행하도록 함

 

 

# run-sample 이미지 생성

 

docker image build . -t run-sample 명령을 통해 현재 디렉터리에 run-sample 이미지 빌드

 

-f Dockerfile2 옵션을 통해 이미지 빌드할 때 Dockerfile2 파일의 내용 사용하도록 함

 

docker image ls 명령을 통해 이미지가 잘 생성되었는지 확인

 

 

# 이미지 삭제

 

 irm 명령을 통해 이미지 삭제

 

 

vi Dockerfile2 명령을 통해 vi 편집기 사용하여 Dockerfile2 파일의 내용 수정

 

cat Dockerfile2 명령을 통해 Dockerfile2 파일의 수정된 내용 확인 -> CMD의 Shell 형식

 

 

# run-sample 이미지 생성

 

docker image build . -t run-sample 명령을 통해  run-sample 이미지 빌드

 

-f Dockerfile2 옵션을 통해 이미지 빌드할 때 Dockerfile2 파일의 내용 사용하도록 함

 

docker image ls 명령을 통해 이미지가 잘 생성되었는지 확인

 

cat –n Dockerfile2 명령을 통해 Dockerfile2 파일의 내용을 순번을 부여하여 화면에 출력

 

 

# 컨테이너 생성 및 실행

 

docker container run run-sample:latest 명령을 통해 run-sample:latest 이미지 사용하여 컨테이너 생성 및 실행

 

-d 옵션을 통해 생성한 컨테이너를 백그라운드로 구동

 

--rm 옵션을 통해 실행이 끝나면 컨테이너가 자동으로 삭제되도록 설정

 

-p 80:80 옵션을 통해 호스트의 80번 포트와 컨테이너의 80번 포트 매핑

 

cls 명령을 통해 컨테이너가 잘 생성되었는지 확인

 

 

# 컨테이너 삭제

 

crm 명령을 통해 컨테이너 모두 삭제

 

 

# 이미지 삭제

 

irm 명령을 통해 이미지 모두 삭제

 

docker container ls –a 명령을 통해 컨테이너가 잘 삭제되었는지 확인

 

docker image ls 명령을 통해 이미지가 잘 삭제되었는지 확인

 

cd ../05_cmd_entrypoint/ 명령을 통해 04_run 디렉터리에서 05_cmd_entrypoint 디렉터리로 이동

 

 

vi Dockerfile 명령을 통해 vi 편집기 사용하여 Dockerfile 파일을 생성한 뒤, 내용 입력

 

cat Dockerfile 명령을 통해 Dockerfile 파일의 내용 확인

 

[ Dockerfile 파일의 내용 ]

 

FROM ubuntu:16.04 명령을 통해 빌드할 이미지의 베이스 이미지로

 

이미지의 안정성과 재현성을 보장하는 Ubuntu 16.04 버전 이미지로 지정

 

Exec 형식으로 작성된 ENTRYPOINT ["top"] 명령을 통해 컨테이너가 시작될 때 top 명령어가 항상 실행되도록 설정

 

Exec 형식으로 작성된 CMD ["-d", "10"] 명령을 통해

 

ENTRYPOINT에 전달된 기본 인자 -d 10으로 설정

 

 

# cmd-sample 이미지 생성

 

docker image build –t cmd-sample . 명령을 통해 현재 디렉터리에 cmd-sample 이미지 빌드

 

docker image ls 명령을 통해 이미지가 잘 생성되었는지 확인

 

 

docker image inspect cmd-sample:latest 명령을 통해 cmd-sample 이미지의 상세 정보 확인

 

 

# top1 컨테이너 생성 및 실행

 

docker container run --name top1 cmd-sample 명령을 통해 

 

cmd-sample 이미지 사용하여 top1 컨테이너 생성 및 실행

 

-it 옵션을 통해 top1 컨테이너에 직접 접근할 수 있는 쉘을 실행하도록 설정

 

실시간으로 시스템의 상태를 모니터링할 수 있는 top 명령어도 실행

 

 

cls 명령을 통해 컨테이너가 잘 생성되었는지 확인

 

 

# top2 컨테이너 생성 및 실행

 

docker container run --name top2 cmd-sample 명령을 통해 

 

cmd-sample 이미지 사용하여 top2 컨테이너 생성 및 실행

 

-it 옵션을 통해 top2 컨테이너에 직접 접근할 수 있는 쉘을 실행하도록 설정

 

실시간으로 시스템의 상태를 모니터링할 수 있는 top 명령어도 실행

 

-d 2 옵션을 화면을 2초마다 업데이트 하도록 설정 

 

 

docker container ls –a 명령을 통해 컨테이너가 잘 생성되었는지 확인

 

 

# top1, top2 컨테이너 삭제

 

crm 명령을 통해 컨테이너 모두 삭제

 

 

# 이미지 삭제

 

irm 명령을 통해 이미지 모두 삭제

 

docker container ls –a 명령을 통해 컨테이너가 잘 삭제되었는지 확인

 

docker image ls 명령을 통해 이미지가 잘 삭제되었는지 확인

 

cd ../06_onbuild/ 명령을 통해 05_cmd_entrypoint 디렉터리에서 06_onbuild 디렉터리로 이동

 

 

vi Dockerfile1 명령을 통해 vi 편집기를 사용하여  Dockerfile1 파일을 생성하고 내용 입력

 

cat Dockerfile1 명령을 통해 Dockerfile1 파일의 내용 확인

 

[ Dockerfile1 파일의 내용 ]

 

FROM ubuntu:16.04 명령을 통해 빌드할 이미지의 베이스 이미지로

 

이미지의 안정성과 재현성을 보장하는 Ubuntu 16.04 버전 이미지로 지정

 

RUN apt-get update && apt-get –y upgrade 명령을 통해 이미지를 빌드하는 동안

 

패키지 목록을 업데이트하고, 설치된 패키지들을 업그레이드하도록 설정

 

RUN apt-get -y install nginx 명령을 통해 Nginx 패키지를 설치

 

EXPOSE 80 명령을 통해 컨테이너가 80번 포트를 통해 서비스를 제공할 것임을 Docker에게 알림

 

ONBUILD ADD website.tar /var/www/html/ 명령을 통해 해당 이미지를

 

부모 이미지로 사용하는 다른 Dockerfile이 빌드될 때 실행되도록 함

 

Exec 형식으로 작성된 CMD ["nginx", "-g", "daemon off;"] 명령을 통해

 

컨테이너가 시작될 때 Nginx를 포그라운드로 실행되도록 함

 

 

tar tf website.tar 명령을 통해 website.tar 압축 파일의 목록 확인

 

 

# web-base 이미지 생성

 

docker image build –t web-base . -f Dockerfile1 명령을 통해 현재 디렉터리에

 

Dockerfile1 파일 이용하여 web-base 이미지 빌드

 

docker image ls 명령을 통해 이미지가 잘 생성되었는지 확인

 

 

docker image inspect web-base:latest 명령을 통해 web-base 이미지의 상세 정보 확인

 

 

# 컨테이너 생성 및 실행

 

docker container run web-base 명령을 통해 web-base 이미지 사용하여 컨테이너 생성 및 실행

 

--rm 옵션을 통해 실행이 끝나면 컨테이너가 자동으로 삭제되도록 설정

 

ls /var/www/html 명령을 통해 컨테이너 내부 /var/www/html 디렉터리에 있는 파일 목록 확인

 

 

vi Dockerfile2 명령을 통해 vi 편집기 사용하여 Dockerfile2 생성 후, 내용 입력

 

cat Dockerfile2 명령을 통해 Dockerfile2 파일의 내용 확인

 

[ Dockerfile2 파일의 내용 ]

 

FROM web-base 명령을 통해 컨테이너의 베이스 이미지로 web-base 이미지 지정

 

 

# web-img 이미지 생성

 

docker image build –t web-img . -f Dockerfile2 명령을 통해 현재 디렉터리에

 

Dockerfile2 이용하여 web-img 이미지 빌드

 

docker image ls 명령을 통해 이미지가 잘 생성되었는지 확인

 

 

# 컨테이너 생성 및 실행

 

docker container run web-img 명령을 통해 web-img 이미지 사용하여 컨테이너 생성 및 실행

 

--rm 옵션을 통해 실행이 끝나면 컨테이너가 자동으로 삭제되도록 설정

 

ls /var/www/html 명령을 통해 컨테이너 내부 /var/www/html 디렉터리에 있는 파일 목록 확인

 

cls 명령을 통해 컨테이너가 생성 후 삭제된 것 확인

 

 

# myweb 컨테이너 생성 및 실행

 

docker container run --name myweb web-img 명령을 통해 web-img 사용하여 myweb 컨테이너 생성 및 실행

 

-d 옵션을 통해 myweb 컨테이너를 백그라운드에서 구동

 

-p 80:80 옵션을 통해 호스트의 80번 포트와 컨테이너의 80번 포트 매핑

 

cls 명령을 통해 컨테이너가 잘 생성되었는지 확인

 

 

# 컨테이너 삭제

 

crm 명령을 통해 컨테이너 모두 삭제

 

 

# 이미지 삭제

 

irm 명령을 통해 이미지 모두 삭제

 

docker container ls –a 명령을 통해 컨테이너가 잘 삭제되었는지 확인

 

docker image ls 명령을 통해 이미지가 잘 삭제되었는지 확인


Ⅲ. ONBUILD

ONBUILD 구분 설명
개념 Dockerfile로 만든 이미지가 다른 Dockerfile의 FROM으로 쓰일 때 지연 실행될 트리거
Dockerfile로 제작한 이미지를 이용하여 다른 이미지를 빌드할 때 실행
빌드하는 이미지에서 명령 실행
빌드된 이미지로 다른 이미지를 빌드할 때 명령 실행
용도 베이스 이미지 제작 시 후속 빌드에게 표준 작업 강제 (ex. ONBUILD COPY ./app)
주의 일반 애플리케이션 이미지에는 남용하지 않기

 


Ⅳ. WORKDIR

WORKDIR 구분 설명
개념 이후 지시어 (RUN, CMD, ENTRYPOINT, COPY, ADD)가 실행될 작업 디렉터리
Dockerfile에서 정의한 명령을 실행하기 위해 작업 디렉터리 지정
지정한 디렉터리가 없을 경우, 디렉터리 생성하고 이동
상대 경로 지정한 경우, 이전 WORKDIR 명령의 경로에 대한 상대 경로가 됨
형태 WORKDIR 작업 디렉터리 경로
중복 사용 여러 번 선언 가능
상대경로면 앞선 WORKDIR 기준으로 누적
예시 WORKDIR /usr/src/app -> COPY ..는 /usr/src/app에 복사

Ⅴ. USER

USER 구분 설명
개념 이후 지시어와 컨테이너 기본 실행에 사용할 사용자 / 그룹 설정
Dockerfile에 RUN, CMD, ENTRYPOINT 명령을 실행하기 위한 계정으로 전환할 때 사용
형태 USER 계정명
USER 계정명 : 그룹명
USER UID : GID
권장 루트 회피 (최소 권한)
파일 권한 / 포트 접근 고려

 


Ⅴ - Ⅰ. USER 명령어 사용 예시

 

useradd user1 명령을 통해 user1이라는 새 사용자를 시스템에 추가

 

cat /etc/passwd | grep user1 명령을 통해 /etc/passwd 파일에서 user1과 관련된 행만 필터링하여 화면에 출력

 

su – user1 명령을 통해 root 계정에서 user1 계정으로 전환

 

exit 명령을 통해 user1 계정에서 root 계정으로 돌아옴

 

cd .. 명령을 통해 06_onbuild 디렉터리에서 docker 디렉터리로 이동

 

cd 07_user/ 명령을 통해 docker 디렉터리에서 07_user 디렉터리로 이동

 

 

vi Dockerfile 명령을 통해 vi 편집기 사용하여 Dockerfile 파일을 생성하고 그 안에 내용 입력

 

cat Dockerfile 명령을 통해 Dockefile 파일에 입력한 내용 확인

 

[ Dockerfile 파일의 내용 ]

 

FROM centos:8 명령을 통해 컨테이너의 이미지를 만들 때 사용할 베이스 이미지로 CentOs:8 로 설정

 

RUN [“useradd”, “user1”] 명령을 통해 컨테이너 이미지 빌드 시

 

useradd user1 명령어를 실행하여 user1이라는 사용자 추가

 

RUN [“whoami”] 명령을 통해 명령어를 실행하여 현재 사용자 확인하도록 함

 

RUN [“id”] 명령을 통해 id 명령어를 실행하여 현재 사용자의 UID, GID 등 상세 정보 확인하도록 함

 

USER user1 명령을 통해 이후에 실행되는 모든 명령어의 사용자를 root에서 user1로 전환

 

RUN [“whoami”] 명령을 통해 whoami 명령어를 실행하여 사용자가 user1으로 잘 전환되었는지 확인

 

RUN [“id”] 명령을 통해 id 명령어를 실행하여 user1의 사용자 정보 확인

 

 

# user-img 이미지 생성

 

docker image build . t user-img 명령을 통해 현재 디렉터리에 user-img 이미지 빌드

 

--no-cache 옵션을 통해 이전 빌드 단계의 캐시를 사용하지 않고, 강제로 모든 단계를 처음부터 다시 실행하도록 함

 

--progress plain 옵션을 통해 빌드 진행 상황을 자세한 로그 형식으로 출력

 

 

docker image ls 명령을 통해 이미지가 잘 생성되었는지 확인


Ⅵ. COPY & ADD

 

- COPY와 ADD 명령은 호스트의 파일이나 디렉터리를 컨테이너 안의 지정된 경로로 복사할 때 사용

 


Ⅵ - Ⅰ. COPY 

COPY 구분 설명
개념

호스트에서 컨테이너로 로컬 파일이나 디렉터리 복사만 가능
호스트의 파일 또는 디렉터리를 컨테이너 내부로 복사할 때 사용
특징

단순 복사 전용 (압축 해제, URL 다운로드 불가)
--chown 옵션으로 소유자 지정 가능
형식 Shell 형식
Exec 형식

 

● COPY - Shell 형식


COPY Shell 형식


구분 설명
개념 명령을 /bin/sh 쉘에서 실행하는 일반적 방식
특징 소유자와 그룹을 변경하며 복사 가능
주의사항 와일드 카드 (*) 사용이 가능하지만 경로 지정 주의
형식 COPY <호스트 경로> <컨테이너 경로>
COPY --chown=user:group <호스트 경로> <컨테이너 경로>

 

● COPY - Exec 형식

COPY Exec 형식 구분 설명
개념 JSON 배열로 지정
쉘을 통하지 않음
특징 Shell 형식과 동일
공백이나 특수문자 포함 경로에 안전
형식 COPY ["호스트 경로", "컨테이너 경로"]
COPY --chown=user:group ["호스트 경로", "컨테이너 경로"]

Ⅵ - Ⅱ. ADD

ADD 구분 설명
개념 COPY 기능 + 확장 기능 포함 명령

=> 원격 파일 다운로드, 압축 파일 자동 해제 가능
호스트에서 컨테이너로 복사 가능
원격 파일을 다운로드하여 복사 가능
아카이브 / 압축 파일을 복사하여 해제 가능
권장 특수 기능이 필요할 때만 사용
특징 URL 다운로드 
tar 자동 추출 가능
단순 복사에는 COPY 권장
형식 Shell 형식
Exec 형식
원격 파일
아카이브 / 압축 파일

 

 

●  ADD - Shell 형식

ADD Shell 형식 구분 설명
개념 쉘에서 실행되는 기본 형태
특징 호스트 경로의 파일을 컨테이너 내부로 복사하거나 압축 파일이면 자동으로 해제
형태 ADD <호스트 경로> <컨테이너 경로>
ADD --chown=user:group <호스트 경로> <컨테이너 경로>

 

 

● ADD - Exec 형식

ADD Exec 형식 구분 설명
개념 JSON 배열로 지정
특징 Shell과 동일 기능
공백과 특수문자 안정성 우수
형태 ADD ["호스트 경로", "컨테이너 경로"]
ADD --chown=user:group ["호스트 경로", "컨테이너 경로"]

 

● 원격 파일 형식

ADD 원격 파일 형식 구분 설명
개념 원격 URL에서 직접 다운로드하여 컨테이너에 저장
특징 Docker가 URL을 통해 직접 파일 가져옴
인증과 보안 문제로 빌드 캐시 예측 어려움 -> 비추천
형태 ADD <URL> <컨테이너 경로>

 

● 아카이브 / 압축 파일

ADD 아카이브 / 압축 파일 형식 구분 설명
개념 압축파일 (tar, tar.gz 등)을 자동으로 해제하여 복사
특징 tar 형식 파일만 자동 해제
.zip 파일은 자동 해제 불가
형태 ADD <압축 파일> <컨테이너 경로>

 

● COPY vs ADD

구분 COPY ADD
기본 기능 파일 복사 파일 복사 + 추가 기능
원격 URL 다운로드 불가 가능
압축파일 자동 해제 불가 가능 (tar 형식)
권장 사용 일반 복사 특수 상황 (원격 / 압축)
공통 옵션 --chown=user:group --chown=user:group

Ⅶ. LABEL

LABEL 구분 설명
정의 이미지에 메타데이터 (버전, 작성자, 설명, 라이선스 등) 부여
이미지 버전 정보, 작성자, 코멘트와 같은 이지미 상세 정보 설명할 때 사용
용도 자산관리
스캔 / 정책 적용
배포 파이프라인에서 조건 필터
주의 사항 표준 OCI 라벨 사용 권장
라벨 값에 비밀정보 (토큰 / 키) 넣지 말 것
자동화 도구에서 라벨 기반 정책 (ex. 스캐너 제외 / 포함) 사용
형식 LABEL title = "컨테이너 파일 이름"
LABEL version = "버전 정보"
docker image inspect 명령을 통해 빌드된 이미지에서 레이블 정보 확인 가능

=> #docker image inspect --format=}{{.Config,Lables}}" [이미지명]

 


Ⅷ. EXPOSE

EXPOSE 구분 설명
개념 컨테이너가 수신 대기할 포트를 문서화 (메타데이터)
컨테이너가 런타임에 지정된 네트워크 포트에서 수신 대기중 상태를 문서 내용으로 알려주고할 때 사용
작성된 포트를 실행하여 Listen 상태로 동작하지 않기 때문에 실제로 포트를 Listen 상태로 하려면

docker container run -p 명령 사용해야 함
동작 실제 개방 아님 -> 외부 노출은 docker run -p 혹은 쿠버네티스 Service 필요
프로토콜 EXPOSE 선언할 때 프로토콜을 지정하지 않으면 TCP 사용
EXPOSE 선언할 때 프로토콜 지정하면 80 / TCP, 53 / UDP 형태
주의사항 런타임에 다른 포토 씌우려면 docker run -p 8080 : 80 이미지 명령 사용
문서화 목적이라 보안 효과 없음
방화벽과 네트워크 정책은 별도 관리
다중 포트는 여러 줄로 선언하거나 한 줄에 나열 가능 - EXPOSE 80 443
형식 EXPOSE 포트 번호
EXPOSE 포트 번포 / 포트명

 


Ⅸ. VOLUME

VOLUME 구분 설명
개념 컨테이너 경로를 호스트 / 볼륨에 영속화하도록 선언
컨테이너 안에 있는 데이터를 호스트 볼륨에 연결할 때 사용
컨테이너 안에 있는 데이터는 컨테이너가 삭제되면 같이 삭제되기 때문에

volume 명령을 통해 호스트 볼륨에 저장 가능
설정한 컨테이너 데이터를 호스트에 저장
컨테이너들 간에 데이터 공유 가능
Dockerfile에서 VOLUME 명령을 통해 생성한 볼륨은 호스트의 /var/lib/docker/volumes에 생성되고,

Dockerfile에서 자동 생성한 hash 값으로 디렉터리 생성
효과 해당 경로는 컨테이너 수명과 분리되어 데이터 유지 및 공유
사용처  DB 데이터
업로드 파일
캐시 / 로그 (필요 시)
설정 디렉터리
주의사항 이미지에 VOLUME 선언하면 해당 경로 내용은 익명 볼륨으로

분리되어 나중에 컨테이서 삭제해도 디스크에 남을 수 있음 (청소 정책 필요)
운영에서는 Dockerfile의 VOLUME보다 런타임에서 명시적 마운트가 추적 및 관리 측면에서 유리
퍼미션 이슈를 피하려면 USER / --chown 조합으로 소유권 맞추기
민감 데이터는 읽기 전용 ( : ro) 또는 전용 스토리지 드라이버 사용 고려
형태 형식 형태
Shell 형식 VOLUME 컨테이너 디렉터리 1 컨테이너 디렉터리 2
Exec 형식 VOLUME ["컨테이너 디렉터리1", "컨테이너 디렉터리2"]

 

'Docker' 카테고리의 다른 글

Docker 명령어  (0) 2026.06.13
Docker 로컬 레지스트리  (0) 2026.06.13
Docker 파일 이미지 빌드  (0) 2026.06.12
Docker 이미지 생성  (0) 2026.06.12
Docker 리소스 제한 및 모니터링  (0) 2026.06.12