mkdir -p ~/back_spring/{web, backend}
cat > web/nginx.conf <<'EOF' events {} http { server { listen 80; server_name _; root /work/web; index index.html index.htm; } } EOF
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
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
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
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
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 더 공부해야징