front(폴더)
nginx.conf 생성
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://1.2.3.4:8080;
}
}
Plain Text
복사
Dockerfile 생성
## React 프로젝트 배포 절차 ##
# 1. node 이미지
FROM node:20 AS build
# 2. 컨테이너에 작업 디렉토리 설정
WORKDIR /app
# 3. package.json & package-lock.json을 작업 디렉토리에 복사 (와일드카드 적용 : *)
COPY package*.json ./
# 4. 의존성 업데이트 및 설치
RUN npm update
RUN npm install
# 5. 소스 코드를 컨테이너에 복사
COPY . .
# 6. React 애플리케이션 빌드
RUN npm run build
# 배포
# 1. nginx 이미지
FROM nginx:alpine
# 2. nginx 설정 파일을 교체
COPY nginx.conf /etc/nginx/conf.d/default.conf
# 3. nginx 기본 html 삭제
RUN rm -rf /usr/share/nginx/html/*
# 4. 빌드된 React 애플리케이션을 nginx 디렉토리로 복사
COPY --from=build /app/build /usr/share/nginx/html
# 5. nginx 포트 노출
EXPOSE 80
# 6. nginx 서버 실행
CMD [ "nginx", "-g", "daemon off;" ]
Java
복사
VM에서 git pull 이후에 docker run
# Dockerfuile 이 있는 경로에서 실행할 경우 '.' 으로 표시
docker build -t frontimage .
# 이미지 생성 이후 확인
hms@ubuntu:~/2024-kosta-project/front$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
frontimage latest 9aba366a599d About a minute ago 50.2MB
<none> <none> e8e7657380ae 2 minutes ago 1.97GB
node 20 dd223fd5024d 5 weeks ago 1.1GB
nginx alpine c7b4f26a7d93 6 weeks ago 43.2MB
Shell
복사
•
로그 찍어보기 + 경로 확인
docker logs -f front-container
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: /etc/nginx/conf.d/default.conf differs from the packaged version
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2024/09/26 00:51:25 [notice] 1#1: using the "epoll" event method
2024/09/26 00:51:25 [notice] 1#1: nginx/1.27.1
2024/09/26 00:51:25 [notice] 1#1: built by gcc 13.2.1 20240309 (Alpine 13.2.1_git20240309)
2024/09/26 00:51:25 [notice] 1#1: OS: Linux 5.15.0-122-generic
2024/09/26 00:51:25 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2024/09/26 00:51:25 [notice] 1#1: start worker processes
2024/09/26 00:51:25 [notice] 1#1: start worker process 29
2024/09/26 00:51:25 [notice] 1#1: start worker process 30
192.168.233.1 - - [26/Sep/2024:01:04:31 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36" "-"
192.168.233.1 - - [26/Sep/2024:01:04:31 +0000] "GET /static/css/main.f855e6bc.css HTTP/1.1" 304 0 "http://192.168.233.128/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36" "-"
192.168.233.1 - - [26/Sep/2024:01:04:31 +0000] "GET /static/js/main.de9920e1.js HTTP/1.1" 304 0 "http://192.168.233.128/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36" "-"
# 1줄만 보여주기 (최신순)
docker logs --tail 1 -f front-container
192.168.233.1 - - [26/Sep/2024:01:04:31 +0000] "GET /static/js/main.de9920e1.js HTTP/1.1" 304 0 "http://192.168.233.128/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36" "-"
# sh 접속
hms@ubuntu:~/2024-kosta-project/front$ docker exec -it front-container /bin/sh
/ # ls
bin home proc sys
dev lib root tmp
docker-entrypoint.d media run usr
docker-entrypoint.sh mnt sbin var
etc opt srv
/ # cd usr/share/nginx/html
/usr/share/nginx/html # ls
asset-manifest.json index.html logo512.png robots.txt
favicon.ico logo192.png manifest.json static
/usr/share/nginx/html # cat index.html
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Web site created using create-react-app"/><link rel="apple-touch-icon" href="/logo192.png"/><link rel="manifest" href="/manifest.json"/><title>React App</title><script defer="defer" src="/static/js/main.de9920e1.js"></script><link href="/static/css/main.f855e6bc.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>/usr/share/nginx/html #
Shell
복사
docker run -d --name front-container -p 80:80 front-image
hms@ubuntu:~/2024-kosta-project/front$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
front-image latest 87ed939d1f53 4 seconds ago 50.2MB
<none> <none> e2102b88367b 5 seconds ago 1.97GB
<none> <none> e8e7657380ae 38 minutes ago 1.97GB
node 20 dd223fd5024d 5 weeks ago 1.1GB
nginx alpine c7b4f26a7d93 6 weeks ago 43.2MB
hms@ubuntu:~/2024-kosta-project/front$ docker rmi e8e
Deleted: sha256:e8e7657380ae36b037c958c3fe64100e1c79cb4aaedbb526d6ce5e2db682eb24
Deleted: sha256:e7e8a1538893edeb505532c415c8136101f8dc5ee1edaa6245903690a25753d2
Deleted: sha256:518c50e89e4251253f5b245bd890346e97acfa6f37a80de7712dab349215ee64
Deleted: sha256:4675debf5af52336fb8e703ff69987cf80bcb3c1aa30b2169daa021c38a01a28
hms@ubuntu:~/2024-kosta-project/front$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
front-image latest 87ed939d1f53 54 seconds ago 50.2MB
<none> <none> e2102b88367b 55 seconds ago 1.97GB
node 20 dd223fd5024d 5 weeks ago 1.1GB
nginx alpine c7b4f26a7d93 6 weeks ago 43.2MB
hms@ubuntu:~/2024-kosta-project/front$ docker run -d --name front-container -p 80:80 front-image
188d7ca39f2b08a8c0ab88f22885466736b8381efe7d5779634057ddfbde5b5e
Shell
복사
Backend(폴더)
Dockerfile
# 빌드
# 1. 빌드 이미지 (gradle)
FROM gradle:8-jdk17-alpine AS build
# 2. 컨테이너 작업 디렉토리 설정
WORKDIR /app
# 3. Gradle 파일만 복사
COPY build.gradle settings.gradle gradlew ./
COPY gradle ./gradle
# 4. 프로젝트 파일 전체 복사
COPY . .
# 5. gradlew 파일에 실행 권한을 추가 부여 (gradlew은 빌드를 진행하기 위한 파일)
# [r : 읽기 권한, w : 쓰기 권한, x : 실행 권한]
RUN chmod +x gradlew
# 6. 빌드 실행
RUN ./gradlew clean build -x test
# 배포
# 1. openjdk 이미지
FROM openjdk:17-jdk-alpine
# 2. 컨테이너 작업 디렉토리 설정
WORKDIR /app
# 3. 빌드 단계에서 생성된 jar 파일 복사 (build.gradle jar { enabled: false })
COPY --from=build /app/build/libs/*.jar /app/app.jar
# 4. 포트 노출
EXPOSE 8080
# 5. 애플리케이션 실행
ENTRYPOINT [ "java", "-jar", "/app/app.jar" ]
Shell
복사
VM에서 git pull 이후 이미지 생성 + mysql setting
docker build -t back-image .
docker pull mysql
ms@ubuntu:~/2024-kosta-project/back$ docker run \
> -d \
> --name mysql-container \
> -p 3306:3306 \
> -e MYSQL_ROOT_PASSWORD=1234 \
> -e MYSQL_USER=codesche \
> -e MYSQL_PASSWORD=1234 \
> -e MYSQL_DATABASE=rest_blog_db \
> -e TZ=Asia/Seoul \
> mysql
be0be3b5b948a5e36d3d82588f606247a360662573ec5fe2c44bf2238aef9d94
hms@ubuntu:~/2024-kosta-project/back$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
be0be3b5b948 mysql "docker-entrypoint.s…" 3 seconds ago Up 2 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql-container
188d7ca39f2b front-image "/docker-entrypoint.…" 33 minutes ago Up 33 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp front-container
hms@ubuntu:~/2024-kosta-project/back$ docker exec -it mysql-container mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 9.0.1 MySQL Community Server - GPL
Copyright (c) 2000, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| rest_blog_db |
| sys |
+--------------------+
5 rows in set (0.00 sec)
Shell
복사
Mysql 8버전으로 변경
hms@ubuntu:~/2024-kosta-project$ docker stop mysql-container
mysql-container
hms@ubuntu:~/2024-kosta-project$ docker rm mysql-container
mysql-container
hms@ubuntu:~/2024-kosta-project$ docker rmi mysql:latest
Untagged: mysql:latest
Shell
복사
Docker Network 생성
hms@ubuntu:~/2024-kosta-project$ docker network create kosta-net
970b6b04c809fc242d3b025743decf6a27858f72404630b6169e0b57661a77e2
hms@ubuntu:~/2024-kosta-project$ docker network ls
NETWORK ID NAME DRIVER SCOPE
81e2e1ded856 bridge bridge local
a801247236dd host host local
970b6b04c809 kosta-net bridge local
fc5689946292 none null local
c647ffc00bdc rest_shopping_jpa-network bridge loca
Shell
복사
Docker 기본 절차
•
이미지 빌드 → 컨테이너 생성
docker build -t back-image .
docker images
docker run -d --name back-container -p 8080:8080 -e SPRING_DATASOURCE_URL=jdbc:mysql://mysql-container:3306/rest_blog_db -e SPRING_DATASOURCE_USERNAME=root -e SPRING_DATASOURCE_PASSWORD=1234 --network kosta-net back-image
Shell
복사
Docker-compose yml 파일 생성 위한 초기화
hms@ubuntu:~/2024-kosta-project/back$ docker stop front-container back-container mysql-container
front-container
back-container
mysql-container
hms@ubuntu:~/2024-kosta-project/back$ docker rm front-container back-container mysql-container
front-container
back-container
mysql-container
hms@ubuntu:~/2024-kosta-project/back$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
660c94f1e4d3 f05d9449e619 "/bin/sh -c './gradl…" 4 hours ago Exited (126) 4 hours ago charming_williamson
hms@ubuntu:~/2024-kosta-project/back$ docker rm 660c
660c
hms@ubuntu:~/2024-kosta-project/back$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
back-image latest f95d8a9d5226 23 minutes ago 377MB
<none> <none> 01f78139c4ef 23 minutes ago 660MB
<none> <none> a6543a52708b 3 hours ago 660MB
<none> <none> 894ff6326204 3 hours ago 377MB
<none> <none> 3af1ab7b093f 3 hours ago 660MB
<none> <none> 0c16c8268714 4 hours ago 660MB
<none> <none> f05d9449e619 4 hours ago 608MB
front-image latest 87ed939d1f53 4 hours ago 50.2MB
<none> <none> e2102b88367b 4 hours ago 1.97GB
gradle 8-jdk17-alpine b3c54050e08c 2 weeks ago 555MB
node 20 dd223fd5024d 5 weeks ago 1.1GB
nginx alpine c7b4f26a7d93 6 weeks ago 43.2MB
mysql 8 f742bd39cd6b 2 months ago 584MB
openjdk 17-jdk-alpine 264c9bdce361 3 years ago 326MB
hms@ubuntu:~/2024-kosta-project/back$ docker network rm kosta-net
kosta-net
hms@ubuntu:~/2024-kosta-project/back$ docker rmi $(docker images -q)
Shell
복사
Docker-compose yml 파일 생성
•
Docker-compose는 network도 같이 생성해준다.
Front
version: '3'
services:
react-app:
build:
context: .
container_name: front-container
ports:
- "80:80"
Docker
복사
Dockerfile nginx.conf package.json public README.md src
hms@ubuntu:~/2024-kosta-project/front$ git pull
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 4 (delta 3), reused 3 (delta 2), pack-reused 0 (from 0)
Unpacking objects: 100% (4/4), 392 bytes | 130.00 KiB/s, done.
From https://github.com/codesche/2024-kosta-project
b0875b7..c7a841c main -> origin/main
Updating b0875b7..c7a841c
Fast-forward
front/{src => }/docker-compose.yml | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename front/{src => }/docker-compose.yml (100%)
hms@ubuntu:~/2024-kosta-project/front$ ls
docker-compose.yml Dockerfile nginx.conf package.json public README.md src
hms@ubuntu:~/2024-kosta-project/front$ docker-compose up -d
# 삭제 후 다시 빌드 (진행 시 실행하지는 않았음)
hms@ubuntu:~/2024-kosta-project/front$ docker-compose up --build -d
Shell
복사
Back
•
build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.3'
id 'io.spring.dependency-management' version '1.1.6'
}
group = 'com.kosta'
version = '0.0.1-SNAPSHOT'
// executable jar 파일만 생성
// 해당 단계 수행 위해 적용
// Dockerfile - 3. 빌드 단계에서 생성된 jar 파일 복사 (build.gradle jar { enabled: false })
jar {
enabled = false
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
// OAuth2
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
// JWT 추가
implementation 'io.jsonwebtoken:jjwt-api:0.12.6'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.12.6'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.12.6'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
tasks.named('test') {
useJUnitPlatform()
}
Plain Text
복사
•
docker-compose.yml
version: '3'
services:
mysql:
image: mysql:8
container_name: mysql-container
environment:
- MYSQL_ROOT_PASSWORD=1234
- MYSQL_USER=codesche
- MYSQL_PASSWORD=1234
- MYSQL_DATABASE=rest_blog_db
- TZ=Asia/Seoul
ports:
- "3306:3306"
networks:
- kosta-net
back-image:
build:
context: .
container_name: back-container
ports:
- "8080:8080"
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql-container:3306/rest_blog_db
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=1234
networks:
- kosta-net
depends_on:
- mysql
restart: always
networks:
kosta-net:
driver: bridge
Docker
복사
•
git pull 이후
# docker-compose 실행
docker-compose up -d
Docker
복사