본문 바로가기
DevOps/Docker

4. Docker 이미지 관리 실습 (Dockerfile의 구조, Dockerfile 작성, 커스텀 이미지 빌드 및 실행)

by 잉크드 2023. 7. 15.
반응형

0. Dockerfile의 구조

Dockerfile은 여러 줄의 명령어로 구성되며, 각 명령어는 Docker 이미지 빌드 과정에서 실행됩니다. 주요 명령어는 아래와 같습니다.

FROM: 베이스 이미지를 지정합니다.
RUN: 컨테이너 내에서 실행할 명령어를 지정합니다.
COPY/ADD: 호스트 파일을 컨테이너로 복사합니다.
ENV: 환경 변수를 설정합니다.
EXPOSE: 컨테이너가 노출할 포트를 지정합니다.
CMD/ENTRYPOINT: 컨테이너가 시작될 때 실행할 명령어를 지정합니다.

 

1. Dockerfile 작성

Dockerfile을 통하여 이미지화 할 'app.py'의 코드입니다.

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello, World!"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080)

위의 예시에서는 Flask를 사용하여 루트 URL에 접속하면 "Hello, World!"라는 메시지를 반환하는 간단한 웹 애플리케이션을 구현했습니다.

 

이제 이 어플리케이션을 구동하는 이미지를 Dockerfile로 작성해보겠습니다.

# 베이스 이미지 설정, IMAGE:VERSION
FROM python:3.9-slim
# 작업 디렉토리 설정
WORKDIR /app
# 호스트 시스템의 현재 디렉토리의 모든 파일을 컨테이너의 작업 디렉토리로 복사
COPY . .
# 의존성 패키지 설치
RUN pip install --no-cache-dir -r requirements.txt
# 컨테이너가 실행될 명령어 설정
CMD ["python", "app.py"]

아래는 PIP를 통해서 설치할 의존성 패키지를 모아둔 'requirements.txt' 내용입니다.

실제 프로젝트에서는 필요한 패키지들을 해당 파일에 한 줄씩 추가해주시면 됩니다.

Flask==2.0.1

주의) 작성한 'app.py'와 'requirements.txt'파일은 호스트의 작업 경로에 위치하게 해주시길 바랍니다. 다른 경로에 두고 참조하게 할 수 있지만, 어디까지나 간단한 실습이 주 목적이기 때문에 다루지 않겠습니다.

 

2. 커스텀 이미지 빌드

Dockerfile이 있는 디렉토리로 이동한 후, 아래 명령어를 사용하여 Docker 이미지를 빌드할 수 있습니다:

# docker build -t <이름> <경로>
docker build -t myapp .

Dockerfile에 기술된 명령어를 사용하여 이미지를 빌드하고, myapp이라는 이름으로 태그를 지정합니다. 마지막의 .은 빌드 컨텍스트를 나타내며, Dockerfile과 관련 파일들을 포함합니다.

docker build -t myapp . 실행 결과 예시

빌드한 이미지는 'docker images' 를 통해서 확인할 수 있습니다.

베이스 이미지인 python, 빌드한 커스텀 이미지인 myapp이 표시됨

3. 커스텀 이미지 실행

이미지를 빌드한 후, 아래 명령어를 사용하여 컨테이너를 실행할 수 있습니다.

#docker run <옵션> <이미지이름>
docker run -d -p 8080:8080 myapp

위 명령어는 myapp 이미지를 기반으로 컨테이너를 시작하며, 호스트의 8080 포트와 컨테이너의 8080 포트를 매핑합니다. 웹 브라우저에서 http://localhost:8080으로 접속하여 애플리케이션을 확인할 수 있습니다.

옵션에 대해서 간략하게 설명해드리겠습니다.

'-d': 백그라운드(데몬) 모드로 컨테이너를 실행합니다. 컨테이너가 백그라운드에서 실행되므로 터미널을 차지하지 않고 계속 다른 작업을 수행할 수 있습니다.

'-p 8080:8080': 호스트 머신의 8080 포트와 컨테이너의 8080 포트를 연결합니다. 이를 통해 호스트의 8080 포트로 들어오는 요청은 컨테이너의 8080 포트로 전달됩니다. 따라서 웹 애플리케이션이 컨테이너 내에서 8080 포트에서 실행 중이라면, 호스트의 8080 포트로 접근하여 해당 애플리케이션에 접속할 수 있습니다.

 

이제 정상적으로 실행되고 있는지 확인해보도록 하겠습니다.

docker ps -a

docker ps -a 실행 결과 예시

컨테이너는 정상적으로 실행중이니, 컨테이너 안의 애플리케이션이 정상적으로 동작중인지, 호스트와 컨테이너 간 통신이 가능한 상태인지 확인해보겠습니다.

curl http://localhost:8080

curl http://localhost:8080 실행 결과 예시

이번 글에서는 Dockerfile의 구조를 알아보고 간단한 Dockerfile을 작성해보았습니다. 이를 이용하여 커스텀 이미지 빌드하고, 이미지를 이용하여 컨테이너를 실행하고, 작동하는지 테스트해보았습니다. 다음 글에서는 작성한 이미지를 Docker Hub에 업로드하고, 내려받는 과정을 알아보도록 하겠습니다.

댓글