어플리케이션은 여러개의 도커 컨테이너가 협력하면서 동작한다.
구체적으로 도커 컴포즈는 여러 컨테이너를 모아서 관리하기 위한 툴이다.
docker compose는 yaml 파일을 기반으로 정의한 내용을 바탕으로 컨테이너를 띄운다.
YAML
구조화된 데이터를 표현하기 위한 데이터 포맷!
구체적으로 어떤 방식으로 서비스를 배포하는지 궁금하다면 아래의 링크를 찾아보자.
airflow docker로 빌드하기
https://velog.io/@hyunwoozz/airflow-Covid-19-ETL-by-bigquery-1
위의 에어 플로우에서도 총 4가지의 컨테이너가 동작한다.
해당 컨테이너들은 모두 의존관계가 존재하고, 해당 컨테이너마다 시작 정지 등을 모두 관리하면서 운용하면 매우 복잡하진다.
때문에 일괄적이면서 한번에 통제할 수 있는 도커 컴포즈는 실제 서비스에서 많이 사용한다.
https://docs.docker.com/compose/
앞으로 나올 내용들은 위의 링크에서 확인이 가능하다.
여기의 글에서는 도커 컴포즈에 대한 응용 방법에 대해서 다룰 예정이다.
때문에 실습의 경우는 아래의 페이지를 참조하며 진행하자.
아래의 페이지를 따라가다 보면 자연스럽게 flask를 통해 웹 서버를 구축할 수 있다.
도커 컴포즈는 우리가 기존에 작성한 도커파일 및 다양한 이미지를 바탕으로 여러 컨테이너들을 동시에 빠르게 띄울 수 있다.
이러한 빠른 빌드 구성이 어떻게 이루어 지는지 살펴보자.
base: &base
name: Everyone has same name
age: 5
foo: &foo
<<: *base
bar: &bar
<<: *base
age: 20
변수 선언은 & 를 통해 진행한다.
변수 사용은 * 을 통해 진행한다.
<< 를 통해 덮어 쓰기를 시작한다고 알린다.
덮어쓰기를 진행하는데 해당 키쌍이 존재하는 경우 기존의 상태를 유지한다.(bar age 참조)
foo:
name: Everyone has same name
age: 5
bar:
name: Everyone has same name
age: 20
우리는 BASE image가 항상 필요하다.
이 베이스 이미지를 통해 기본 운영체제 및 일괄적인 환경세팅을 한 후 세부적인 컨테이너들을 띄운다.
구체적으로 우리 프로젝트에 사용한 도커 구성을 살펴보자.
version: '3'
services:
nginx:
container_name: nginx
build: ./nginx
restart: always
ports:
- "80:80"
volumes:
- ./MeowBowWow2emoji:/srv/docker-server
- ./log:/var/log/nginx
depends_on:
- django
networks:
- backend
django:
runtime: nvidia
environment:
- NVIDIA_VISIBLE_DEVICES=all
container_name: django
build: ./MeowBowWow2emoji
restart: always
command: uwsgi --ini uwsgi.ini
volumes:
- ./MeowBowWow2emoji:/srv/docker-server
- ./log:/var/log/uwsgi
ports:
- "8000:8000"
networks:
- backend
networks:
backend:
driver: bridge
위의 구성은 우리가 프런트 앤드 서버와 백엔드 서버 컨테이너를 정의한 파일이다.
해당 내용에서 build 부분이 바로 BASE image 이다.
구체적으로 BASE image를 살펴보면 아래와 같다.
FROM node:lts-alpine as builder
RUN mkdir /srv/docker-server
WORKDIR /srv/docker-server
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:stable-alpine
RUN rm -rf /etc/nginx/conf.d/default.conf
COPY --from=builder /srv/docker-server/nginx.conf /etc/nginx/conf.d/default.conf
RUN rm -rf /usr/share/nginx/html/*
COPY --from=builder /srv/docker-server/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
구체적인 내용은 언급하지는 않겠지만 해당 내용을 살펴보면 다음과 같다.
node.js를 빌더로 사용하여 우리가 필요한 부분을 빌드하여 바이너리만 받아온 뒤 빌더 부분은 다시 제외시키고 구현한 바이너리들을 엔진엑스에 올려서 웹서버를 구축하는 도커 파일이다. daemon off는 컨테이너라 포어 그라운드로 돌려도 무방하다고 생각했던 것 같다.
이처럼 프런트 서버는 해당 이미지를 바탕으로 엔진엑스 서비스를 정의하고 도커 컴포즈에 넘겨주면 우리가 cli 환경에서
docker container run [image] -p port:port others..
같이 일일히 타이핑하며 빌드 및 컨테이너 실행할 필요가 없으며 컴포즈 전에 모두 눈으로 확인할 수 있으므로 오류의 가능성도 많이 줄여준다.
도커 컴포즈에 관한 명령어는 직접적으로 리뷰하지는 않겠다.
해당 관련 부분은 이미 공식 독스에서 찾아보는 것이 더욱 적절하기 때문이다.
도커 컴포즈는 일관되게, 안정적으로, 빠르게 여러컨테이너를 띄울 수 있게하는 아주 좋은 툴이다. 때문에 싱글 머신에서 다양한 환경을 구축하거나, 다른 머신에서 동일한 다양한 환경을 구축하고 싶을 때 아주 적절해 보인다.