Docekr란? 2 배포 재도전 (성공)

둥그냥·2021년 7월 26일
0

공부 기록

목록 보기
6/10

이놈의 도커는 봐도 봐도 익숙해지질 않는 것 같다.

DockerDocker Compose를 통해 프로젝트를 한번에 배포할 수 있다.

일전에 과거에 진행했던 프로젝트를 도커화 하려다가 실패한 전적이 있다. 이번에는 현재 진행중인 프로젝트를 AWS 연동과 기타 등등을 이유로 도커화를 시도해보겠다..

  1. 서버 자체를 가상 머신에 집어 넣어서 돌려버리는 것이 목표
  2. 서비스가 업데이트 되면, 운영 환경 자체를 변경하지 않고, 이미지를 새로 생성하여 배포
    -> 서비스 운영 환경 이미지를 1회용으로 쓰는 것. 한 번 쓰고 버린다.

Docker Compose

  • 다중 컨테이너 애플리케이션을 정의하고 공유할 수 있도록 개발된 도구이다.
  • Compose에서 서비스를 정의하는 YAML 파일을 만들고, 단일 명령을 사용하여 모두 실행하거나 모두 종료할 수 있다.

설정하기

  1. 서버를 .jar파일로 build하기
    ./gradlew build

  2. Dockerfile 만들기 (최상단에)

# FROM: 어떤 이미지를 기반으로 할지 설정합니다. Docker 이미지는 기존에 만들어진 이미지를 기반으로 생성합니다. 
# FROM <이미지 이름>:<태그> 형식으로 설정합니다.
FROM openjdk:8-jdk-alpine
# build 시점에만 사용되는 변수
ARG JAR_FILE=build/libs/*.jar
# COPY는 파일을 이미지에 추가합니다. ADD와는 달리 COPY는 압축 파일을 추가할 때 압축을 해제하지 않고, 파일 URL도 사용할 수 없습니다.
COPY ${JAR_FILE} app.jar
# ENTRYPOINT는 컨테이너가 시작되었을 때 스크립트 혹은 명령을 실행합니다
# 셀 없이 바로 실행하기  ENTRYPOINT ["<실행 파일>", "<매개 변수1>", "<매개 변수2>"] 
ENTRYPOINT [ "java", "-jar", "/app.jar" ]
  1. docker-compose.yml 만들기 (Dockerfile과 같은 위치에 두었음)
# Docker compose 버전
version: '3.8'
# 가동할 컨테이너 목록
services:
  db:
    # 사용할 이미지(Docker Hub 또는 로컬에 저장된 Image)
    image: mysql:8.0
    container_name: gaon_db
    restart: always
    # 외부에서 컨테이너 내부로 연결되는 포트 목록
    ports:
      - 32000:3306
    # 컨테이너 내에서 사용되는 환경 변수
    environment:
      # <사용할 Database root 계정 비밀 번호 설정>
      MYSQL_ROOT_PASSWORD: password
      TZ: 'Asia/Seoul'
    # 실제 드라이브와 컨테이너의 드라이브를 연결(Mount)
    volumes:
      # 처음에 실행될 sql문을 집어넣는다
      - ./db:/docker-entrypoint-initdb.d
      # 볼륨에 db 연결 (컨테이너 종료시에도 날아가지 않게)
      - 'gaon_volume:/var/lib/mysql'
    # 컨테이너 내부에서 사용되는 네트워크
    networks:
      - backend
    # 안해주면 aws에서 mbind: Operation not permitted 에러 뜸
    security_opt:
      - seccomp:unconfined

  app:
    # 공개된 Image 가 아닌 Dockerfile 을 통한 빌드 이미지 사용
    # 위에서 만든 Dockerfile을 사용한다
    build:
      context: ./
    restart: always
    container_name: gaon_app
    ports:
      - 8080:8080
      - 8443:8443
    environment:
      TZ: Asia/Seoul
      # Spring application.properties DB 설정
      SPRING_DATASOURCE_URL: 'jdbc:mysql://db:3306/gaon?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Seoul&zeroDateTimeBehavior=convertToNull&rewriteBatchedStatements=true'
      server.address: 0.0.0.0
      # 의존 컨테이너
    depends_on:
      - db
    networks:
      - backend
volumes:
  gaon_volume:
networks:
  backend:

물론 여기에 프로젝트에 필요한 오픈비두와 nginx등을 추가하기는 했지만 기본적인 틀은 위와 같다!

gaon_volume을 사용하고 있고 DB를 해당 볼륨에 연결해 둔 덕분에 컨테이너를 지웠다 다시 실행해도 DB 데이터가 날아가지 않는다.

실행하기

docker-compose up -d

위 명령어를 실행하면 이미지가 없을 경우 도커 허브에서 받은 DB 이미지와, 앞서 만든 Dockerfile로 우리 프로젝트의 이미지를 만들어준다. 그리고 만든 이미지들을 컨테이너로 실행시켜 준다.

즉 docker-compose.yml 파일에 있는 모든 서비스들을 한번에 생성 및 실행시켜 준다

  • -d 옵션은 백그라운드로 실행시켜준다는 의미이다.
  • 이미지가 이미 있는 경우에도 다시 빌드하고 싶은 경우 --build 옵션을 사용하면 된다.

삭제하기

docker-compose down

docker-compose.yml 파일에 있는 모든 서비스 컨테이너를 한 번에 정지시키고 삭제한다.

만약 이미지까지 삭제하고 싶다면

docker-compose down --rmi all

위 명령어를 사용하면 된다.

  • 만약 프로젝트가 수정되어 다시 jar파일을 빌드했다면 jar파일을 도커로 복사하는 COPY ${JAR_FILE} app.jar 명령어가 실행되게 하기 위해 다시 이미지 빌드가 필요하다.
  • 이렇게 재빌드가 필요한 경우 down할 때 --rmi all 옵션을 통해 현재 이미지를 삭제해줄 수 있다.
  • 혹은 up 할 때 --build 옵션을 사용해주는 방법도 있다.

0개의 댓글