Search

Docker 를 사용하여 backend 팀과 협업하기

태그
Docker
분류
DevOps
목차

Why Docker?

이전에 만든 프로젝트를 더욱더 고도화 하기 위해 새로운 백엔드 팀원과 프론트 팀원을 모집했습니다. 프로젝트를 한 두번 하다보면 기본적인 환경설정은 대부분 끝내지만 팀원은 프로젝트 자체가 처음 이였기 때문에 Docker 를 사용하게 되었습니다. 프로젝트의 시작부터 꼼꼼히 실습해보는것도 좋지만 시간상의 여유가 부족하기 때문이죠.

필요한 파일 작성

Dockerfile

Dockerfile 은 프로젝트를 Docker container 로 packaging 하기 위한 내용을 담고 있습니다.
FROM openjdk:17 COPY build/libs/travel-0.0.1-SNAPSHOT.jar /app.jar ENTRYPOINT ["java", "-jar", "/app.jar"]
Plain Text
복사
FROM openjdk:17
이 Docker image 는 openjdk 버전 17을 기반으로 한다는 뜻입니다. 따라서 이 image 는 Java 17이 설치된 환경에서 시작됩니다.
FROM 지시문은 Docker 이미지를 만들기 위한 기반 image 를 지정합니다.
COPY ./build/libs/backend-0.0.1-SNAPSHOT.jar /app.jar
로컬 파일 시스템의 ./build/libs/backend-0.0.1-SNAPSHOT.jar 파일을 Docker image 내의 /app.jar 위치로 복사 한다는 뜻입니다.
애플리케이션의 실행 가능한 jar 파일을 container 안으로 가져옵니다.
ENTRYPOINT ["java","-jar","/app.jar"]
ENTRYPOINT 지시문은 container 가 시작될 때 실행될 명령을 정의합니다.
여기서는 java -jar /app.jar 명령을 사용하여 /app.jar 파일을 실행합니다.

Compose.yaml

Docker Compose 를 사용하여 다중 컨테이너 Docker 애플리케이션을 정의하고 관리하기 위한 설정 파일입니다.
version: '3.8' services: mysql: image: mysql:latest restart: always # 재시작 정책입니다. mysql 이 실행되기 전, app 이 실행되면 실행오류가 발생합니다. env_file: # 환경변수가 담겨있는 파일을 지정해줍니다. - docker.env volumes: - mysql-data:/var/lib/mysql ports: - "3306:3306" healthcheck: # 서비스가 제대로 실행했는지 체크합니다. test: ["CMD", "mysqladmin", "ping", "-h", "mysql"] interval: 10s timeout: 5s retries: 5 redis: image: redis:latest restart: always ports: - "6379:6379" volumes: - redis-data:/data app: build: dockerfile: Dockerfile ports: - "8080:8080" env_file: - docker.env depends_on: # spring app 이 의존하는 서비스를 적어주어야 합니다. mysql: condition: service_healthy redis: condition: service_started volumes: # 데이터를 저장합니다. 재실행해도 초기화 되지 않습니다. mysql-data: redis-data:
YAML
복사

환경변수 파일

필요한 환경 변수를 key=value 로 작성 해주세요.
MYSQL_ROOT_PASSWORD="" MYSQL_DATABASE="" SPRING_DATASOURCE_URL: "jdbc:mysql://mysql:3306/{스키마명}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8" SPRING_DATASOURCE_USERNAME: "" SPRING_DATASOURCE_PASSWORD: "" SPRING_DATA_REDIS_HOST: "redis" SPRING_DATA_REDIS_PORT: "6379" ...
Plain Text
복사

이후 개발 과정은 어떻게 되나요?

Docker Desktop 실행

왜 Docker Desktop 을 실행 해야 할까?

Docker Desktop이 Docker 엔진과 함께 필요한 모든 도구와 서비스를 제공하기 때문입니다! Docker Desktop은 Docker를 사용하여 컨테이너화된 애플리케이션을 개발, 실행, 관리할 수 있도록 해주는 애플리케이션 입니다. 때문에 만약 이를 실행하지 않고 터미널에 docker 와 관련된 명령어를 입력할 경우 먹히지 않는것을 확인할 수 있습니다.

IntelliJ spring configuration 에 환경 변수 넣기

application.yml 에 환경변수를 사용하여 값을 넣은 경우, 아래와 같이 configuration 에 환경변수를 넣어주어야 합니다.
만약 환경변수를 넣는 칸이 보이지 않는 경우 Modify options 에서 선택해 주세요.

개발 후 Docker 컨테이너에서 제대로 돌아가는지 확인하기

프론트 팀에게 건내주기전 개발한 기능이 제대로 동작 하는지 확인할 필요가 있습니다.

1. 프로젝트 build

2. compose build

아래 명령어를 수행하여 갱신된 jar 파일을 container 에 옮겨줍니다.
docker compose build
Bash
복사

3. compose up

compose app 을 실행하여 동작을 확인합니다. 이상이 없을 경우 이를 push 합니다.
저의 경우 단위 테스트까지 마치고 api 문서까지 작성을 한 후에 dev 브랜치로 push 하였습니다.
dev 브랜치 에서 통합 테스트를 마치고 main 브랜치에 병합하였습니다.
main 브랜치에 push 된 코드를 기준으로 프로젝트 build → image 생성 → docker hub push 되도록 파이프 라인을 설정하였습니다.