docker compose 서비스 배포

test·2021년 12월 29일

docker

목록 보기
6/6
post-thumbnail

docker, docker-compose 서비스 배포

ch1. 배포 환경 및 진행사항

개발환경

  • Java11
  • SpringBoot(gradle)
  • thymeleaf
  • MySQL

준비사항

  • local 환경에서 구동 테스트 완료된 application
  • application 연동 테스트 완료된 database 및 tables
  • 가상 서버 linux(ubuntu) 환경
  • docker, docker compose 설치 완료된 서버
    docker, docker compose 설치 방법

진행사항

  • database 컨테이너는 docker-compose내에서 설정
  • application 컨테이너는 Dockerfile로 만들어 설정

ch2. spring properties

  • jar파일 빌드 전 application.properties 설정 확인
  • database 설정 중 첫 번째를 제외한 설정은 주석처리
  • 컨테이너 빌드 시 연동되는 서버에 맞는 스펙으로 세팅
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# spring.datasource.url=
# spring.datasource.username=
# spring.datasource.password=
  • thymeleaf 라이브러리를 사용했다면 아래 설정은 모두 주석처리
  • 경로를 찾지 못하는 error가 발생
# spring.thymeleaf.enabled=true
# spring.thymeleaf.encoding=UTF-8
# spring.thymeleaf.suffix=.html
# spring.thymeleaf.cache=false
  • JPA 설정 중 ddl-auto 는 create -> update로 변경
spring.jpa.hibernate.ddl-auto=update
  • 서버 포트를 8080으로 세팅
  • docker-compose에서도 8080으로 맞춰준다.
server.port=8080

ch3. application build

  • 준비된 application 최상위 경로에서 gradlew 파일이 있는지 확인
  • gradlew 파일이 존재한다면 아래 명령어로 build
./gradlew bootjar

ch4. Dockerfile 작성

  • 준비된 jar파일을 서버의 원하는 경로로 복사한다.
FROM adoptopenjdk/openjdk11:alpine-jre
ARG JAR_FILE=./jar/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
  • 준비된 jar파일을 ./jar 경로로 복사
  • ARG -> jar파일이 있는 경로
  • COPY -> ARG에서 설정한 경로에 있는 jar파일을 app.jar로 복사
  • ENTRYPOINT -> 이미지 실행시 명령어 수행

ch5. docker-compose.yml 미리보기

version: "3"
services:
  db:								#1
    image: mysql:5.7
    container_name: container_db				#2
    environment:						#3
      - MYSQL_DATABASE=test_db
      - MYSQL_ROOT_PASSWORD=1234
    restart: always
    ports:
      - "3306:3306"
    volumes:
      - /home/ubuntu/test/db/data:/var/lib/mysql
  app:								#4
    build:							#5
      context: ./app
      dockerfile: Dockerfile
    container_name: container_app
    links:							#6
      - db
    restart: always
    ports:
      - "80:8080"
    depends_on:							#7
      - db
    environment:						#8
      SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/test_db?characterEncoding=UTF-8&serverTimezone=UTC&&allowPublicKeyRetrieval=true&useSSL=false
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: 1234

ch6. docker-compose.yml 상세 설명

#1

  • docker-compose 파일 내부에서 서비스의 네이밍
  • 설정 파일 내에서 해당 서비스를 호출할 때 사용
services:
  db:

#2

  • docker ps 명령어 치면 NAMES에 뜨는 container 이름 설정
container_name: container_db

#3

  • mysql 이미지 접속 시 DATABASE와 PASSWORD 세팅
environment:
  - MYSQL_DATABASE=test_db
  - MYSQL_ROOT_PASSWORD=1234

#4

  • #1과 같은 docker-compose 파일 내부에서 서비스의 네이밍
app:

#5

  • application을 활용해 이미지를 만들기 위한 Dockerfile build
build:
  context: ./app
  dockerfile: Dockerfile
  • context -> Dockerfile이 있는 경로
  • dockerfile -> 생성한 Dockerfile 이름을 적어주면 된다

#6

  • app 서비스와 연결 할 서비스 선택
  • docker-compose 내에서 설정한 services 중 선택
links:
  - db

#7

  • 서비스 실행 순서
depends_on:
  - db
  • 즉, db 서비스가 실행된 후 app 서비스 실행

#8

  • 이미지 실행 시 환경변수 설정
  • spring application.properties에서 주석처리한 database 관련 설정
environment:
  SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/test_db?characterEncoding=UTF-8&serverTimezone=UTC&&allowPublicKeyRetrieval=true&useSSL=false
  SPRING_DATASOURCE_USERNAME: root
  SPRING_DATASOURCE_PASSWORD: 1234
  • jdbc:mysql://db:3306 -> 포트앞에 db는 #1번 네이밍과 통일
  • #3번에서 세팅한 비밀번호와 통일

ch7. 마무리

  • local database 테이블과 데이터를 서버로 이전
  • docker-compose.yml 실행
docker-compose up
docker-compose up -d
  • up 명령어로 db 및 app 서버가 에러없이 잘 구동되는지 확인 후
  • -d 옵션을 넣어 백그라운드로 실행 후 사이트 접속
profile
bedev

0개의 댓글