Intro
지난 게시글을 통해 Docker 명령어에 대해서 볼 수 있었는데, 이를 이해하기 위해서는 Dockerfile이라는 존재를 먼저 인지해야한다. 그리고 이 script file이 Image를 생성하고 Container를 생성하고 실행하기 위해 어떤 식으로 쓰이는지도 이해할 필요가 있다. 그래서 이번 게시글에는 Dockerfile에서 꼭 알고 있으면 좋을 법한 내용을 위주로 작성했고 중간에 내가 몰랐던 내용도 작성해놨음 ^^
실행시점에 따른 명령어 구분
아래 그림을 참고해보면 컨테이너를 사용하기 위해 사용한 이미지를 빌드하고 컨테이너 생성시 실행한 명령어를 하나의 Dockerfile에 함께 입력하는 것을 알 수 있다. 그리고 각각의 명령들이 실행될 시점을 두 파트는 Image가 build되는 순간과 Container가 생성되는 순간으로 구분한다.
이미지 빌드 시 실행되는 명령어 (docker build)
이미지 생성 시점에 실행되는 명령어는 이미지가 생성된 뒤 결과를 이미지에 저장한다고 한다. 그리고 해당 명령어들은 컨테이너가 실행될 때는 다시 실행되지 않는 명령어들이다. 보통 이런 명령어는 이미지 생성에 필요한 명령어들로 패키지 설치, 환경 설정, 소스 코드 복사 등을 포함하고 있다.
주요 명령어
FROM | 베이스 이미지 설정 |
RUN | 명령 실행 후 결과를 이미지에 저장 |
COPY | 로컬 파일을 이미지에 복사 |
ADD | COPY와 비슷하지만 압축파일 자동 해제 가능 |
WORKDIR | 작업 디렉토리 변경 |
ENV | 환경 변수 설정 |
예시
# 베이스 이미지 설정
FROM python:3.9
# 작업 디렉토리 설정
WORKDIR /app
# 로컬 파일을 이미지로 복사
COPY . /app
COPY . .
# 필요한 패키지 설치 (이미지에 저장됨)
RUN pip install -r requirements.txt
'COPY . . ' 에 대한 해석
COPY . . 에서 앞의 온점과 뒤의 온점은 각각 어떤 위치를 가르킬까? 먼저 첫번째 온점은 host filesystem이다. Dockerfile이 존재하는 디렉토리를 의미한다. 두번째는 container filesystem이다. FROM 명령을 통해서 불러온 이미지로 컨테이너를 만들면 그 공간을 가르키는 주소이다. 만약 이때, COPY 명령에서 container에 새로운 폴더를 만들고 거기에 리소스를 복사하고 싶다면 생성되지 않았더라도 주소를 적어주면 해당 폴더 안에 파일이 복사된다.
WORKDIR에 대한 설명
dockerfile을 통해서 이미지 내부에 있는 어플리케이션을 실행시킬 수 있고 이를 위해 CLI상 명령어를 사용하게 되는데, 이때 어떤 폴더에서 작업할 지 적어주면 그 이후 명령은 해당 위치에서 동작하게 된다. 따라서 WORKDIR을 정의해준다면 이후 명령어를 작성할 때 WORKDIR까지의 주소는 생략하여 적을 수 있다.
컨테이너 실행 시 실행되는 명령어 (docker run, docker start)
이미지 생성했다면 이렇게 생성된 이미지를 기반으로 명령레이어를 쌓고 이 명령이 수행되면서 컨테이너가 실행된다. 이때, 컨테이너가 생성되어 실행되는 시점에 실행해야할 프로그램이나 기본 명령을 따로 정의하면 다음과 같다.
주요 명령어
CMD | 컨테이너 실행 시 기본 실행 명령 지정 (docker run 시 덮어쓰기 가능) |
ENTRYPOINT | 컨테이너 실행 시 반드시 실행되는 명령 설정 (docker run 인자가 전달됨) |
EXPOSE | 컨테이너가 열어줄 포트 지정 (네트워크 설정용) |
예시
# 기본 실행 명령 (컨테이너 실행 시 실행됨)
CMD ["python", "app.py"]
# 반드시 실행되는 명령 (ENTRYPOINT + CMD)
ENTRYPOINT ["python"]
CMD ["app.py"]
- docker run myimage → python app.py 실행
- docker run myimage test.py → python test.py 실행 (CMD가 ENTRYPOINT의 인자로 전달됨)
EXPOSE : Port Forwarding
어플리케이션을 송출할 포트는 Docker 컨테이너 내부에 보낼 포트로 EXPOSE로 지정해준다. dockerfile 상에서 명시해주는 것이 표준이고 여기서 EXPOSE하는 포트는 Container 내부의 포트를 의미한다. 따라서 로컬 포트에서 서비스를 확인하기 위해서는 포트포워딩을 통해 로컬 포트로 송출해줘야한다.
Outro
Udmey Learning Crew 2nd - Leader 활동의 일환으로 작성한 게시글입니다.
인스타 주소 🎗
'MLOps > Docker Compose' 카테고리의 다른 글
[6] Docker Network (1) | 2025.03.18 |
---|---|
[5] Argument와 Environment Value 설정 (0) | 2025.03.18 |
[4] Docker Data Storage 관리(Application,Temporary, Persistent) (0) | 2025.03.04 |
[1] Docker 설치 및 기본 명령어 (0) | 2025.02.25 |
[0] 가상화(Virtualization) (0) | 2025.02.17 |