Docker 두 컨테이너 간 네트워크 통신
1️⃣ 사용자 정의 브리지 네트워크 생성
docker network create --driver bridge spring-net
spring-net 이라는 새 브리지 네트워크를 만든다
2️⃣ MySQL 컨테이너 실행
Dockefile
# 1) MySQL 공식 이미지
FROM mysql:8
# 2) 환경 변수 설정
ENV TZ=Asia/Seoul \\
DEBIAN_FRONTEND=noninteractive
# 3) tzdata 설치 (microdnf)
RUN microdnf -y install tzdata && \\
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \\
echo $TZ > /etc/timezone && \\
microdnf clean all
# 4) MySQL 서버 실행 시 파라미터로 시간대 및 문자셋 설정
CMD ["mysqld", \\
"--character-set-server=utf8mb4", \\
"--collation-server=utf8mb4_unicode_ci", \\
"--default-time-zone=+09:00"]
인터넷 시계로 서버가 시간을 맞춘다. 그리고 한국표준시를 따른다
Docker 이미지 빌드
docker build -t mymysql .
빌드 된 이미지 실행
docker run -d ^
-p 3307:3306 ^
-e MYSQL_ROOT_PASSWORD=rootpass ^
-e MYSQL_DATABASE=testdb ^
-e MYSQL_USER=testuser ^
-e MYSQL_PASSWORD=testpass ^
--name mymysql ^
--network spring-net ^
mymysql
3️⃣ Spring Boot 컨테이너 생성
application.yml
Host (로컬) 에서 mysql 컨테이너에 접속 할 때는 localhost:3307(외부 포트)
spring:
datasource:
url: jdbc:mysql://localhost:3307/testdb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul&characterEncoding=UTF-8
username: testuser
password: testpass
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
maximum-pool-size: 10
minimum-idle: 10
jpa:
show-sql: true
hibernate:
ddl-auto: update
properties:
hibernate:
format_sql: true
jdbc.time_zone: Asia/Seoul
application-prod.yml
다른 컨테이너 안에서 mysql 컨테이너에 접속 할 때는 컨테이너명:포트번호(내부 포트) mymysql:3306
spring:
datasource:
url: jdbc:mysql://mymysql:3306/testdb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul&characterEncoding=UTF-8
username: testuser
password: testpass
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
maximum-pool-size: 10
minimum-idle: 10
jpa:
show-sql: true
hibernate:
ddl-auto: update
properties:
hibernate:
format_sql: true
dialect: org.hibernate.dialect.MySQL8Dialect
jdbc.time_zone: Asia/Seoul
컨테이너 내/외부에서 접속 할 때마다 yml파일을 계속 변경 할 수 없으므로 Dockerfile 설정 해야 함
예시 프로젝트 디렉토리 구조
todoApp/
├─ src/ ...
├─ build.gradle
├─ Dockerfile
build.gradle 에서 MySQL 의존성을 포함하고, application.yml 에 DB 설정이 있다고 가정.
Dockerfile
# (1) 기본 베이스 이미지로 OpenJDK 21 사용
FROM eclipse-temurin:21
# (2) 작업 디렉토리 생성
WORKDIR /app
# (3) 빌드 산출물(프로젝트 JAR)을 복사
# 실제로는 CI/CD에서 'mvn package' 등으로 만든 jar파일을 복사한다고 가정
COPY build/libs/todoApp-0.0.1-SNAPSHOT.jar /app/todoApp.jar
# (4) 컨테이너가 사용하는 포트 (문서적 의미)
EXPOSE 8080
# (5) 실행 명령
ENTRYPOINT ["java", "-jar", "/app/todoApp.jar", "--spring.profiles.active=prod"]
COPY build/libs/todoApp-0.0.1-SNAPSHOT.jar /app/todoApp.jar
build/libs/todoApp-0.0.1-SNAPSHOT.jar 파일을 /app/todoApp.jar로 복사
📌JAR 파일이란?
JAR = Java ARchive (자바 아카이브)
여러 개의 .class 파일(자바 코드) + 설정 파일 + 라이브러리를 하나로 압축한 파일
= 자바 프로그램 실행 파일
➕ 이 설정은 코드가 바뀌어도 바뀐 코드가 반영 되지 않으므로
./gradlew build -x test #-x test는 테스트 없이
다시 빌드 해서 Jar파일에 반영
docker build -t my-todo-app:3.0 .
그리고 다시 Dockerfile 빌드 해서 이미지 다시 생성
기존의 Dockerfile 에 copy 된 jar파일은 이전 jar파일 이므로
이것은 실제 운영 환경에서 쓰는 방법이고
Git 에서 Clone 후 Pull 해서 jar파일을 빌드 후 실행 시키는건 테스트 / 개발 환경에서 사용
--spring.profiles.active=prod
application-prod.yml을 활성화해서 운영환경 설정을 적용
Docker 이미지 빌드
docker build -t my-spring-app:1.0 .
컨테이너 실행
docker run -d ^
--name springboot ^
-p 8080:8080 ^
--network spring-net ^
my-spring-app:1.0
▶️ 두 컨테이너가 spring-net 라는 네트워크 브릿지 위에서 사용되기 때문에
컨테이너 간 네트워크 통신이 가능하다
Docker 레지스트리에 이미지 Push & Pull
1️⃣Docker Hub 로그인
docker login
# Docker ID 및 비밀번호 입력
Docker Desktop에 로그인 되어 있으면 자동으로 로그인 됨
2️⃣이미지 태깅
docker tag my-spring-app:1.0 <DockerHubID>/my-spring-app:1.0
3️⃣푸시
docker push <DockerHubID>/my-spring-app:1.0
다른 서버/PC에서
docker pull <DockerHubID>/my-spring-app:1.0
동일 이미지를 공유·배포 가능
Gradle 을 이용한 Docker 이미지 생성
build.gradle 추가
tasks.named('bootBuildImage') {
imageName = "urstory/my-spring-app:1.0"
environment = [
"BP_JVM_VERSION": "21"
]
}
tasks.named('bootBuildImage') | Gradle에서 bootBuildImage 태스크 설정을 가져옴 |
imageName = "urstory/my-spring-app:1.0" | 생성될 도커 이미지 이름 지정 → 도커허브 사용자명/이미지이름:버전 형식 |
environment = [...] | Buildpack 빌드시 사용할 환경 변수 설정 |
"BP_JVM_VERSION": "21" | JVM(Java Virtual Machine) 버전을 21로 지정해서, Java 21로 앱 실행되도록 설정 |
bootBuildImage 태스크 실행
gradlew bootBuildImage
이렇게 실행하면, urstory/my-spring-app:1.0 이라는 도커 이미지가 생성
Docker 실행
docker run -p 8080:8080 urstory/my-spring-app:1.0
bootBuildImage
Spring Boot에서 제공하는 기능으로,자바 애플리케이션을 Dockerfile 없이 도커 이미지로 만들어 줌
- Dockerfile 없어도 됨
- 자동으로 운영체제 + JDK + 앱 포함된 이미지 만들어줌
- JVM, 메모리 최적화 등 자동 적용
'TIL' 카테고리의 다른 글
250327 TIL (0) | 2025.03.27 |
---|---|
250326 TIL (0) | 2025.03.26 |
250324 TIL (1) | 2025.03.24 |
250321 TIL (0) | 2025.03.21 |
250317 TIL (0) | 2025.03.17 |