
동아리 지원사이트를 만들면서 서버 배포를 한 과정을 적어보도록 하겠습니다!
이번 글에서는 로컬에서 사용하던 spring 서버와 mysql을 도커로 배포를 하고 도커허브에 올릴 예정입니다.
아래와 같은 순서로 개발을 진행하였습니다.
그러면 먼저 mysql 이미지를 불러오도록 하겠습니다.
먼저 프로젝트 루트 디렉토리에서 docker-compose.yml을 생성을 해줍니다.
물론 명령어를 사용해서 mysql 이미지를 불러올 수도 있는데 이따가 spring 이미지와 mysql이미지를 합칠 예정으로 docker compose를 사용하도록 하겠습니다.
만약 docker compose말고 이미지만 만들어 사용하고 싶다면 이 글을 참고해주세요!
(Docker Compose는 멀티 컨테이너 Docker 애플리케이션을 정의하고 실행하는 도구입니다.)
version: '3'
services:
mysql:
image: mysql:latest
container_name: mysql-container
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: dbname
MYSQL_USER: username
MYSQL_PASSWORD: password
ports:
- "3306:3306"
version: '3' : Docker Compose 파일의 버전을 나타냅니다. services: : 서비스를 정의하는 곳입니다.mysql:: MySQL 서비스의 이름을 나타냅니다.image: mysql:latest : 사용할 Docker 이미지를 지정합니다. 여기서는 공식 MySQL Docker 이미지를 사용하고 있으며, latest 태그로 최신 버전을 가져오게 됩니다.container_name : mysql-container : 이 부분은 컨테이너의 이름을 지정합니다. environment: : MySQL 컨테이너에 전달할 환경 변수들을 설정합니다. MySQL 컨테이너는 이 환경 변수들을 읽어서 MySQL 서버를 설정합니다. 여기서는 root 사용자의 비밀번호, 데이터베이스 이름, 사용자 이름, 사용자 비밀번호를 설정하고 있습니다.MYSQL_ROOT_PASSWORD: password: MySQL root 사용자의 비밀번호를 설정MYSQL_DATABASE: dbname: MySQL 데이터베이스의 이름을 설정MYSQL_USER: username: MySQL 사용자의 이름을 설정MYSQL_PASSWORD: password: MySQL 사용자의 비밀번호를 설정ports:: 호스트와 컨테이너 간의 포트 매핑을 정의합니다. 여기서는 호스트의 3306 포트를 컨테이너의 3306 포트로 매핑하고 있습니다. 이는 MySQL 서버에 접근하기 위해 호스트의 3306 포트를 사용할 수 있도록 합니다.
mysql 옆에 있는 > 버튼을 누르거나
터미널에서 docker-compose up 를 입력하면 mysql 서비스가 실행됩니다.
그러면 이제 spring과 mysql 이미지와 연결을 해보겠습니다.
main>src>resources>application.yml에서 db설정을 해주도록 하겠습니다.
spring:
datasource:
url: jdbc:mysql://localhost:3306/dbname
username: username
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
properties:
hibernate:
dialect: org.hibernate.dialect.MySQLDialect
아까 docker-compose.yml에서 설정한 db정보를 적어줍니다.
테스트를 실행보면 아주 잘 실행됩니다!!

spring 같은 경우에는 배포를 할 때 jar파일을 사용합니다.
먼저 build.gradle에서 jar 파일 이름을 설정하겠습니다.
bootJar {
archiveFileName = '2024-msg-server.jar' // JAR 파일 이름 설정
}

위에 있는 > 버튼을 누르거나
cmd 창에 gradlew build 입력 하면

이제 jar 파일이 생성됩니다.
빌드가 성공적으로 완료되면 build/libs 폴더에 JAR 파일이 생성되게 됩니다.


이후 저는 copy하기 쉽게 jar 파일을 루트 디렉토리에 꺼내놓도록 하겠습니다.

