개발자 데뷔!

Docker배포2 - (Docker-Compose.yml 작성) 본문

DevOps/Docker

Docker배포2 - (Docker-Compose.yml 작성)

물꼮이 2024. 4. 2. 08:42

 

도커 컴포즈 파일은, 
서버 상에서 필요한 모든 도커 컨테이너를 실행시키는 명령어를 묶어서 
한번에 실행시킬 수 있도록 만든, 스크립트 파일의 역할을 한다. 
터미널 명령어를 어떻게 Docker Compose 파일로 정리할지 알아보자. 

 

 

실행시켜야 할 도커 컨테이너는 아래 두개이다. 

  • 데이터베이스 (MySQL)
  • 백엔드 (SpringBoot)

위 두 컨테이너를 실행시키기 위해, 나는 서버 터미널에서 아래 두 명령어를 실행하고, 잘 동작함을 확인했었다. 

# DataBase 컨테이너 실행
docker run -d --name {실행할 이미지이름}:{태그버전} -e MYSQL_ROOT_PASSWORD={DB접속 비밀번호} -e MYSQL_DATABASE={DB명} -p 3306:3306 {실행될 컨테이너이름}:{태그버전}

# Backend 컨테이너 실행
sudo docker container run --detach --publish 80:8080 {도커허브id}/{실행할 이미지이름}:{태그버전}

(Database 세팅 옵션의 db명이나, 비밀번호는, 기존 로컬 백엔드에서 db설정했던 부분 ex_ application.properties 참고하여 작성하면 된다.)

 

컨테이너의 포트 연결은, {외부에서 접속할 포트}:{컨테이너 내부의 포트} 라고 생각해주면 된다. 

 

 

 

위 명령어 두개를  docker-compose.yml 로 작성하면 아래와 같다. 

파일명은 반드시. docker-compose.yml 을 유지해야하고, 

docker-compose.yml 파일은 서버에 원하는 디렉토리를 만들어 위치시키면 된다. (나의 경우:  ~ )

기본 틀은 공식 제공하는 파일을 사용하자... (정신건강에 이롭다)

version: "3"

services:
  swipe-jeju-db:
    image: mysql:latest
    container_name: swipe-jeju-db
    networks:
      - {커스텀 네트워크 이름}
    environment:
      MYSQL_ROOT_HOST: "%"
      MYSQL_ROOT_PASSWORD: {db접속 비밀번호}
      MYSQL_DATABASE: {db명}
    ports:
      - "3306:3306"
    command: ["--character-set-server=utf8mb4","--collation-server=utf8mb4_unicode_ci"]

  swipe-jeju-back:
    image: {도커허브id}/{실행할 이미지이름}:{태그버전}
    container_name: swipe-jeju-back
    networks:
      - {커스텀 네트워크 이름}
    restart: on-failure
    ports:
      - "80:8080"
    environment:
      DB_HOST: {db 도커컨테이너명}
      DB_PORT: {db 도커컨테이너 실행포트}
      SPRING_DATASOURCE_URL: jdbc:mysql://{db 도커컨테이너명}:{db 도커컨테이너 실행포트}/{db명}?useSSL=false&allowPublicKeyRetrieval=true
      SPRING_DATASOURCE_USERNAME: "{db 유저명}"
      SPRING_DATASOURcE_PASSWORD: "{db접속 비밀번호}"
    depends_on:
      - {db 도커컨테이너명}

networks:
  {커스텀 네트워크 이름}:
      driver: bridge

 

  • networks
    • 커스텀 네트워크를 설정해, 두 컨테이너가 지정한 커스텀 네트워크에서 동작하도록 한다. 
    • 위처럼 {커스텀 네트워크 이름}을 지정해도, 실제 실행될 때는, root-{커스텀 네트워크 이름}등으로, 도커 기본 규칙에 따라 prefix가 붙어 실행된다. 
    • 도커 network의. default 값은 bridge이다. 
  • 백엔드 컨테이너에, 백엔드의. application.properties 에서 지정한 내용을 다시 써준다. 
    • 위같이 할 경우, application.properties의 내용보다도 docker-compose.yml 에 작성된 내용의 우선순위가 더 높아 우선 적용되고,  appllication.properties의 내용은 무시된다. 
    • 도커에서 백엔드-db 연결에 에러가 나는 경우가 많으므로 위처럼 대놓고 명시해주는게 마음이 편하다... (로컬에서 잘 연결되던 서비스 연결이 안되서 트러블 슈팅에 꽤 걸렸다)

 

 

옵션 상세설명은 향후 포스팅으로 이어서 하겠다..