Docker Compose를 활용한 컨테이너 관리 및 실전 적용

Docker Compose란 무엇이며 어떤 기능을 제공하나요? 어떤 문제점을 해결하나요?

정의

Docker Compose는 Docker에서 제공하는 도구로, 여러 개의 Docker 컨테이너로 구성된 애플리케이션을 쉽게 관리할 수 있도록 도와줍니다. 사용자는 YAML 형식의 설정 파일인 docker-compose.yml을 작성하여 컨테이너 간의 관계를 정의하고, 단일 명령어로 모든 컨테이너를 한 번에 실행하거나 종료할 수 있습니다.

해석하자면,

기능

Docker에서는 각 컨테이너가 하나의 서비스만을 실행하는 것을 권장합니다. 컨테이너는 리소스를 적게 소모하기 때문에, 각 서비스를 독립적으로 분리하는 것이 이상적입니다. 하지만 이 방식은 다음과 같은 문제를 야기합니다:

다운로드 위치

공식 사이트:

https://docs.docker.com/compose/compose-file/compose-file-v3/

공식 다운로드:

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

설치 절차:

1: 다운로드

curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

2: 권한 부여

chmod +x /usr/local/bin/docker-compose

3: 버전 확인

docker-compose --version

제거 절차:

rm /usr/local/bin/docker-compose

Compose의 핵심 개념

하나의 파일과 두 가지 요소:

하나의 파일: docker-compose.yml

두 가지 요소:

서비스(service): 주문 서비스, 재고 서비스, MySQL 컨테이너, Nginx 컨테이너 등 각각의 응용 프로그램 인스턴스

프로젝트(project): docker-compose.yml 파일 내에서 정의된 관련 컨테이너들의 집합으로 구성된 완전한 비즈니스 단위

Compose 사용 절차

1: 각각의 마이크로서비스 애플리케이션을 정의하고 이미지를 생성하는 Dockerfile 작성

2: docker-compose.yml 파일을 사용하여 전체 비즈니스 단위를 정의하고, 애플리케이션 내 모든 컨테이너 서비스를 구성

3: 마지막으로 docker-compose up 명령어를 실행하여 전체 애플리케이션을 시작하고 배포

Compose 주요 명령어

Compose를 통한 마이크로서비스 관리

요구사항 설명:

사용자 서비스는 추가, 삭제, 수정, 조회 기능을 제공합니다. 조회 시 캐시에 데이터가 없으면 데이터베이스에서 가져옵니다.

참고: 데이터베이스는 Docker 내 MySQL을 사용하며 Redis도 Docker 내부에서 운영됩니다.

Docker Compose 없이 작업하는 경우:

MySQL 컨테이너 시작:

docker run -d -p 3306:3306 --privileged=true -v /root/mysql/log:/var/log/mysql -v /root/mysql/data:/var/lib/mysql -v /root/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql57 mysql:5.7

Redis 컨테이너 시작:

docker run -p 6379:6379 --name reids608 --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf

로컬에서 사용자 마이크로서비스를 작성한 후 mvn package 명령어로 빌드하여 Docker 호스트에 업로드하고 이미지를 생성:

docker build -t order:1.0.2

이미지 실행:

docker run -d -p 6001:6001 be1face5d825

docker ps 명령어로 성공 여부 확인:

세 개의 서비스가 모두 실행되었음을 확인할 수 있었습니다.

따라서 다음과 같은 비교를 도출할 수 있습니다:

실행 후 Swagger 테스트:

Swagger UI 접근: 호스트 IP:포트/swagger-ui.html#

http://192.168.50.131:6001/swagger-ui.html#

정상적으로 접근 가능합니다. Swagger에서 새로운 사용자를 생성한 후 데이터베이스와 Redis에서 모두 조회 가능함을 확인했습니다.

위와 같은 과정은 문제가 없어 보이지만, Compose를 사용하지 않으면 어떤 문제가 발생할까요?

