우분투 도커에 자바 스프링 백엔드 서버 구축 및 배포

kk21·2025년 9월 1일
0

우분투 서버 구축

목록 보기
19/19

작업 디렉터리

디렉터리 생성

mkdir -p ~/back_spring/{web, backend}


프론트엔드(웹)

ngignx 사용

cat > web/nginx.conf <<'EOF'
events {}
http {
  server {
    listen 80;
    server_name _;
    root /work/web;
    index index.html index.htm;
  }
}
EOF

Web/dockerfile

cat > web/Dockerfile <<'EOF'
FROM nginx:alpine
RUN apk add --no-cache bash nano
WORKDIR /work/web
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
EOF

샘플 index.html

cat > web/index.html <<'EOF'
<!doctype html>
<html>
  <head><meta charset="utf-8"><title>Static Web on 1224</title></head>
  <body>
    <h1>컨테이너 안에서 개발 중 (웹)</h1>
    <p>외부에서: <b>http://YOUR_SERVER_IP_OR_DOMAIN:1224</b></p>
    <p>백엔드 API: <a href="http://YOUR_SERVER_IP_OR_DOMAIN:8080/api/hello">/api/hello</a></p>
  </body>
</html>
EOF


백엔드

dockerfile

cat > ~/back_spring/backend/Dockerfile.dev <<'EOF'
FROM maven:3.9.6-eclipse-temurin-21
# 편의 툴(Optional)
RUN apt-get update && apt-get install -y nano && rm -rf /var/lib/apt/lists/*
WORKDIR /work/backend
EXPOSE 8080
# 컨테이너가 바로 개발 서버로 뜨도록
CMD ["bash", "-lc", "mvn -B spring-boot:run -Dspring-boot.run.fork=false"]
EOF

pom.xml

cat > backend/pom.xml <<'EOF'
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>back-spring</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
  <name>back-spring</name>

  <properties>
    <java.version>21</java.version>
    <maven.compiler.release>17</maven.compiler.release>
    <spring.boot.version>3.3.3</spring.boot.version>
  </properties>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>${spring.boot.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency>
    <dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency>
    <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
      <optional>true</optional>
      <scope>runtime</scope>
    </dependency>
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.11.0</version>
        <configuration><release>${maven.compiler.release}</release></configuration>
      </plugin>
    </plugins>
  </build>
</project>
EOF


실행 배포 확인

실행 테스트

mkdir -p backend/src/main/java/com/example/demo

mkdir -p backend/src/main/resources

cat > backend/src/main/java/com/example/demo/DemoApplication.java <<'EOF'
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
  public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
  }
}
EOF

cat > backend/src/main/java/com/example/demo/HelloController.java <<'EOF'
package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
  @GetMapping("/api/hello")
  public String hello() {
    return "Hello Backend (Spring Boot 8080, JDK21, JAR target 17)";
  }
}
EOF

cat > backend/src/main/resources/application.yml <<'EOF'
server:
  port: 8080
spring:
  datasource:
    url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;MODE=PostgreSQL
    driver-class-name: org.h2.Driver
    username: sa
    password:
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
management:
  endpoints:
    web:
      exposure:
        include: health,info
EOF

docker-compose 작성

cat > docker-compose.yml <<'EOF'
services:
  web:
    build:
      context: ./web
      dockerfile: Dockerfile
    container_name: web-dev
    working_dir: /work/web
    volumes:
      - ./web:/work/web:rw
    ports:
      - "1224:80"
    restart: unless-stopped

  api:
    build:
      context: ./backend
      dockerfile: Dockerfile.dev
    container_name: api-dev
    working_dir: /work/backend
    volumes:
      - ./backend:/work/backend:rw
    ports:
      - "8080:8080"
    environment:
      - MAVEN_OPTS=-Xmx1g
    restart: unless-stopped
EOF

빌드

docker compose build --no-cache api

실행

docker compose up -d

확인

docker compose ps


세팅 끝 😵

compose 더 공부해야징

profile
LLM Engineer의 성장 일기 ing. . . ✨

0개의 댓글