Docker compose 로 Spring, MySQL 연동하기 (에러 : docker: 'compose' is not a docker command, docker desktop 삭제 및 설치)

rivkode·2024년 1월 12일
0

이전 글에 이어 docker compose에 대해 다뤄보도록 하겠습니다.

이번 내용에 대한 최종 목표는 CI/CD 입니다.

앞서 설명한 내용들을 간략히 정리하면 아래와 같습니다.

  1. Spring, MySQL 이미지 만들기
  2. 이미지를 컨테이너화 하기
  3. Postman으로 요청, 응답 받기

이전 글에서는 이미지를 컨테이너화 하는 과정에서 모두 명령어 입력을 통해 네트워크를 생성, 이미지 -> 컨테이너화와 같이 진행하였지만 이번에는 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

  • 버전은 Compose의 버전이며 Docker 엔진에 따라 사용가능한 버전이 존재합니다.
    (처음에는 임의로 정하는 버전인줄 알았으나 아니었습니다)

services

  • docker compose 로 생성할 컨테이너 옵션을 정의합니다. services의 하위 항목으로 정의하게 되면 각 서비스들은 컨테이너로 구현이 되며 도커 컴포즈에 의해 관리됩니다.

image

  • service의 컨테이너를 생성할때 사용하는 이미지의 이름을 의미합니다. 만약 존재하지 않는다면 docker hub에서 pull 받은 뒤 실행합니다.
    (저의 경우 mysql:8.0.22 를 pull 받고 mysql:8로 명시하여 계속 mysql 8 버전을 pull 받았었습니다.)

links

  • docker run 명령어의 --link와 같으며 서비스명으로 접근이 가능하도록 합니다.

environment

  • docker 명령어의 -e 옵션과 동일하며 service 컨테이너 내부에서 사용할 환경변수를 지정합니다.
    예를 들어
services:
  database:
    container_name: preonb_db
    image: mysql:8.0.22
    environment:
      MYSQL_DATABASE: test_db
      MYSQL_USER: root
      MYSQL_PASSWORD: root

와 같이 설정할 수 있습니다

depends_on

  • 특정 service 컨테이너에 대한 의존관계를 의미하며, 해당 컨테이너가 먼저 생성 된 후 실행되는 것을 의미합니다. 아래에서는 database가 먼저 생생된 뒤 application이 생성됩니다.
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 down

docker 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

0개의 댓글