[Docker] Dockerfile

조치연·2026년 8월 7일

Docker

목록 보기
5/6
post-thumbnail

Dockerfile


Dockerfile이란, Docker 이미지를 만들게 해주는 파일이다.

Dockerhub에 등록된 이미지가 존재한다면 사용하면 되지만, 자신이 프로젝트를 할 때 프로젝트 파일을 Docker 이미지로 저장해야하는 순간이 오면, Dockerfile을 활용해야 한다.

Dockerfile은 프로젝트에 Dockerfile라는 이름의 파일을 만들고 안에 명령어를 작성하면 된다.

나중에 터미널에서 Docker build를 이용해 실행하면 알아서 Dockerfile을 토대로 실행된다.


FROM


FROM은 베이스 이미지를 생성하는 역할을 한다.

# 문법

  • FROM [이미지]:[태그]

베이스 이미지란, Docker 컨테이너의 초기 이미지를 의미한다.

새로운 Docker 이미지를 만들 때, 기반이 되는 초기 이미지가 존재할 수 있다.
이때, FROM을 사용하여 베이스 이미지를 가져온다.
(베이스 이미지는 여러개가 될 수 있다.)

아래는 python이라는 이미지를 베이스 이미지로 가져올 수 있다.

FROM python

COPY


COPY는 특정 호스트 파일(폴더)을 Docker 컨테이너로 복사하는 역할을 한다.

# 문법

  • COPY [호스트 컴퓨터에 있는 복사할 파일 경로][컨테이너에서 파일이 위치할 경로]

내가 fastapi로 만든 코드가 있다고 할 때, 이 코드를 Docker 컨테이너에서 실행시키고 싶다면 fastapi 코드를 복사해서 Docker 컨테이너로 넣은 후 이미지로 만들어 작동시켜야 한다.

이때, COPY문법을 사용한다.

아래처럼 파일을 Docker 컨테이너로 가져올 수 있다.

COPY requirements.txt .

ENTRYPOINT


ENTRYPOINT는 컨테이너가 생성되고, 실행될 때 수행되는 명령어다.

# 문법

  • ENTRYPOINT [명령문...]
    명령문은 리스트 형식으로 차례대로 들어간다.

fastapi 코드를 가져온 상태에서 이를 실행할 코드가 필요하다.
일반적으로 fastapi 코드를 구동하려면 다음과 같은 코드를 작성한다.

uvicorn main:app --reload --port=8081

이걸 Docker 컨테이너가 실행될 때, 수행하도록 하려면 아래와 같이 사용할 수 있다.

ENTRYPOINT ["uvicorn", "main:app", "--reload", "--port=8081"]

이는 Docker 컨테이너 내부에서 8081포트를 사용하겠다는 의미다.


RUN


RUN이란, 이미지를 생성하는 과정에서 명령어를 수행해야 할 때 사용한다.

# 문법

  • RUN [명령문]

앞에서 ENTRYPOINT는 컨테이너가 실행될 때, 수행되는 코드라고 했다.

RUN은 이미지가 생성될 때, 수행되는 코드다.

fastapi 서버의 코드를 실행시키기 위해서 미리 다운받아야 하는 라이브러리가 존재한다.
이를 다운받으려면 아래와 같은 코드를 수행해야한다.

pip install --no-cache-dir -r requirements.txt

Docker 이미지가 생성될 때, 저 코드를 실행하고 싶다면 아래와 같이 작성할 수 있다.

RUN pip install --no-cache-dir -r requirements.txt

WORKDIR


WORKDIR은 작업 디렉터리를 지정하는 역할을 한다.

# 문법

  • WORKDIR [작업 디렉터리로 사용할 절대 경로]

WORKDIR을 굳이 사용하지 않아도 작동하는 것에 문제는 없지만, 컨테이너 내부의 폴더를 깔끔하게 정리할 수 있다.

아래와 같이 나열된 파일들을

app.txt
main.py
config.json

아래와 같이 하나의 폴더에서 관리할 수 있게된다.

app/
	app.txt
    main.py
    config.json

fastapi 코드를 app이라는 폴더에서 작업하고 싶다면 아래와 같이 작성할 수 있다.

WORKDIR app

EXPOSE


EXPOSE는 컨테이너 내부에서 사용중인 포트를 문서화한다.

# 문법

  • EXPOSE [포트 번호]

EXPOSE는 실제 역할을 하지는 않는다.
한마디로 EXPOSE에 작성된 포트 번호는 실제 작동에는 관여하지 않는다.
(주석 정도로 생각해도 좋을 것 같다.)

Docker 컨테이너 내부에서 포트를 3000을 사용한다면 아래와 같이 사용할 수 있다.

EXPOSE 3000

다시 말하지만, 실제 동작에는 영향을 미치지 않는다.

다만, 내 코드를 처음 보는 사람들에게 내 Docker 이미지가 내부에서 몇번 포트에서 작동하는지 알려줄 수 있다.


.dockerignore


.dockerignore는 파일의 형태로, Dockerfile에서 전체 파일을 COPY하지만, 예외를 두고싶을 때 사용한다.

.dockerignore는 무시하고 싶은 파일을 열거해둘 수 있다.

이렇게 설정하면 Dockerfile에서 전체 파일을 COPY하더라도 README.md, .vscode, __pycache__ 파일은 컨테이너 내부로 복사하지 않게 된다.


실행방식


이렇게 Dockerfile을 작성했다면 아래와 같이 실행할 수 있다.

# 문법

  • Docker build -t [만들 이미지명]:[만들 태그명][Docker 파일이 존재하는 디렉터리 경로]

현재 경로에서 my-server라는 이름으로 이미지를 만들고 싶다면 아래와 같이 실행할 수 있다.

Docker build -t my-server .

Reference


Docker 입문/실전

profile
세종대학교 지능기전공학과 23

0개의 댓글