이전 글에 이어 docker compose에 대해 다뤄보도록 하겠습니다.
이번 내용에 대한 최종 목표는 CI/CD 입니다.
앞서 설명한 내용들을 간략히 정리하면 아래와 같습니다.
이전 글에서는 이미지를 컨테이너화 하는 과정에서 모두 명령어 입력을 통해 네트워크를 생성, 이미지 -> 컨테이너화와 같이 진행하였지만 이번에는 docker-compose를 이용해서 진행해보도록 하겠습니다.
먼저 docker-compose를 진행하기 위해 로컬에 설치된 docker-compose의 버전을 확인해줍니다.
docker-compose -v
저는 이 과정이 처음부터 진행되지 않았습니다.
구글링해본 결과 분명 Docker Desktop을 설치하면 함께 docker-compose가 설치된다고 명시되어있는데 저의 경우 아래 에러가 발생하였습니다.
docker: 'compose' is not a docker command
수동으로도 설치를 시도해보고, repository를 통해 시도해보았지만 모두 실패하였고 결국 Docker desktop을 삭제 후 다시 재설치를 하니 정상동작하였습니다.
삭제는 제어판
에 들어가셔서 삭제하시면 되며 docker desktop 설치는 아래 보이는 Docker desktop for Windows를 클릭하신 뒤 설치를 진행해주시면 됩니다.
docker compose가 설치가 완료되셨다면 이제 docker compose를 통해 컨테이너 생성을 진행해보겠습니다.
docker compose는 다른 특별한 기능이 아닌 이전 글에서 명령어로 컨테이너를 생성하였던 내용을 script를 통해 명령어를 입력하지 않고 실행하는 것입니다.
아래는 docker-compose.yml 파일 예시입니다.
version: '3'
services:
database:
container_name: preonb_db
image: mysql:8.0.22
restart: unless-stopped
environment:
MYSQL_DATABASE: test_db
MYSQL_USER: root
MYSQL_PASSWORD: root
MYSQL_ROOT_HOST: '%'
MYSQL_ROOT_PASSWORD: root
TZ: 'Asia/Seoul'
ports:
- "13306:3306"
volumes:
- ./mysql/conf.d:/etc/mysql/conf.d
command:
- "mysqld"
- "--character-set-server=utf8mb4"
- "--collation-server=utf8mb4_unicode_ci"
networks:
- preon_net
application:
container_name: preonb
image: preonb:latest
build:
context: ./
dockerfile: Dockerfile
ports:
- "8080:8080"
restart: on-failure
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://preonb_db:3306/test_db?useSSL=false&allowPublicKeyRetrieval=true
SPRING_DATASOURCE_USERNAME: "root"
SPRING_DATASOURCE_PASSWORD: "root"
depends_on:
- database
networks:
- preon_net
networks:
preon_net: {}
제가 에러가 발생했던 부분은 MYSQL_USER, MYSQL_PASSWORD 부분 입니다.
DB는 계속 실행되고 있는데 Spring 프로젝트가 5초단위로 계속 꺼졌다 켜졌다를 반복하였습니다.
자세히 보니 Connection Failure
이 발생하였었고 MYSQL_USER
, MYSQL_PASSWORD
를 설정하지 않은것이 원인이었습니다.
위와 같이 설정하니 정상적으로 동작하였습니다.
아래에서 설정파일들에 대해 살펴보겠습니다.
version
services
image
links
environment
services:
database:
container_name: preonb_db
image: mysql:8.0.22
environment:
MYSQL_DATABASE: test_db
MYSQL_USER: root
MYSQL_PASSWORD: root
와 같이 설정할 수 있습니다
depends_on
services:
database:
container_name: preonb_db
image: mysql:8.0.22
application:
container_name: preonb
image: preonb:latest
depends_on
- database
Docker compose 명령어는 아래와 같습니다.
docker build
docker-compose up --build포그라운드에서 docker compose 실행 (백그라운드에서 실행시 -d 추가)
docker-compose up실행중인 docker compose 종료 (볼륨도 함께 종료시 -v 추가)
docker-compose downdocker compose 목록 확인
docker-compose ps
Postman 테스트
POST /api/v1/post
GET /api/v1/post/1?companyId=1
이렇게 docker compose를 활용하여 로컬에서 spring 프로젝트와 MySQL을 연동해보았습니다.
다음장에서는 Github Actions를 활용하여 CI/CD를 진행해보도록하겠습니다.
references