## 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: ```