개발자 키우기
도커 compose 사용하기 본문
Docker Compose 관련 공식 문서 ( https://docs.docker.com/compose/ )
0. compose를 사용하는 이유
도커 컴포즈를 사용하지 않으면 웹서비스를 실행시킨다고 가정했을 때 웹서버 컨테이너와 DB서버 컨테이너가 필요하기에
서로 각각 이미지를 굽고 컨테이너를 실행시키고 서로 통신이 필요하기에 서로의 IP와 포트번호를 설정까지 많은 번거로움이 있다. 이러한 과정을 도커 컴포즈가 YAML문법을 통해 이전 방법보다 쉽게 사용할 수 있게 함
1. 하나의 컨테이너를 사용할 때
docker-compose.yml
services:
mysqldb: // 이름을 정할수있음
image: mysql // 구울 이미지
restart: always // 종료되면 자동 재시작
volumes:
- mysql-compose-volume:/var/lib/mysql // 볼륨 사용
environment:
- MYSQL_ROOT_PASSWORD=root1234 // 환경설정
- MYSQL_DATABASE=rootdb
ports:
- "3307:3306" // 포트 포워딩
volumes:
mysql-compose-volume: // 볼륨 생성
도커 컴포즈를 백그라운드로 실행시키는 명령어
docker-compose up -d
* yml 파일 - 볼륨을 Host로 정할 때
volumes:
- ./data:/var/lib/mysql
2. 두 개 이상의 컨테이너를 사용할 때
docker-test-db, docker-test-server, docker-compose.yml 가 한 폴더 안에 있어야 함 ( 그 폴더를 기본폴더라고 정하겠음 )
docker-test-db 파일 ( Dockerfile / init.sql )
# mysql 설치
FROM mysql:8.0
# 도커가 실행되면 init.sql를 복사하고 mysql이 실행되면 init.sql 이 자동 실행
COPY init.sql /docker-entrypoint-initdb.d
# 환경 설정
ENV MYSQL_ROOT_PASSWORD=root1234
ENV MYSQL_DATABASE=metadb
ENV MYSQL_HOST=%
# 추가 옵션
CMD ["--character-set-server-utf8mb4", "--collation-server=utf8mb4_unicode_ci"]
CREATE TABLE user_tb (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO user_tb (name) VALUES ('John');
INSERT INTO user_tb (name) VALUES ('Jane');
docker-test-server ( Dockerfile / 스프링부트 프로젝트 )
# jdk11 설치
FROM openjdk:11-jdk-slim
# 기본경로 지정
WORKDIR /app
# 현제 Dockerfile이 있는 경로의 파일을 도커 컨테이너 기본경로에 복사
COPY . .
# 컨테이너에서 명령
RUN chmod +x ./gradlew
RUN ./gradlew clean build
# 실행시키기 쉽게 파일명을 변경하여 복사
ENV JAR_PATH=/app/build/libs
RUN mv ${JAR_PATH}/*.jar /app/app.jar
# 실행
ENTRYPOINT [ "java", "-jar", "-Dspring.profiles.active=prod", "app.jar" ]
docker-compose.yml
version: "3"
services:
db:
build:
context: ./docker-test-db # 경로를 설정해야 db 도커파일을 구울때 기본경로가 ./docker-test-db로됨
dockerfile: Dockerfile # 경로를 설정하지 않으면 기본경로가 기본폴더로 되기 때문에 init.sql이 동작하지 않음
ports:
- 3306:3306 # 포트 포워딩
volumes:
- ./docker-test-db/store:/var/lib/mysql # 볼륨을 설정하여 db 데이터를 유지하여 사용
networks:
- network1
server:
build:
context: ./docker-test-server
dockerfile: Dockerfile
restart: always # 서버가 중지되더라도 재실행
ports:
- 8080:8080
depends_on: # 의존을 설정하지 않으면 db 실행이 느릴경우 서버에서 db를 찾지못함
- db # 의존을 설정하면 서버가 구워지고 db가 실행이되면 서버도 실행이됨
environment: # 프로잭트의 application.yml의 환경변수 설정
SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/metadb? useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false&allowPublicKeyRetrieval=true
SPRING_DATASOURCE_DRIVER: com.mysql.cj.jdbc.Driver
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: root1234
networks:
- network1
networks:
network1: # 할당 받은 내부 IP 자동적으로 삽입해줌 / 위 환경변수 세팅 : datasourse_url 설정에서 db가 해당됨
스프링부트 프로젝트에서 application.yml의 예시
server:
servlet:
encoding:
charset: utf-8
force: true
port: 8080
spring:
datasource:
url: ${SPRING_DATASOURCE_URL}
username: ${SPRING_DATASOURCE_USERNAME}
password: ${SPRING_DATASOURCE_PASSWORD}
driver-class-name: ${SPRING_DATASOURCE_DRIVER}
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL8Dialect
hibernate:
ddl-auto: none
show-sql: true
open-in-view: true
logging:
level:
'[com.example.server]': INFO
'[org.hibernate.type]': TRACE
- 출처 메타코딩 최주호
'Back-end > Docker' 카테고리의 다른 글
도커 Mysql 사용하기 (0) | 2023.06.23 |
---|---|
도커 nginx를 사용하여 로드밸런스(redirection) 구현 (0) | 2023.06.23 |
도커 file 사용하기 (0) | 2023.06.23 |
도커 attach 와 exec 차이점 (0) | 2023.06.22 |
도커 포트포워딩 하기 (0) | 2023.06.22 |