프로젝트 루트 디렉터리에 Dockerfile이라는 이름의 파일을 만들어줍니다.
이 파일은 Docker 이미지를 빌드할 때 사용됩니다.
FROM openjdk:17-alpine
WORKDIR /app
COPY ./2024-msg-server.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
jdk는 현재 자신과 맞는 프로젝트 jdk를 docker 이미지에 검색해서 찾아서 넣으면 됩니다.
FROM openjdk:17-alpine : 이 명령어는 openjdk:17-alpine라는 Docker 이미지를 기반으로 새로운 Docker 이미지를 생성합니다. WORKDIR /app : 현재 작업 디렉토리를 /app으로 설정합니다. 이 디렉토리는 이후의 명령어에서 작업할 기본 디렉토리가 됩니다.COPY ./2024-msg-server.jar app.jar : 현재 Dockerfile이 위치한 디렉토리(.)에 있는 2024-msg-server.jar 파일을 Docker 이미지의 /app 디렉토리로 복사합니다. 또한, 파일을 app.jar로 이름을 변경하여 복사합니다.ENTRYPOINT ["java", "-jar", "app.jar"]: Docker 컨테이너가 시작될 때 실행되는 명령어를 정의합니다. 여기서는 Java 어플리케이션을 실행하는 명령어로, java -jar app.jar가 실행됩니다. 이것은 복사한 JAR 파일을 실행하여 Java 어플리케이션을 시작하는 역할을 합니다.다음으로, Dockerfile이 있는 디렉터리로 이동하고 Docker 이미지를 빌드합니다.
터미널에서 docker build -t 2024-msg-server:1.0 . 입력을 하면 spring 이미지가 생기게 됩니다.
위의 명령어는 Docker 이미지를 빌드하는 명령어입니다.
docker build: Docker 이미지를 빌드하는 명령어입니다.-t 2024-msg-server:1.0: -t 옵션은 빌드한 이미지에 태그를 지정하는데 사용됩니다. 여기서는 2024-msg-server라는 이미지에 버전 1.0의 태그를 붙입니다..: 현재 디렉토리를 나타냅니다. Docker 빌드 컨텍스트로 사용되며, 현재 디렉토리에 있는 Dockerfile을 찾아 이미지를 빌드합니다.
이제 위에서 만든 spring 이미지와 mysql 이미지를 합치도록 하겠습니다.
version: '3'
services:
mysql:
image: mysql:latest
container_name: mysql-container
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: dbname
MYSQL_USER: username
MYSQL_PASSWORD: password
ports:
- "3306:3306"
spring-boot-app:
image: 2024-msg-server:1.1
container_name: spring-boot-container
ports:
- "8080:8080"
depends_on:
- mysql
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/dbname
SPRING_DATASOURCE_USERNAME: username
SPRING_DATASOURCE_PASSWORD: password
spring-boot-app:: Spring Boot 어플리케이션 서비스의 이름을 나타냅니다.image: 2024-msg-server:1.1: Spring Boot 어플리케이션에 사용할 Docker 이미지를 지정합니다. 여기서는 "2024-msg-server" 이미지의 1.1 버전을 사용합니다.container_name: spring-boot-container: Spring Boot 어플리케이션 컨테이너의 이름을 "spring-boot-container"로 설정합니다.ports:: 호스트와 컨테이너 간의 포트 매핑을 정의합니다. 여기서는 호스트의 8080 포트를 컨테이너의 8080 포트로 매핑합니다.depends_on:: 어플리케이션이 시작되기 전에 의존하는 서비스를 정의합니다. 여기서는 MySQL 서비스가 먼저 시작되어야 하므로 depends_on을 사용하여 의존성을 명시합니다.environment:: Spring Boot 어플리케이션에 전달할 환경 변수들을 설정합니다. 여기서는 MySQL 데이터베이스에 접속하기 위한 데이터 소스 URL 및 계정 정보를 설정합니다
이제 저거 >> 누르거나
docker-compose up 를 입력하면 docker compose가 생성됩니다.

그 후 postman을 실행해보았더니 아주 잘 실행되는 것을 확인 할 수 있습니다.


docker images에서 msg server 1.1과 mysql latest를 도커 허브에 올리도록 하겠습니다.

먼저 이미지에 Docker Hub 저장소와 버전을 지정하여 태그 추가를 해줍니다.
docker tag 2024-msg-server:1.1 your-docker-hub-username/2024-msg-server:1.1
docker tag mysql:latest your-docker-hub-username/mysql:latest`
그 후 이미지 푸쉬
# Docker Hub에 이미지 푸시
docker push your-docker-hub-username/2024-msg-server:1.1
docker push your-docker-hub-username/mysql:latest
본인은 아래와 같이 입력


그러면 이제

도커 허브에 올라간게 보입니다.
다음 시간에는 ubuntu에서 이 둘의 이미지를 받고 배포를 하는 글을 작성하도록 하겠습니다!
혹시 이해가 안되는 부분이 있다면 댓글로 알려주세요!
application.ymlspring:
datasource:
url: jdbc:mysql://localhost:3306/dbname
username: username
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
properties:
hibernate:
dialect: org.hibernate.dialect.MySQLDialect
build.gradleplugins {
id 'java'
id 'org.springframework.boot' version '3.2.0'
id 'io.spring.dependency-management' version '1.1.4'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '17'
}
bootJar {
archiveFileName = '2024-msg-server.jar' // JAR 파일 이름 설정
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-mustache'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
// runtimeOnly 'com.mysql:mysql-connector-j'
implementation 'mysql:mysql-connector-java:8.0.33'
compileOnly 'org.projectlombok:lombok'
implementation 'org.projectlombok:lombok:1.18.26'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
DockerfileFROM openjdk:17-alpine
WORKDIR /app
COPY ./2024-msg-server.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
docker-compose.ymlversion: '3'
services:
mysql:
image: mysql:latest
container_name: mysql-container
environment:
MYSQL_ROOT_PASSWORD: passowrd
MYSQL_DATABASE: dbname
MYSQL_USER: username
MYSQL_PASSWORD: passowrd
ports:
- "3306:3306"
spring-boot-app:
image: 2024-msg-server:1.1
container_name: spring-boot-container
ports:
- "8080:8080"
depends_on:
- mysql
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/dbname
SPRING_DATASOURCE_USERNAME: username
SPRING_DATASOURCE_PASSWORD: passowrd