리전은 서울.
우분투 24.0.2였나
storage 30G
등등
cd /
# swap file을 생성해준다. 메모리 확인 시 swap이 있었지만 디렉토리 파일은 만들어야 한다고 함
sudo mkdir /var/spool/swap
sudo touch /var/spool/swap/swapfile
# dd 명령어는 디스크나 파티션의 복사, 이미지 파일 생성, 디스크 작업을 수행하게 함
# https://www.itmaya.co.kr/wboard/view.php?wb=tech&idx=58
# /dev/zero 파일을 입력 대상으로하고 swapfile을 출력 대상으로 한다.
# dd 명령어를 통해 원하는 블록의 크기만큼 새로운 파티션의 0x00을 채워넣기 위해 /dev/zero를 쓴다.
# 2048000만큼 블록 수를 복사하고 한 번에 1KB를 읽고 쓰게 한다. -> 2G 바이트인가 파일을 만든 거
sudo dd if=/dev/zero of=/var/spool/swap/swapfile count=2048000 bs=1024
# swapfile을 설정한다.
sudo chmod 600 /var/spool/swap/swapfile
sudo mkswap /var/spool/swap/swapfile
sudo swapon /var/spool/swap/swapfile
# swapfile을 등록한다.
sudo vim /etc/fstab
# 파일이 열리면 해당 파일 아래쪽에 하단 내용 입력 후 저장
/var/spool/swap/swapfile none swap defaults 0 0
# free로 확인
free -h
timedatectl # 현재 확인
timedatectl list-timezones | grep Seoul # 있는지 확인
sudo timedatectl set-timezone Asia/Seoul
timedatectl
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo systemctl status docker
sudo docker run hello-world
도커 소켓에 접근 권한이 없어서 로그인이고 리포지토리 보는 거고 다 안됨
sudo usermod -aG docker ubuntu
newgrp docker
deploy.yml을 .github/workflow/ 위치에 작성해준다.
name: Java CI with Gradle
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v4 ## 코드 가져오기
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Make Gradle Wrapper Executable
run: chmod +x ./gradlew
- name: Build with Gradle Wrapper
run: ./gradlew build -x test
- name: Set up Docker Buildx # Docker Buildx를 설정 -> 도커 이미지를 빌드하기 위한 빌더로, 여러 플랫폼에서 빌드를 수행한다.
uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub # 도커허브에 로그인한다.
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_ID }}
password: ${{ secrets.DOCKERHUB_PW }}
- name: Build and Push Docker Image # 도커 이미지 빌드 및 허브에 이미지 Push
uses: docker/build-push-action@v5
with:
context: . # 현재 디렉토리
file: ./Dockerfile # 사용할 도커파일 위치
push: true
tags: ${{ secrets.DOCKERHUB_ID }}/just_one_bite:latest
- name: Deploy to Server # appleboy/ssh-action@master 를 통해 서버에 SSH 접속을 수행하고 deploy.sh 스크립트를 실행해 배포를 진행
uses: appleboy/ssh-action@v0.1.10
env:
DOCKERHUB_ID: ${{ secrets.DOCKERHUB_ID }}
DOCKERHUB_PW: ${{ secrets.DOCKERHUB_PW }}
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_SSH_KEY }}
envs: DOCKERHUB_ID, DOCKERHUB_PW
script: |
cd /home/ubuntu/deploy
./deploy.sh
저기 actions의 환경 내에서 변환해줘야 한다. 안그러면 permission denied 뜬다.
docker 허브를 gmail로 로그인하니까 cli로 로그인이 안된다.
그냥 아이디를 새로 하나 팠다
그리고 repository를 하나 만들어준다.
아이디/repo명:태그 이 이름으로 이미지가 올라가게 해놨다.
Settings > Secrets and variables > actions > new repository secret
git action 에서 CI를 해서 build test를 해봤다. 고로 그냥 CD의 과정만 진행했다.
jar 파일만 가지고 이미지를 만들기로 한 것이다!
# 1. JDK 이미지 기반
FROM eclipse-temurin:17-jdk-jammy
# 2. 작업 디렉토리 설정
WORKDIR /app
# 3. 로컬에서 빌드한 jar 파일을 컨테이너에 복사
COPY build/libs/*.jar ~.jar
# 4. 포트 설정 (Spring Boot 기본 8080)
EXPOSE 8080
# 5. 컨테이너 시작 시 실행할 명령
ENTRYPOINT ["java", "-jar", "~.jar"]
이게 우분투 내에서 환경설정을 해놓음.
환경변수로 $DOCKERHUB_ID 등을 만들어놨는데 git action에서 읽지를 못하는 상황을 발견
- name: Deploy to Server # appleboy/ssh-action@master 를 통해 서버에 SSH 접속을 수행하고 deploy.sh 스크립트를 실행해 배포를 진행
uses: appleboy/ssh-action@v0.1.10
env:
DOCKERHUB_ID: ${{ secrets.DOCKERHUB_ID }}
DOCKERHUB_PW: ${{ secrets.DOCKERHUB_PW }}
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_SSH_KEY }}
envs: DOCKERHUB_ID, DOCKERHUB_PW
script: |
cd /home/ubuntu/deploy
./deploy.sh
docker info | grep Username
env를 등록하려면 이렇게 해야 동작하더라는…
#!/bin/bash
echo $DOCKERHUB_PW | docker login --username $DOCKERHUB_ID --password-stdin
docker pull username/reponame:tag
if [ $(docker ps -aq -f name=spring-app) ]; then
docker stop spring-app
docker rm spring-app
fi
docker run -d \
--name spring-app \
-p 8080:8080 \
username/reponame:tag
얼추 컨테이너가 실행되는 것은 볼 수 있다.
그런데 application.yml에 설정과 안맞아서 에러나고 바로 꺼지는 걸 볼 수 있다.
docker pull postgres:15.1
docker run -p 5432:5432 --name postgres \
-e POSTGRES_PASSWORD=~ \
-e TZ=Asia/Seoul \
-v /home/ubuntu/pgdata:/var/lib/postgresql/data \
-d postgres:15.1
sudo apt install openjdk-21-jdk-headless
파일질라로 갖고와서 application.properties 작성 후 빌드 수행
chmod 754 ./gradlew
./gradlew clean build
# 1. JDK 이미지 기반
FROM openjdk:21-jdk
# 2. 작업 디렉토리 설정
WORKDIR /app
# 3. 로컬에서 빌드한 jar 파일을 컨테이너에 복사
COPY build/libs/*SNAPSHOT.jar app.jar
# 4. 포트 설정 (Spring Boot 기본 8080)
EXPOSE 8080
# 5. 컨테이너 시작 시 실행할 명령
ENTRYPOINT ["java", "-jar", "app.jar"]
docker build -t test-app .
docker run -d --name test-app -p 8080:8080 test-app
도커 네트워크를 커스텀으로 안만들고 bridge로 사용하면 컨테이너 이름으로 컨테이너를 참조하는 게 불가능했다.
그래서
docker network create custom-net
docker network connect custom-net postgres
docker run -d --name test-app -p 8080:8080 --network custom-net test-app
이제 DB 연결까지 된 것을 볼 수 있다.
postgres라는 호스트명을 못 찾음 → UnknownHostExceptionpostgres라는 이름으로 접근 가능