도커 컴포즈
: 여러 개의 컨테이너를 동시에 실행하고 관리하는 툴
: 여러 컨테이너로 구성된 애플리케이션을 관리
: 주로 단일 호스트 환경에서 사용
도커 스웜
: 클러스터를 구축하여 여러 개의 컨테이너를 관리하는 툴
: manager 노드와 worker 노드로 나누어 컨테이너를 관리
: 주로 멀티 호스트 환경에서 사용
: 호스트에 대한 컨테이너 배치 및 서로 다른 호스트의 컨테이너간 통신 등 조율
※ 도커 컴포즈 설치
: 도커 컴포즈 깃허브 (https://github.com/docker/compose)에서 설치
=> README 참조 (최신버전 확인)
ㆍ도커 컴포즈 설치
: curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
ㆍ실행권한 부여
: chmod +x /usr/local/bin/docker-compose
ㆍ도커 컴포즈 버전 확인
: docker-compose --version
# 도커 컴포즈 버전 (필수)
version: '3.8'
# 서비스 선언 (필수)
services:
# 실행할 이미지 / 포트 및 내부 네트워크 등
main:
image: 2mukee/mh_main_image:1.39
ports:
- 443:17260
networks:
- mh_network
# 의존성 (db가 실행된 후 main이 실행)
depends_on:
- db
db:
image: 2mukee/mh_db_image:1.1
ports:
- 27107:27107
networks:
- mh_network
api:
image: 2mukee/mh_api_image:1.00
networks:
- mh_network
depends_on:
- main
# 네트워크 선언 (선택사항) / 서비스들을 하나의 네트워크로 묶기 위함
# docker network create --gateway 172.22.0.1 --subnet 172.22.0.0/16 mh_network
networks:
mh_network:
external: true
도커 컴포즈 파일 예시
: 파일명은 반드시 docker-compose.yml로 해야함
: version의 경우 버전마다 문법이 다르니 반드시 도커엔진의 버전을 확인 후 기재
=> 참조 (https://docs.docker.com/compose/compose-file/compose-file-v3/)
ㆍ컴포즈 내 서비스들을 하나로 묶기 위한 네트워크 브릿지 생성
: docker network create --driver=bridge --gateway 172.22.0.1 --subnet 172.22.0.0/16 mh_network
: docker network create --driver=bridge --gateway 172.xx.0.1 --subnet 172.xx.0.0/16 <네트워크명>
ㆍ도커 컴포즈 실행 (docker-compose.yml이 있는 디렉터리에서 실행)
: docker-compose up --build -d
ㆍ도커 컴포즈 종료
: docker-compose down
도커 스웜으로 도커 컴포즈 실행
ㆍ네트워크 브릿지 변경
: docker network rm mh_network
: docker network create --scope=swarm --driver=overlay --gateway 172.22.0.1 --subnet 172.22.0.0/16 mh_network
=> network scope에 반드시 swarm이 있어야함
ㆍ스택 배포
: docker stack deploy -c <yml파일> <스택이름>
: yml파일의 이름은 ~~~.yml 형식
: docker swarm init 를 통해 스웜모드를 시작한 후 실행 가능
: -c 옵션은 --compose-file이라는 의미
: 스택 이름에는 .이 들어가서는 안됨
ㆍ스택 확인
: docker ps
: docker service ls
version: '3.8'
services:
main:
image: 2mukee/mh_main_image:1.41
ports:
- 443:17260
depends_on:
- db
db:
image: 2mukee/mh_db_image:1.11
ports:
- 27107:27107
- 27106:27106
api:
image: 2mukee/mh_api_image:1.12
depends_on:
- main
- db
고정된 네트워크로 컨테이너 접속하기
: 도커 컴포즈 version 3의 경우 yml 파일에 명시된 서비스명으로 해당 컨테이너에 접속 가능
: 따로 networks 설정을 하거나 네트워크 인터페이스를 생성하지 않고 기본 네트워크 만으로 생성가능
: 위 파일 작성 후 docker stack deploy -c docker-compose.yml <스택명>만 해줘도 정상 작동
: mongodb 연동시 링크를 mongodb://db:27107 라고 설정해야함
※ 도커 스택과 도커 컴포즈의 차이
ㆍDocker Compose
: 컨테이너를 정의 하는 것
: docker-compose 명령이 실행되는 순간에만 컨테이너를 관리
: 지속적인 모니터링 기능이 없어 컨테이너가 5분안에 예기치 않게 종료 될 시 컨테이너를 재시작할 수 없음
ㆍDocker Stack
: Service를 정의하는 것 (최상위 단위
: Service라는 개념은 docker version 1.12 이후 도입된 개념
: 도커 스웜을 통해 관리 되는 개념
: 컨테이너의 상태 이상 발생시 조치 가능 (모니터링 지원)
: compose file version 3.0 이상부터 지원
오류해결법
※ container_name: Setting the container name is not supported.
: 도커 컴포즈 파일의 container-name 항목 삭제
※ Docker stack deploy support is limited to networks with scope=swarm
: 기존 network 인터페이스를 삭제하고 swarm으로 변경
: docker network create --scope=swarm --driver=bridge --gateway 172.xx.0.1 --subnet 172.xx.0.0/16 <네트워크명>
※ Error response from daemon: rpc error: code = InvalidArgument desc = name must be valid as a DNS name component
: 스택이름으로 인한 에러
: 스택이름에 . 넣지 말 것
Refference
'Container > Docker Swarm' 카테고리의 다른 글
도커 스웜 기초 (0) | 2021.09.16 |
---|