Dockerfile

2025. 7. 8. 17:55도커

생활코딩님의 유튜브강의를 참고해서 작성한 글입니다.

 

 

이미지를 만들기 위해서는 2가지 방법이 있습니다.

  1. docker commit: 실행 중인 컨테이너의 상태를 이미지로 저장
  2. Dockerfile: 이미지 생성 과정을 코드로 작성

2가지 방법을 통해서 Dockerfile이 뭔지 알아보겠습니다.


실습으로 배우기 - Python웹서버 이미지 만들기

 

docker commit 사용

Step 1. Ubuntu 컨테이너 실행

터미널에 docker run --name web-server -it ubuntu:20.04 명령어를 입력합니다.

  • --name: 컨테이너 이름 지정
  • -it: 인터렉티브 모드로 실행 (터미널 접속)
  • ubuntu:20.04: 베이스 이미지

 

그럼 위 사진처럼 컨테이너가 생성되었을겁니다.

 

Step 2. Python3 설치

컨테이너 내부에서 파이썬을 설치해 줍니다.

apt update

apt install python3

(apt: ubuntu에서 앱스토어 역할을 하는 프로그램)

위 명령어를 입력하면 컨테이너 안에 python이 설치됩니다.

 

Step 3. 작업 디렉토리 생성

작업 디렉토리를 생성하기 위해서 컨테이너 내부에서 mkdir -p /var/www/html 명령어를 입력합니다.

그리고 해당 폴더로 이동하기 위해 cd /var/www/html을 입력합니다.

 

Step 4. HTML파일 생성

사용자의 요청이 왔을 때 응답할 index.html을 만들어 줘야 합니다.

echo "Hello, Docker" > index.html 명령어를 입력합니다.

 

Step 5. 컨테이너를 이미지로 저장

지금까지 작업한 컨테이너를 이미지로 만들기 위해서 commit을 해봅시다.

다른 터미널에서 docker commit web-server docker-commit-web-server 명령어를 입력합니다.

  • docker commit [컨테이너명] [새로운 이미지명]

 

그러면 이렇게 이미지가 생성된 걸 확인할 수 있습니다.

 

Step 6. 이미지로 컨테이너 실행

이제 만들어진 이미지로 컨테이너를 실행하기 위해서 아래와 같은 명령어를 입력해 줍니다.

docker run -p 8888:8000 --name web-server-run -it docker-commit-web-server

 

그러면 컨테이너가 만들어지고 접속될 텐데, 거기서 python 서버를 띄우기 위해서

cd var/www/html

python3 -m http.server

위 명령어를 입력해 줍니다.

위 사진처럼 정상적으로 컨테이너가 실행되고 python 서버가 올라간 걸 확인할 수 있습니다.


docker build 사용

이제 위에서 만들어진 이미지를 Dockerfile을 이용해 docker build 해서 만들어 보겠습니다.

 

Step 0. Dockerfile 생성

폴더 안에 Dockerfile을 만들어줍니다.

Dockerfile은 약속된 이름입니다.

 

Step 1. 베이스 이미지 설정

commit에서 Ubuntu를 사용했기 때문에 똑같이 Ubuntu를 베이스 이미지로 사용합니다.

베이스 이미지 설정은 FROM으로 설정합니다.

FROM ubuntu:20.04

 

Step 2. Python3 설치

명령어 실행을 통해 python를 설치해야 하는데 이는 RUN을 통해 가능합니다.

RUN apt update

RUN apt install python3

위처럼 적어줘서 실행할 수 있는데 RUN 명령어는 실행할 때마다 레이어가 쌓이므로 좋지 않습니다.
(레이어가 많으면 이미지 크기가 커지고 빌드가 느려질 수 있습니다.)

이럴 땐 &(엠퍼샌드)를 2개를 넣어주면 됩니다.

 

RUN apt update && apt install python3

&&를 사용하면 앞의 명령어가 실행되고 성공하면 뒤에 명령어를 실행해 순서도 보장할 수 있습니다.

 

그리고 python3을 설치할 때 보면 위처럼 진짜로 설치할 건지 사용자의 입력을 기다리는 지점이 있습니다.

이렇게 사용자가 입력을 해야 하는 경우에는 dockerfile이 정상적으로 동작하지 않을 수 있으므로

 

RUN apt update && apt install -y python3

위처럼 입력해서 사용자 입력 없이 설치되게 해야 합니다.

 

Step 3. 작업 디렉토리 생성 및 설정

