본문 바로가기

Development/Tip

[Docker]docker, docker swarm, docker compose 간단 정리

Concepts

애플리케이션의 개발, 배포, 실행을 컨테이너를 통해 가능하게 해주는 플랫폼.

컨테이너란 개념은 새로운 것이 아니며, 이전과 달리 새로운 것은 어플리케이션을 쉽게 컨테이너를 통해서 배포하게 해줌.

 

Container? Image?

컨테이너는 실행되고 있는 이미지에 의해 launch 된다.

 

Image

런타임, 라이브러리, 환경 변수, 설정 등 즉 어플리케이션을 실행하기 위한 모든 것을 포함하는 실행 가능한 패키지

Container

실제로 이미지 위에서 실행되고 있는 런타임 인스턴스

 

Container VS VM

 

이미지 출처: https://dockerlabs.collabnix.com/beginners/difference-docker-vm.html

VM의 경우 각각 자신만의 OS를 갖고있음

컨테이너는 기존의 OS 위에서 구동됨

 

 

Dockerfile?

Container의 환경을 정의하는 파일 

# syntax=docker/dockerfile:1
FROM python:3.7-alpine # 설치할 이미지
WORKDIR /code # 작업 디렉토리 설정
ENV FLASK_APP=app.py 
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt # 컨테이너 종속성 설치
EXPOSE 5000 # 외부 호스트와 컨테이너를 노출 시킬 포트 설정
COPY . . # 현재 디렉토리의 모든 파일을 애플리케이션 이미지로 복사
CMD ["flask", "run"]# 컨테이너 실행시 커맨드 입력

*AWS ec2에 배포할 경우, Inbound EXPOSE한 포트 번호의 규칙을 추가해야 할 수 있음 

 

관련 명령어

docker 이미지 실행

docker run -p {외부 연결 요청 포트}:{연결할 이미지 포트} {image name}

docker container ls 컨테이너 목록

docker container stop {컨테이너 id}

docker push {username}/{repository}:{tag} remote 레포지토리에 배포

자세한 내용

https://docs.docker.com/engine/reference/commandline/cli/

 

Use the Docker command line

 

docs.docker.com

 

Services

어플리케이션을 구성하는 조각들로 봄

ex) 비디오 공유 사이트의 경우 애플리케이션을 저장하는 db 컨테이너, 프론트엔드 컨테이너, 비디오 트랜스코딩하는 컨테이너 등등등이 필요함

여러 컨테이너가 하나의 서비스를 위해 정의를 하게됨

 

docker-compose.yml

services:
  web:
    build: . # 현재 디렉토리의 Dockerfile을 사용하여 이미지를 빌드
    ports:
      - "8000:5000" # 외부 호스트에서 8000번 포트로 들어오면 내부 컨테이너 포트 5000번으로 연결
  redis:
    image: "redis:alpine" # Redis의 alpine 버전 이미지를 사용, 이미지는 docker hub에서 가져옴

 

Docker swarm

node(물리적인 또는 가상 머신)들의 집합인데, docker 클러스터 관리와 orchestration 기능들을 제공함

docekr-compose 파일에 설정

 

Docker는 하나의 호스트 또는 swarm 모드에서 실행 가능함

 

관련 명령어

docker swarm init # swarm 모드 클러스터가 생성

docker swarm join --token {token} {ip:port} # 머신이 스웜 클러스터에 조인되어 클러스터의 일부가 됨,이 때 머신의 포트 오픈 필요

docker node ls # 현재 swarm 클러스터에 속한 모든 노드의 목록을 확인

docker swarm leave # 해당 노드가 클러스터에서 제거

 

하나의 물리적 머신이 5개의 컨테이너만 돌릴 수 있을때,

100개의 컨테이너를 돌리고 싶으면 여러 머신에서 Docker Swarm을 사용하여

하나의 호스트를 사용하는 것 처럼 그룹화 하고 자동으로 부하 관리를 함 (Orchestration)

 

Docker Stack

여러 개의 서비스가 각각 연관되어 실행되도록 함 

swarm이 머신 단위라면 stack은 서비스 단위

docker-compose.yml 파일로 설정 

docker stack deploy -c docker-compose.yml {서비스이름} 서비스에 이름 부여

 

관련 명령어

docker service ls # 실행중인 서비스 목록 확인 

docker service ps {서비스 이름} # 각 태스크의 상태, 할당된 노드, 현재 상태 등을 표시

docker stack ps {서비스 이름} # Docker 스택 내에서 실행 중인 특정 서비스의 태스크 목록을 확인

docker stack rm {서비스 이름} # Docker 스택 내에서 실행 중인 서비스와 관련된 모든 컨테이너와 리소스를 제거

docker swarm leave --force # swarm 모드 종료

 

docker compose

Docker 애플리케이션의 여러 컨테이너를 정의하고 구동시키기 위한 툴

 

사용을 위한 과정 

1. 애플리케이션 환경 설정 (Dockerfile)

2. docker-compose.yml로 서비스 설정

3. docker-compose 실행

 

서비스 실행 명령어

docker compose up

 

Bind mount를 위한 docker-compose.yml 수정

services:
  web:
    build: .
    ports:
      - "8000:5000" 
    volumes: # 추가된 부분
      - .:/code
    environment: #추가된 부분
      FLASK_DEBUG: "true"
  redis:
    image: "redis:alpine"

volumes: 해당 디렉토리에 mount하여 이미지를 다시 빌드하지 않아도 코드를 실시간으로 수정 가능하게 함

environment: 위 코드의 경우 flask의 debug 모드로 Dockerfile에서 CMD를 실행

 

 

 

참고 자료

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

 

Try Docker Compose

 

docs.docker.com

https://codeblog.dotsandbrackets.com/docker-stack/

 

docker-compose for Swarm: docker stack - Dots and Brackets: Code Blog

Among the other commands brought by Docker in Swarm mode there is docker stack, which, believe it or not, works almost the same as docker-compose. With litt

codeblog.dotsandbrackets.com