ETC/Docker

Spring Boot 와 Docker (MySQL, Redis)

elevne 2023. 7. 2. 10:35

프로젝트에 사용되는 Redis, MySQL DB 를 도커를 활용하여 띄워서 사용하기로 하였다. 이후에 다른 프로그램들을 추가적으로 사용하게 되었을 때 그러는 편이 편리할 것으로 생각되었기 때문이다. 우선 Docker desktop 을 설치해주고, MySQL 과 Redis 이미지를 pull 받는다.

 

 

docker pull redis
docker pull mysql

 

 

한 번에 여러 개의 컨테이너를 실행해야 하기 때문에, 명령어를 한 번에 실행할 수 있는 도커 컴포즈 파일을 작성해야했다. (도커 컴포즈는 시스템 구축에 필요한 설정은 yml 포맷으로 기재한 정의 파일을 이용해 전체 시스템을 일괄 실행 또는 일괄 종료 및 삭제할 수 있는 도구) Docker-composedocker run 명령어를 여러 개 모아놓은 것과 같으며, 컨테이너와 주변 환경 (네트워크, 볼륨) 을 함께 생성할 수 있다. (Dockerfile 은 이미지를 만들기 위한 것으로 네트워크나 볼륨을 만들 수 없다)

 

 

아래와 같이 docker-compose.yml 파일을 작성하였다.

 

 

version: "3"
services:
  mysql:
    image: mysql
    environment:
      MYSQL_DATABASE: board
      MYSQL_ROOT_PASSWORD: 1234
      MYSQL_ROOT_HOST: "%"
    ports:
      - 3306:3306
    volumes:
      - mysql-data:/var/lib/mysql
    restart: always
    networks:
      - board_network
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
  redis:
    image: redis
    ports:
      - 6379:6379
    restart: always
    networks:
      - board_network
networks:
  board_network:
volumes:
  mysql-data: {}

 

 

 

파일 이름은 항상 docker-compose.yml 이라고 짓는다. -f 옵션을 이용해서 파일 이름을 지정하면 다른 이름을 사용할 수도 있지만 그렇지 않다면 정해진 이름을 사용해야 한다. 첫 줄에는 도커 컴포즈 버전을 기재한다. 그 다음으로는 주 항목 services, networks, volumes 아래에 설정 내용을 기재하게 된다. 항목 간의 상하관계는 공백을 사용한 들여쓰기로 나타내며, 들여쓰기는 같은 수의 배수만큼의 공백을 사용해야 한다. 여러 항목을 기재하기 위해서는 '-' 을 붙여 사용하며, 이름 뒤에는 콜론(:)을 붙인다. 위에는 사용되지 않은 항목으로 "depends_on" 옵션은 다른 서비스에 대한 의존관계를 정의할 때 사용할 수 있다. 또, 위 사용된 "restart" 옵션은 컨테이너 종료 시 재시작 여부를 설정하는데 사용된다. ("no":재시작하지 않음/"always":항상 재시작/"on-failure":프로세스가 0 외의 상태로 종료됐다면 재시작/"unless-stopped":종료 시 재시작하지 않음. 그 외에는 재시작) 물론 위에서 언급된 항목들 외에도 container_name, dns, env_file... 등 훨씬 많은 옵션들을 사용해볼 수도 있다. 

 

 

 

위와 같이 작성된 dokcer-compose 파일은 아래 명령어로 실행된다.

 

docker-compose up --build -d

 

 

위는 도커 컴포즈 파일이 작성된 경로에서 실행된 명령어이다. (다른 곳에서 실행하고자 한다면 -f 옵션으로 파일 경로를 넣어주면 된다) -d 옵션은 백그라운드로 실행되게끔 한다. 그 외에도 실행 시 아래와 같은 옵션들을 더해줄 수 있다.

 

 

옵션 내용
--no-color 화면 출력 내용을 흑백으로 함
--no-deps 링크된 서비스를 실행하지 않음
--force-recreate 설정 또는 이미지가 변경되지 않더라도 컨테이너를 재생성
--no-create 컨테이너가 이미 존재할 경우 다시 생성하지 않음
--no-build 이미지가 없어도 이미지를 빌드하지 않음
--build 컨테이너를 실행하기 전에 이미지를 빌드
--abort-on-container-exit 컨테이너가 하나라도 종료되면 모든 컨테이너를 종료
-t, --timeout 컨테이너를 종료할 때의 타임아웃 설정. 기본을 10초.
--remove-orphans 컴포즈 파일에 정의되지 않은 서비스의 컨테이너를 삭제
--scale 컨테이너의 수를 변경

 

 

 

컨테이너 종료 및 삭제할 때는 down 커맨드를 사용할 수 있다. (볼륨과 이미지는 삭제되지 않는다) 삭제하지 않고 종료만 시킬 때는 stop 커맨드를 사용한다. (kill 커맨드로 강제 종료시킬 수도 있다)

 

 

추가로 도커 컴포즈 컨테이너 내에서 커맨드를 실행시키고자 한다면, docker-compose exec container_name bash 와 같은 형식의 명령으로 bash 를 실행시킬 수 있다.

 

 

 

도커 컴포즈로 실행한 컨테이너 역시 도커 엔진을 통해 관리할 수 있다. 단, 도커 컴포즈로 실행한 컨테이너의 이름은 임의로 결정된다. (e.g., com_folder 에 둔 컴포즈 파일을 이용해 penguin 이라는 이름의 컨테이너를 생성하면 도커 컴포즈가 실제로 생성한 컨테이너의 이름은 com_folder_penguin_1 과 같이 폴더 이름과 번호가 붙는다) 컨테이너 이름에 폴더 이름이나 번호가 붙어도 도커 컴포즈를 통해 컨테이너를 지정할 때는 원래 이름을 사용할 수도 있다. 이렇게 번호가 붙은 컨테이너 이름은 도커 엔진을 통해 컨테이너를 관리하거나, 같은 구성의 컨테이너를 여러 세트 실행했을 때 사용된다. (도커 엔진을 통해 컨테이너를 다룰 때는 ps 커맨드로 먼저 실케 컨테이너 이름을 확인한다!)

 

 

같은 구성의 컨테이너를 여러 세트 만들고 싶다면 up 커맨드에 --scale 옵션을 붙이면 된다. 예를 들어 아래와 같은 명령어를 명령어를 입력하면 com_folder_pengui_1, 2, 3 과 같이 3 개의 컨테이너가 생성된다고 한다.

 

 

docker-compose -f 경로 up --scale penguin=3

 

 

같은 구성의 컨테이너를 여러 세트 실행시키는 것은 쿠버네티스를 사용하는 편이 더욱 편리하기는 하다. 

 

 

 

위와 같이 컨테이너를 실행시킨 후 Spring-boot 프로젝트를 실행시켰을 때 잘 동작하는 것을 확인할 수 있다.

 

 

result