문제점은 다음과 같습니다:

1: 실행 순서가 고정되어 있어야 합니다. 먼저 mysql과 redis를 실행하고, 이후에 마이크로서비스 이미지를 실행해야 합니다.

2: 많은 run 명령어 사용

3: 컨테이너가 중단되거나 장애가 발생하면 IP 주소가 변경될 수 있으며, 이는 매핑 오류로 이어질 수 있습니다. 고정 IP를 사용하는 것도 가능하지만 권장되지 않습니다. 서비스 호출 방식을 사용하는 것이 좋습니다.

마이크로서비스가 많아질수록 관리가 어려워집니다. 따라서 Docker Compose 파일을 사용하여 통합 관리를 하겠습니다.

Docker Compose 파일 실전 적용

Docker Compose를 이용한 서비스 구성으로 한 번에 해결합니다.

절차:

1: docker-compose.yml 파일 작성

version: "3"
services:
microService:
image: order:1.0.2
container_name: ms01
ports:
  - "6001:6001"
volumes:
  - /app/microService:/data
networks:
  - kaigejava_net
depends_on:
  - redis
  - mysql
redis:
image: redis:6.0.8
ports:
  - "6379:6379"
volumes:
  - /app/redis/redis.conf:/etc/redis/redis.conf
  - /app/redis/data:/data
networks:
  - kaigejava_net
command: redis-server /etc/redis/redis.conf
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: '123456'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'db2021'
MYSQL_USER: 'kaigejava'
MYSQL_PASSWORD: 'kaigejava123'
ports:
  - "3306:3306"
volumes:
  - /app/mysql/db:/var/lib/mysql
  - /app/mysql/conf/my.cnf:/etc/my.cnf
  - /app/mysql/init:/docker-entrypoint-initdb.d
networks:
  - kaigejava_net
command: --default-authentication-plugin=mysql_native_password # 외부 접속 문제 해결
networks:
kaigejava_net:

파일 상세 설명:

version: v3 버전 사용

services: 서비스 정의

image: 이미지 이름:태그

container_name: 컨테이너 이름

ports: 포트 매핑

volumes: 데이터 볼륨 마운트 경로

networks: 네트워크 이름

depends_on: redis와 mysql에 의존

redis: Redis 관련 설정

mysql: MySQL 관련 설정

명령어 변환:

Redis와 MySQL도 동일하게 적용됩니다.

networks: kaigejava_net: 이는 docker network create kaigejava_net과 동일합니다.

2: 마이크로서비스 프로젝트 내에서 MySQL 및 Redis 연결 IP 수정. IP를 서비스 이름으로 변경

설정 파일을 업데이트한 후 다시 패키징합니다. 그 후 Docker 호스트에 업로드하여 새로운 이미지를 생성:

docker build -t order:1.0.2 .

3: docker-compose up 또는 docker-compose up -d 명령어 실행

주의: docker-compose.yml 파일이 있는 디렉터리에서 명령어를 실행하는 것이 좋습니다.

mysql, redis, ms01이 모두 정상적으로 실행됨을 확인할 수 있습니다.

컨테이너 이름을 지정한 order 서비스는 ms01으로 설정되었고, redis와 mysql은 자동으로 컨테이너 이름이 지정되지 않았습니다. 현재 디렉터리 이름을 접두사로 붙여서 생성됨을 확인할 수 있습니다.

정확히 작동하는지 확인합니다.

1: 네트워크에 kaigejava_net이 추가되었는지 확인

docker network ls

docker ps 명령어로 확인:

MySQL, Redis, 마이크로서비스가 모두 정상적으로 실행되었습니다.

4: MySQL 컨테이너 인스턴스에 접속하여 db2021 데이터베이스 및 t_user 테이블 생성

MySQL 클라이언트로 연결하면 db2021 데이터베이스가 이미 존재함을 확인할 수 있고, 테이블을 생성합니다:

CREATE TABLE `t_user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL DEFAULT '' COMMENT '',
`password` varchar(50) NOT NULL DEFAULT '' COMMENT '',
`sex` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0=1=',
`deleted` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '0=1=',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT=''

5: 테스트

사용자 추가 및 ID 기반 조회 페이지로 테스트 진행

모든 기능이 정상적으로 작동합니다. OK

6: 종료

docker-compose stop

한 번의 명령어로 모든 서비스 종료

결론

문제가 발생하면 개인 블로그(www.kaigejava.com)에 댓글을 남기거나, WeChat 공중번호(凯哥Java)에 메시지를 보내주세요.

이 시리즈 튜토리얼 바로가기

이 시리즈 튜토리얼은 다음과 같은 내용들이 포함되어 있습니다:

【도큐멘트 튜토리얼】Windows11에서 Docker Desktop 설치

【문제 해결】Windows에서 Docker Desktop 설치 후 이미지 위치 이동

【Docker 학습 시리즈】Docker 설치

【Docker 학습 시리즈】Docker 미러 설정

【Docker 학습 시리즈】Docker run 명령어의 동작 원리 및 가상 머신보다 빠른 이유

【Docker 학습 시리즈】Docker 명령어 - 시작 및 이미지 명령어

【Docker 학습 시리즈】Docker 명령어 - 컨테이너 명령어

【Docker 학습 시리즈】Docker 명령어 - 중요한 컨테이너 명령어

【Docker 튜토리얼 시리즈】Docker 이미지 이해

【Docker 튜토리얼 시리즈】Docker 이미지 commit 연습

【Docker 학습 튜토리얼 시리즈】로컬 Docker 이미지 Alibaba Cloud에 업로드

【Docker 학습 튜토리얼 시리즈】로컬 Docker 이미지 회사 미러 서버에 업로드

「Docker 학습 시리즈 튜토리얼」9 - Docker 컨테이너 데이터 볼륨 소개

「Docker 학습 시리즈 튜토리얼」10 - Docker 컨테이너 데이터 볼륨 예제

Docker 학습 11 - Docker 일반 방법으로 소프트웨어 설치

「Docker 학습 시리즈 튜토리얼」기초편 요약 및 고급편 예고

Docker 고급편 1 - Docker MySQL 마스터 슬레이브 복제 설치

Docker 고급편 2 - 분산 저장소 세 가지 알고리즘

Docker 고급편 2장 - 분산 저장소 실전 예제: 3 Master 3 Slave Redis 클러스터 확장 구성

Docker 고급편 2장 - 분산 저장소 실전 예제: 마스터 슬레이브 장애 전환 및 이동 사례

Docker 고급편: Redis 클러스터 실전! 4 Master 4 Slave 축소에서 3 Master 3 Slave로 처리 방법

Dockerfile 소개 및 자주 사용되는 지시어

Docker 고급편 3장 - Dockerfile 예제: 자신의 CentOS 이미지 제작

Docker의 dangling 이미지는 무엇인가요?

Docker 고급편: 실전 - 자신이 개발한 마이크로서비스를 Docker에서 실행하는 방법

Docker 네트워크 중간편 - Docker 네트워크의 네 가지 유형

【Docker 학습 튜토리얼 시리즈 요약】노트 및 문제 해결 문서

작은 혜택: 【凯哥优惠淘】

凯哥가 직접 개발한 외식, 택시, 커피, 쇼핑 등 다양한 할인 쿠폰을 받을 수 있는 공중번호【凯哥优惠淘】입니다. 아래 그림 참조:

안녕하세요, 저는凯哥Java(kaigejava)입니다. 기술 글을 공유하고 매일 업데이트하며, 여러분의 관심과 참여를 기다리고 있습니다. 함께 Java를 배우며 즐거움을 느껴보세요. 언제든지凯哥와 이야기 나눠주세요!

태그: docker Docker Compose microservices Container Orchestration YAML Configuration

8월 19일 09:54에 게시됨