Dockerfile에서 작업 디렉토리 생성 및 설정은 WORKDIR을 통해 가능합니다.

WORKDIR /var/www/html

위 명령어를 입력하면 저 경로가 없다면 만들고 사용자를 그 경로로 이동시킵니다.

WORKDIR 하위에 작성하는 cmd 명령어는 /var/www/html을 대상으로 실행됩니다.

 

Step 4. HTML파일 생성

파일 생성은 위에서 했던 것처럼 RUN을 이용하면 되는데,

RUN echo "Hello, Docker" > index.html

이보다 편한 방법은 이미 만들어진 파일을 복사하는 것입니다.

COPY 명령어를 통해 복사를 할 수 있습니다.

Dockerfile 옆에 index.html 파일을 만들고 COPY ["index.html", "."] 이렇게 입력해 줍니다.

이렇게 하면 host에 있는 index.html 파일을 /var/www/html로 복사합니다.

(WORKDIR 다음에 COPY 했으므로. 은 /var/www/html을 지칭함)

 

Step 5. python 서버 실행 명령어 입력

CMD를 사용해 python 서버를 실행하는 명령어를 입력할 수 있습니다.

CMD ["python3", "-m", "http.server"]
이렇게 하면 되는데 CMD는 컨테이너가 실행된 다음에 실행되기 때문에 CMD는 컨테이너에 반영되고

RUN은 이미지에 반영된다고 볼 수 있습니다.

 

최종적으로 저장된 Dockerfile은 아래와 같습니다.

 

Step 6. 이미지로 빌드하고 컨테이너 실행

docker build -t docker-build-web-server .

이렇게 하면 경로(.)에 이미지가 만들어집니다. 

 

docker run -p 8888:8000 --name web-server-build docker-build-web-server

위 명령어를 통해 컨테이너를 실행하면 정상적으로 컨테이너가 올라간 걸 확인할 수 있습니다.

 


Dockerfile 주요 명령어

실습에서 봤듯이 Dockerfile은 이미지를 만드는 설계도입니다.

그래서 그 설계도를 만드는데 제공하는 명령어는 어떤 게 있는지 주요 명령어를 알아보겠습니다.

 

FROM

FROM ubuntu:20.04

베이스 이미지를 지정하는 명령어입니다. 이미지를 만들 때 기반이 되는 이미지를 지정하는 명령어입니다.

Dockerfile의 첫 번째 명령어여야 합니다.

 

RUN

RUN apt update && apt install -y python3

이미지를 만드는 과정에서 명령어를 실행하는 명령어입니다.

주로 패키지 설치, 파일 다운로드 등에 쓰입니다.

docker build 할 때 실행됩니다.

 

WORKDIR

WORKDIR /var/www/html

작업 디렉토리를 설정합니다.

이후 모든 명령어가 이 디렉토리를 기준으로 실행됩니다.

 

COPY

COPY ["호스트 경로", "컨테이너 경로"]

호스트의 파일을 컨테이너 안으로 복사합니다.

 

CMD

CMD ["python3", "-m", "http.server"]

컨테이너가 실행될 때 자동으로 실행할 명령어를 지정합니다.

docker run 할 때 실행됩니다.

 

dockerfile에 CMD는 하나만 있어야 합니다.

여러 개가 있으면 마지막 CMD만 실행됩니다.

 

ENTRYPOINT

ENTRYPOINT ["python3", "-m", "http.server"]

CMD와 비슷하지만 덮어씌울 수 없는 고정 명령어입니다.

 

EXPOSE

EXPOSE 8080

컨테이너가 사용하는 포트를 문서화합니다.

실제로 포트를 열어주는 것은 아니고 이미지를 만드는 사람과 컨테이너를 실행시키는 사람 사이에 정보를 제공하는 역할을 합니다.

포트를 실제로 열려면 docker run -p 옵션을 사용해야 합니다.

 

ENV

ENV NODE_ENV=production

ENV port=8080

컨테이너 내부에서 사용할 환경변수를 설정합니다.

 

ENV APP_HOME=/app

WORKDIR $APP_HOME

이렇게도 사용할 수 있습니다.

 

 

 

'도커' 카테고리의 다른 글

볼륨과 바인드 마운트  (0) 2025.07.08
도커 컴포즈(Docker Compose)  (0) 2025.07.08
컨테이너(Container)  (2) 2025.06.22
하이퍼바이저(Hypervisor)  (0) 2025.06.21
가상화  (1) 2025.06.21