Docker 를 사용하여 backend 팀과 협업하기
프로젝트가 처음인 팀원의 환경 구축시간을 줄이고, 공통된 환경을 만들고 싶다면 docker 를 사용해보세요.
1. Why Docker? 🐋
이전에 만든 프로젝트를 더욱더 고도화 하기 위해 새로운 백엔드 팀원과 프론트 팀원을 모집했습니다. 프로젝트를 한 두번 하다보면 기본적인 환경설정은 대부분 끝내지만 팀원은 프로젝트 자체가 처음 이였기 때문에 Docker 를 사용하게 되었습니다. 프로젝트의 시작부터 꼼꼼히 실습해보는것도 좋지만 시간상의 여유가 부족하기 때문이죠. 😔
2. 필요한 파일 작성
2.1. Dockerfile
Dockerfile 은 프로젝트를 Docker container 로 packaging 하기 위한 내용을 담고 있습니다.

1
2
3
FROM openjdk:17
COPY build/libs/travel-0.0.1-SNAPSHOT.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
2.1.1. FROM openjdk:17
- 이 Docker image 는 openjdk 버전 17을 기반으로 한다는 뜻입니다. 따라서 이 image 는 Java 17이 설치된 환경에서 시작됩니다.
- FROM 지시문은 Docker 이미지를 만들기 위한 기반 image 를 지정합니다.
2.1.2. 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 안으로 가져옵니다.
2.1.3. ENTRYPOINT [“java”,”-jar”,”/app.jar”]
- ENTRYPOINT 지시문은 container 가 시작될 때 실행될 명령을 정의합니다.
- 여기서는 java -jar /app.jar 명령을 사용하여 /app.jar 파일을 실행합니다.
2.2. Compose.yaml
Docker Compose 를 사용하여 다중 컨테이너 Docker 애플리케이션을 정의하고 관리하기 위한 설정 파일입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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:
2.3. 환경변수 파일
필요한 환경 변수를 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"
...
3. 이후 개발 과정은 어떻게 되나요?
3.1. Docker Desktop 실행
3.1.1. 왜 Docker Desktop 을 실행 해야 할까? 🤷🏻♀️
Docker Desktop이 Docker 엔진과 함께 필요한 모든 도구와 서비스를 제공하기 때문입니다! Docker Desktop은 Docker를 사용하여 컨테이너화된 애플리케이션을 개발, 실행, 관리할 수 있도록 해주는 애플리케이션 입니다. 때문에 만약 이를 실행하지 않고 터미널에 docker 와 관련된 명령어를 입력할 경우 먹히지 않는것을 확인할 수 있습니다. 😅
3.2. IntelliJ spring configuration 에 환경 변수 넣기
application.yml 에 환경변수를 사용하여 값을 넣은 경우, 아래와 같이 configuration 에 환경변수를 넣어주어야 합니다.
만약 환경변수를 넣는 칸이 보이지 않는 경우 Modify options 에서 선택해 주세요.
3.3. 개발 후 Docker 컨테이너에서 제대로 돌아가는지 확인하기
프론트 팀에게 건내주기전 개발한 기능이 제대로 동작 하는지 확인할 필요가 있습니다.
3.3.1. 프로젝트 build
3.3.2. compose build
아래 명령어를 수행하여 갱신된 jar 파일을 container 에 옮겨줍니다.

1
docker compose build
3.3.3. compose up
compose app 을 실행하여 동작을 확인합니다. 이상이 없을 경우 이를 push 합니다.
저의 경우 단위 테스트까지 마치고 api 문서까지 작성을 한 후에 dev
브랜치로 push 하였습니다. 또한 dev
브랜치 에서 통합 테스트를 마치고 main
브랜치에 병합하였습니다.
- main 브랜치에 push 된 코드를 기준으로 프로젝트 build → image 생성 → docker hub push 되도록 파이프 라인을 설정하였습니다.
- 관련된 글은 Github Actions 을 이용한 프로젝트 Image build, push 자동화 를 참고해 주세요.