250325 TIL

2025. 3. 25. 23:57·TIL

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
'TIL' 카테고리의 다른 글
  • 250327 TIL
  • 250326 TIL
  • 250324 TIL
  • 250321 TIL
Jiyuuuuun
Jiyuuuuun
  • Jiyuuuuun
    Hello, World!
    Jiyuuuuun
  • 전체
    오늘
    어제
    • 분류 전체보기 (112)
      • TIL (56)
      • CS (17)
        • Network (4)
        • Algorithm (10)
      • JAVA (5)
      • Project (10)
        • HakPle (3)
        • JUSEYO (4)
      • Spring (2)
      • C (3)
      • C++ (16)
      • Snags (2)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    react
    my_favorite_place
    멋쟁이사자처럼
    springboot
    JDBC
    db
    java
    node.js
    Kubernetes
    javascript
    JPA
    Docker
    nginx
    부트캠프
    HTML
    SQL
    back-end
    juseyo
    hakple
    CSS
    front-end
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Jiyuuuuun
250325 TIL
상단으로

티스토리툴바