[docker] 다중 컨테이너 한번에 구성하기

오현우·2022년 7월 26일
0

docker

목록 보기
11/11

docker compose

어플리케이션은 여러개의 도커 컨테이너가 협력하면서 동작한다.
구체적으로 도커 컴포즈는 여러 컨테이너를 모아서 관리하기 위한 툴이다.

docker compose는 yaml 파일을 기반으로 정의한 내용을 바탕으로 컨테이너를 띄운다.

YAML 구조화된 데이터를 표현하기 위한 데이터 포맷!

구체적으로 어떤 방식으로 서비스를 배포하는지 궁금하다면 아래의 링크를 찾아보자.

airflow docker로 빌드하기
https://velog.io/@hyunwoozz/airflow-Covid-19-ETL-by-bigquery-1

도커 컴포즈 왜 필요할까?

위의 에어 플로우에서도 총 4가지의 컨테이너가 동작한다.
해당 컨테이너들은 모두 의존관계가 존재하고, 해당 컨테이너마다 시작 정지 등을 모두 관리하면서 운용하면 매우 복잡하진다.

때문에 일괄적이면서 한번에 통제할 수 있는 도커 컴포즈는 실제 서비스에서 많이 사용한다.

참고할 REFERENCES 및 팁

https://docs.docker.com/compose/
앞으로 나올 내용들은 위의 링크에서 확인이 가능하다.

  • docker compose , docker-compose 모두 사용가능하나,
    현재 v2가 나오면서 docker compose를 사용하는게 적절하다.

간단한 실습

여기의 글에서는 도커 컴포즈에 대한 응용 방법에 대해서 다룰 예정이다.
때문에 실습의 경우는 아래의 페이지를 참조하며 진행하자.

아래의 페이지를 따라가다 보면 자연스럽게 flask를 통해 웹 서버를 구축할 수 있다.

https://docs.docker.com/compose/gettingstarted/

도커 컴포즈를 활용한 DIY 빌드

도커 컴포즈는 우리가 기존에 작성한 도커파일 및 다양한 이미지를 바탕으로 여러 컨테이너들을 동시에 빠르게 띄울 수 있다.

이러한 빠른 빌드 구성이 어떻게 이루어 지는지 살펴보자.

진행하기 전에 YAML 간단리뷰

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.. 같이 일일히 타이핑하며 빌드 및 컨테이너 실행할 필요가 없으며 컴포즈 전에 모두 눈으로 확인할 수 있으므로 오류의 가능성도 많이 줄여준다.

마무리

도커 컴포즈에 관한 명령어는 직접적으로 리뷰하지는 않겠다.
해당 관련 부분은 이미 공식 독스에서 찾아보는 것이 더욱 적절하기 때문이다.

도커 컴포즈는 일관되게, 안정적으로, 빠르게 여러컨테이너를 띄울 수 있게하는 아주 좋은 툴이다. 때문에 싱글 머신에서 다양한 환경을 구축하거나, 다른 머신에서 동일한 다양한 환경을 구축하고 싶을 때 아주 적절해 보인다.

profile
핵심은 같게, 생각은 다르게

0개의 댓글