이놈의 도커는 봐도 봐도 익숙해지질 않는 것 같다.
Docker
와 Docker Compose
를 통해 프로젝트를 한번에 배포할 수 있다.
일전에 과거에 진행했던 프로젝트를 도커화 하려다가 실패한 전적이 있다. 이번에는 현재 진행중인 프로젝트를 AWS 연동과 기타 등등을 이유로 도커화를 시도해보겠다..
서버를 .jar파일로 build하기
./gradlew build
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" ]
# 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
위 명령어를 사용하면 된다.
COPY ${JAR_FILE} app.jar
명령어가 실행되게 하기 위해 다시 이미지 빌드가 필요하다. down
할 때 --rmi all
옵션을 통해 현재 이미지를 삭제해줄 수 있다. up
할 때 --build
옵션을 사용해주는 방법도 있다.