About/Docker

[Docker] Docker Compose를 이용한 웹 애플리케이션 생성

김징어 2021. 9. 5. 13:58

Compose 구성 파일 

1. 애플리케이션 구조

샘플 애플리케이션의 구조는 다음과 같습니다.

.
├── app.py
├── docker-compose.yml
├── Dockerfile
├── requirements.txt
├── static
│   ├── css
│   │   └── bootstrap.css
│   └── images
│       ├── docker-machine-01.jpg
│       ├── docker-machine-02.jpg
│       ├── docker-machine-03.jpg
│       ├── docker-machine-04.jpg
│       └── docker-machine-05.jpg
└── templates
    └── index.html

 

2. Compose 정의 파일 확인

docker-compose.yml 파일은 다음과 같이 정의되어 있습니다.

version: '3.3'
services:
  # WebServer config
  webserver:
    build: .
    ports:
     - "80:80"
    depends_on:
     - redis

  # Redis config
  redis:
    image: redis:4.0
  • version : 버전 지정
  • webserver는 현재 디렉토리의 Dockerfile 에 정의한 구성의 이미지를 빌드하고, 외부에 대하여 80번 포트를 공개 하여 컨테이너를 실행합니다.
  • redis 이미지는 Docker Hub에 공개되어 있는 Redis의 공식 이미지인 'redis'의 4.0 버전을 베이스 이미지로 컨테이너를 실행합니다.

현재 폴더의 Dockerfile은 다음과 같이 정의되어 있습니다.

# Base Image
FROM python:3.6


# Upgrade pip
RUN pip install --upgrade pip

# Install Path
ENV APP_PATH /opt/imageview

# Install Python modules needed by the Python app
COPY requirements.txt $APP_PATH/
RUN pip install --no-cache-dir -r $APP_PATH/requirements.txt

# Copy files required for the app to run
COPY app.py $APP_PATH/
COPY templates/ $APP_PATH/templates/
COPY static/ $APP_PATH/static/

# Port number the container should expose
EXPOSE 80

# Run the application
CMD ["python", "/opt/imageview/app.py"]

 

여러 Docker 컨테이너 실행

docker-compose up 명령어를 통하여 정의한 2개의 컨테이너를 실행합니다.

$ docker-compose up
  • Docker Hub로 부터 Redis 서비스에서 사용할 redis:4.0의 이미지가 다운로드 되며 그 다음 webserver에서 사용할 이미지가 Dockerfile을 바탕으로 빌드됩니다.
  • 다운로드가 끝나면 redis 서비스의 컨테이너를 시작하고, 계속해서 webserver 서비스의 컨테이너가 시작됩니다.

 

로컬의 80번 포트로 접속하면 애플리케이션이 정상적으로 시작됩니다.

터미널을 하나 더 생성하여 작동중인 컨테이너의 상태를 확인할 수 있습니다.

$ docker-compose ps
       Name                     Command               State         Ports
--------------------------------------------------------------------------------
chap07_redis_1       docker-entrypoint.sh redis ...   Up      6379/tcp
chap07_webserver_1   python /opt/imageview/app.py     Up      0.0.0.0:80->80/tcp

 

 여러 컨테이너의 정지

Docker Compose 에서 관리하고 있는 컨테이너를 정지할 때는 다음 명령어를 사용합니다.

$ docker-compose stop
Stopping chap07_webserver_1 ... done
Stopping chap07_redis_1     ... done

Localhost:80에 접속하면 서비스가 정지된 것을 확인할 수 있습니다.

Docker Compose에서 이용한 리소스를 삭제하려면 다음 명령어를 실행합니다.

$ docker-compose down
Removing chap07_webserver_1 ... done
Removing chap07_redis_1     ... done
Removing network chap07_default

여러 의존관계에 있는 컨테이너들을 모아서 관리할 수 있는 것이 Docker Compose 입니다.

Docker Compose를 실행해보며 알아보았습니다.