[Docker] Dockerfile 작성하기

2026. 2. 5. 23:51·프로젝트/Docker

1. Dockerfile이란?

도커파일 문서: https://docs.docker.com/reference/dockerfile/

 

Dockerfile reference

Find all the available commands you can use in a Dockerfile and learn how to use them, including COPY, ARG, ENTRYPOINT, and more.

docs.docker.com

 

Dockerfile은 도커 이미지를 생성하기위한 스크립트 파일이다. 

텍스트 파일 안에  키워드를 사용해 환경 설정 및 실행 명령을 작성하면, 도커 엔진이 이를 읽어 이미지를 자동으로 빌드한다.


2. Dockerfile의 키워드 정리

키워드 설명
`FROM` base가 되는 image를 지정한다. 주로 OS 이미지나 런타임 이미지를 지정한다.
모든 Dockerfile은 `FROM`으로 시작해야한다.
`RUN` 이미지를 빌드할 때 사용하는 커맨드를 설정할 때 사용
`COPY` 호스트 환경의 파일이나 폴더를 이미지 안으로 복사하기 위해 사용한다.
만약 이미지에 복사하려는 디렉토리가 존재하지 않으면 docker가 자동으로 생성한다.
`ADD` 이미지에 호스트의 파일이나 폴더를 추가하기 위해 사용한다.
만약 이미지에 복사하려는 디렉토리가 존재하지 않으면 docker가 자동으로 생성한다.
`COPY`와 기본적으로 동일하게 동작하지만 `ADD`는 추가로 압축해제나 URL 다운로드 기능을 지원한다.
`EXPOSE` 컨테이너가 외부에 공개할 포트 번호를 지정한다.
`ENV` 컨테이너 내부에서 사용할 환경 변수를 설정한다.
변수는 `$name, ${name}` 의 형태로 쓸 수 있다.

`${name:-else} : name`이 정의가 안되어 있다면 else가 사용된다.
`CMD` 도커 컨테이너가 실행될 때 실행할 커맨드를 지정함.
`RUN`과 비슷하지만 CMD는 도커 이미지를 빌드할 때 실행되는 것이 아니라 컨테이너를 시작할 때 실행된다는 것이 다르다.
`ENTRYPOINT` 도커 이미지가 실행될 때 사용되는 기본 커맨드를 지정한다. (강제)
`WORKDIR` 명령어가 실행될 작업 디렉토리를 지정한다. (Linux의 cd랑 유사하다.)
`-w` 옵션으로 오버라이딩 할 수 있다.
`VOLUME` 데이터를 보관하기 위해 호스트 디렉토리를 연결한다. DB 데이터 유지에 필수적이다.

 


3. docker build

dockerfile을 실행하기 위해서는 `docker build` 커맨드를 사용해야한다.

docker build [옵션] [dockerfile 디렉토리]

// 예시
docker build -t test .

 

이후 생성된 이미지를 컨테이너로 실행하기 위해서는 `run` 커맨드를 사용한다.

// 예시
docker run --name test_app -p 80:80 test

 


4. 실습

이런 간단한 도커파일을 만들어보자.

  • `FROM httpd`는 base 이미지로 Apache HTTP Server(httpd)를 사용하겠다는 뜻이다.
  • 도커 허브에서 httpd를 가져온다.
  • `COPY index.html /usr/local/apache2/htdocs`는 내 컴퓨터의 `index.html` 파일을 `/usr/local/apache2/htdocs` 경로로 복사하라는 뜻이다. 아파치 서버는 기본적으로 `/usr/local/apache2/htdocs` 폴더 안에 있는 파일을 웹에 띄워준다. 즉, `index.html`을 웹서버의 실행 위치에 집어 넣는 것이다.

 

이런 간단한 html 파일을 준비한다.

 

`docker build -t my-web-server .`으로 현재 경로의 파일을 이용해 도커 이미지를 빌드한다.

`-t`는 tag로 이미지 이름 부여에 쓰인다.

`-t my-web-server:1.1` 이런식으로 태그에 버전을 부여할 수 있다.

 

`docker image ls -a`로 현재 존재하는 이미지 목록을 조회한다.

`my-web-server` 이미지가 잘 빌드 된 것을 확인할 수 있다.

 

`docker run --name my_app -p 80:80 my-web-server`로 빌드된 이미지를 실행한다.

 

아파치 웹서버가 `index.html`을 잘 출력하고 있다.

 

 

추가)

도커에서 Layer는 파일 시스템의 변경 사항(Diff)을 기록한 한 장의 스냅샷을 의미한다.

 

`docker inspect my-web-server` 로 Layers를 확인해보면 다음과 같다.

 

`docker inspect httpd` 의 Layers를 확인해보면 다음과 같다.

 

보면 나머지 해시값은 동일하고 `my-web-server` 의 마지막 해시값이 하나 더 있다. 

 

`COPY index.html /usr/local/apache2/htdocs`이라는 명령어에서 아래 일이 일어난다.

  1. 기존 `httpd`가 가진 6개의 레이어를 그대로 바닥에 깐다.
  2. 그 위에 "내가 만든 index.html 파일을 추가했다"는 정보가 담긴 7번째 레이어를 한 장 얹는다.

결과적으로 전체 이미지는 7개의 레이어로 구성되지만, 아래 6개는 원본과 완전히 똑같기 때문에 6개의 레이어를 공유해서 쓸 수 있고 저장 공간을 효율적으로 쓸 수 있게된다.

 

 

'프로젝트 > Docker' 카테고리의 다른 글

[Docker] 도커 컨테이너 통신 (포트포워딩)  (0) 2026.02.03
[Docker] 도커 컨테이너 구조, 도커 명령어  (0) 2026.02.03
[Docker] 도커는 무엇인가?  (0) 2026.01.30
'프로젝트/Docker' 카테고리의 다른 글
  • [Docker] 도커 컨테이너 통신 (포트포워딩)
  • [Docker] 도커 컨테이너 구조, 도커 명령어
  • [Docker] 도커는 무엇인가?
sophon
sophon
sophon 님의 블로그 입니다.
  • sophon
    sophon 님의 블로그
    sophon
    • 카테고리 (172) N
      • 컴퓨터공학 (36)
        • 데이터베이스 (19)
        • 네트워크 (15)
        • 기타 이슈 (2)
      • 프로젝트 (16) N
        • Java (8)
        • Spring (4) N
        • Docker (4)
      • 코딩테스트 (95) N
        • BOJ (74)
        • 프로그래머스 (7)
        • 프로그래머스 SQL (12) N
        • PS Snippets (2)
      • 🌱 잡담 (22)
        • 자격증 (7)
        • 좋은 시 모음 (12)
        • 책과 영화 (3)
        • 기록 (0)
  • 전체
    오늘
    어제
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
sophon
[Docker] Dockerfile 작성하기
상단으로

티스토리툴바