1. docker-compose 란
2. docker-compose 사용 방법
2-1. docker-compose 설정 파일 작성
2-2. 컨테이너 실행 순서를 컨트롤하는 방법
3. docker-compose 실행 확인
1. docker-compose 란
docker-compose란 여러 개의 docker-container를 쉽게 관리하고 실행하기 위한 도구이다.
해당 글에서는 spring boot와 mysql을 연동하기 위해 docker-compose를 이용하였다.
* docker-compose의 컨테이너 연동 원리
연동 원리는 매우 간단하다. 이전 글에서 브릿지 네트워크를 생성한 뒤 해당 네트워크에 두 컨테이너를 포함시켜서
두 컨테이너를 연동 하였다.
docker-compose의 연동 원리도 똑같이 두 컨테이너를 동일 네트워크에 포함시키는 것이다.
하지만 docker-compose를 사용하면 따로 네트워크를 생성하여 두 컨테이너를 포함 시키는 작업을 하지 않아도 된다.
docker-compose를 사용하면 자동으로 브릿지 네트워크가 생기고 두 컨테이너는 해당 네트워크에 종속된다.
2. docker-compose 사용 방법
- 프로젝트 루트 경로에 docker-compose.yaml 파일을 생성한다.
- docker-compose.yaml 파일의 내용을 작성한다.=> 2-1번에서 자세히 다룸
- mysql db 생성 스크립트를 작성한다. => 2-2에서 자세히 다룸
- docker-compose up을 실행한다.
2-1. docker-compose 설정 파일 작성
먼저 코드는 이렇다.
version: '3'
services: # 컨테이너
db:
image: mysql
container_name: mysql-container2
environment:
MYSQL_ROOT_PASSWORD: 1234
MYSQL_DATABASE: helloDev
ports:
- "3307:3306"
command: --init-file /docker-entrypoint-initdb.d/init.sql
volumes:
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
spring-boot-app:
image: hellodev-image-compose
container_name: hellodev-container
ports:
- "8081:8081"
links:
- db
depends_on:
- db #spring-boot-app
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/helloDev
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=1234
* 각 코드에 대한 설명
service : 해당 compose에 컨테이너를 지칭한다.
db: 첫 번째 컨테이너인 mysql-container를 db라는 이름으로 표시
image: mysql 이미지를 사용하며 미리 생성해 놓은 mysql 이미지를 사용한다. (없으면 hub에서 다운로드)
container_name: compose up을 통해 생성될 mysql container 이름을 명시.
environment: 해당 container의 환경 설정 값을 명시
* command : 해당 container가 생성되면서 실행할 명령을 설정하는 것으로, 여기선 helloDev라는 DB를 생성하기 위해 사용한다. init.sql 파일 안에 create database helloDev라는 sql 명령어를 작성한 뒤 루트 폴더에 저장하였다.
* volumes: 위에서 spring boot 안에 있는 init.sql 파일을 컨테이너 내부 경로로 복사한다
=> 컨테이너 내부에서 해당 파일이 실행됨.
spring-boot-app: 두 번째 컨테이너인 spring-boot container를 spring-boot-app이라는 이름으로 표시
links: 위에 생성한 db 컨테이너와 연결을 설정한다.
depends_on:위에 생성한 db 컨테이너와 의존 관계를 맺어 db 컨테이너가 먼저 실행한 뒤 hellodev-container가 실행이 되는데 중요한 것은 시작 순서만 보장되지 끝나는 시점이 보장이 되지 않아 문제가 생길 수 있다.
2-2. 컨테이너 실행 순서를 컨트롤하는 방법
지금 저 위의 세팅으로 docker compose up을 실행하면 mysql container 설정이 끝나기 전에 spring boot 컨테이너가 실행되면서 DB 커넥션 에러가 발생하게 된다.
위의 문제를 해결하기 위해 필자는 두 가지 방법을 찾아서 해결해 보았다.
1. spring-boot-app 하위의 추가 설정으로 restart: always를 추가한 뒤 실행하면 spring boot container가 정상적으로 실행이 될 때까지 작업을 반복한다.
2. mysql 컨테이너를 먼저 실행한 뒤 spring boot 컨테이너를 실행하는 방법으로 인텔리제이의 기능을 사용하였다.
* 아래의 빨간색으로 표시한 버튼을 누르면 각각 실행할 수 있다.
3. docker-compose 실행 확인
위의 1,2번 방법 중 하나를 통해 성공적으로 docker-compose를 실행했다면 우선 두 컨테이너가 동일 네트워크에 포함되는지 확인한다.
1. docker network ls 입력
2. 프로젝트명_default라는 이름의 네트워크가 생성된 것이 확인되고 해당 이름을 통해 상세 조회 한다.
=> docker network inspect hellodevteam_default 입력
관련 글
'Docker' 카테고리의 다른 글
Spring boot + Docker linux에 배포 (0) | 2023.08.31 |
---|---|
Docker spring boot mysql 연동 자세히 설명 (4) | 2023.08.28 |
Spring boot 도커 파일 생성 및 배포 (0) | 2023.08.28 |