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`이라는 명령어에서 아래 일이 일어난다.
- 기존 `httpd`가 가진 6개의 레이어를 그대로 바닥에 깐다.
- 그 위에 "내가 만든 index.html 파일을 추가했다"는 정보가 담긴 7번째 레이어를 한 장 얹는다.
결과적으로 전체 이미지는 7개의 레이어로 구성되지만, 아래 6개는 원본과 완전히 똑같기 때문에 6개의 레이어를 공유해서 쓸 수 있고 저장 공간을 효율적으로 쓸 수 있게된다.
'프로젝트 > Docker' 카테고리의 다른 글
| [Docker] 도커 컨테이너 통신 (포트포워딩) (0) | 2026.02.03 |
|---|---|
| [Docker] 도커 컨테이너 구조, 도커 명령어 (0) | 2026.02.03 |
| [Docker] 도커는 무엇인가? (0) | 2026.01.30 |