## 0. 예시 설명
지금 듣고 있는 교육 과정에서 미니 프로젝트를 1차와 2차로 나눠서 했다. 그 결과, 다음과 같은 서버를 구현했다. 이 서버들을 모두 별도의 컨테이너에서 실행되도록 작업해보자.
|서버 명|사용 기술 스택|서버 설명|
|-|-|-|
|sugar-road-1|Spring Boot|교육 과정 1차 미니프로젝트 결과물(SSR)|
|sugar-road-2-front|Vue.js 3|교육 과정 2차 미니프로젝트 결과물(CSR)|
|sugar-road-2-back|Spring Boot|교육 과정 2차 미니프로젝트 결과물(CSR)|
|sugar-road-db|MySQL|교육 과정 1차, 2차 미니프로젝트 DB|
**컨테이너 명은 서비스 명과 똑같이 설정**하고, **모든 서비스는 `sugar-road-net` 네트워크로 연결**하자.
### 참고 : 파일 구조
```
├── docker-compose.yaml
│
├── sugar-road-1
│ └── Dockerfile
│
├── sugar-road-2-front
│ └── Dockerfile
│
├── sugar-road-2-back
│ └── Dockerfile
│
└── sugar-road-db
└── create_all_table.sql
└── Dockerfile /* 선택 */
```
## 1. Dockerfile 생성
### Sprint Boot의 경우 🌿
#### [[4. Dockerfile 작성 방법#Spring Boot 서버 이미지 생성(Gradle 🐘)|작성 방법]]
#### 0) application.properties 수정
```
...
spring.datasource.url: jdbc:mysql://sugar-road-db:3306/edudb?characterEncoding=UTF-8
spring.datasource.username: [username]
spring.datasource.password: [password]
spring.datasource.driver-class-name: com.mysql.cj.jdbc.Driver
...
```
- `sugar-road-net`으로 서로 연결되어 있기 때문에 컨테이너 이름을 호스트로 지정해도 통신이 가능
#### 1) build.gradle 수정
##### (1) `sugar-road-1`
```
...
bootjar {
archivesBaseName = 'sugar-road-1'
archiveFileName = 'sugar-road-1.jar'
}
```
##### (2) `sugar-road-2`
```
...
bootjar {
archivesBaseName = 'sugar-road-2-back'
archiveFileName = 'sugar-road-2-back.jar'
}
```
#### 2) JAR 생성
```
./gradlew bootjar
```
#### 3) Dockerfile 작성
```
FROM adoptopenjdk:17-jdk-hotspot
# sugar-road-2-back는
# ARG JAR=build/libs/sugar-road-2-back.jar
ARG JAR=build/libs/sugar-road-1.jar
COPY ${JAR} app.jar
CMD ["java", "-jar", "app.jar"]
```
### Node.JS 의 경우 🟩
#### [[4. Dockerfile 작성 방법#Node JS 기반 서버 이미지 생성|작성 방법]]
#### 0) Dockerfile 작성
```
FROM node:21
WORKDIR /usr/src/app
COPY . .
RUN npm install
CMD ["npm", "start"]
```
### MySQL 의 경우 🐬 (선택)
#### [[4. Dockerfile 작성 방법#MySQL 서버 이미지 생성|작성 방법]]
#### 0) Dockerfile 작성
```
FROM mysql:8.0
ENV MYSQL_ROOT_PASSWORD=[비밀번호]
ENV MYSQL_DATABASE=sugar-road
ENV MYSQL_USER=[유저 이름]
ENV MYSQL_PASSWORD=[비밀번호]
RUN { \
echo '[mysqld]'; \
echo 'character-set-server=utf8mb4'; \
echo 'collation-server=utf8mb4_unicode_ci'; \
echo 'skip-host-cache'; \
echo 'skip-name-resolve'; \
} > /etc/mysql/my.cnf
EXPOSE 3306
VOLUME /var/lib/mysql
```
- `docker-compose.yaml`에서 설정할 수 있으므로 Dockerfile을 따로 안 만들어도 괜찮다.
## 2. Docker-compose.yaml 생성
### [[5. Docker-compose 작성 방법 🐙|작성 방법]]
### 0). version 설정
```
version: "1"
```
### 1). service 설정
```
services:
...
```
#### (0) `sugar-road-db`
```yaml
sugar-road-db:
image: mysql
container_name: sugar-road-db
networks:
- sugar-road-net
volumes:
- sugar-road-db-volume:/var/lib/mysql
- ./sugar_road-db/create_all_table.sql:/docker-entrypoint-initdb.d/create_all_table.sql
restart: always
environment:
MYSQL_ROOT_PASSWORD: [비밀번호]
MYSQL_DATABASE: [데이터 베이스 이름]
MYSQL_USER: [유저 이름]
MYSQL_PASSWORD: [비밀번호]
ports:
- 3306:3306
command: --init-file /docker-entrypoint-initdb.d/create_all_table.sql
```
- `:` 이 포함된 문자열은 "" 로 감싸줘야 함
#### (1) `sugar-road-1`
```yaml
sugar-road-1:
depends_on:
- sugar-road-db
container_name: sugar-road-1
build:
context: ./sugar-road-1/
dockerfile: Dockerfile
networks:
- sugar-road-net
ports:
- "8088:8088"
restart: on-failure
```
#### (2) `sugar-road-2-back`
```yaml
sugar-road-2-back:
depends_on:
- sugar-road-db
container_name: sugar-road-2-back
build:
context: ./sugar-road-2-back/
dockerfile: Dockerfile
networks:
- sugar-road-net
ports:
- "8088:8088"
restart: on-failure
```
#### (3) `sugar-road-2-front`
```yaml
sugar-road-2-front:
depends_on:
- sugar-road-2-back
container_name: sugar-road-2-front
build:
context: ./sugar-road-2-front/
dockerfile: Dockerfile
networks:
- sugar-road-net
ports:
- "5173:5173"
restart: on-failure
```
### 2) networks 설정
```yaml
networks:
sugar-road-net:
```
### 3) volumes 설정
```yaml
volumes:
sugar-road-db-volume:
```
### 통합
```yaml
version: "1"
services:
sugar-road-db:
container_name: sugar-road-db
build:
context: ./sugar-road-db/
dockerfile: Dockerfile
restart: always
networks:
- sugar-road-net
volumes:
- "sugar-road-db-volume:/var/lib/mysql"
ports:
- "3306:3306"
restart: always
sugar-road-1:
depends_on:
- sugar-road-db
container_name: sugar-road-1
build:
context: ./sugar-road-1/
dockerfile: Dockerfile
networks:
- sugar-road-net
ports:
- "8088:8088"
restart: on-failure
sugar-road-2-back:
depends_on:
- sugar-road-db
container_name: sugar-road-2-back
build:
context: ./sugar-road-2-back/
dockerfile: Dockerfile
networks:
- sugar-road-net
ports:
- "8088:8088"
restart: on-failure
sugar-road-2-front:
depends_on:
- sugar-road-2-back
container_name: sugar-road-2-front
build:
context: ./sugar-road-2-front/
dockerfile: Dockerfile
networks:
- sugar-road-net
ports:
- "3000:3000"
restart: on-failure
networks:
sugar-road-net:
volumes:
sugar-road-db-volume:
```