인스턴스 스팟이 종료 될 때마다 편하게 다시 연결하기 위해 미리 작성해 놓는 프로세스 게시글
_
❌ 언더바 넣지 않을 것 ❌1
인스턴스 생성
2
Xshell ( 코드 아래 참고 )
3
IntelliJ 와 DB 연동
4
DockerFile
제작
5
GitLab 이용해서 자동배포화 - CI.yml
, deploy.sh
, Crontab
1
~ 3
➡ { https://velog.io/@sj9802/221011 }
4
~ 5
➡ { https://velog.io/@sj9802/EC2-무중단-배포 }
// 관리자 권한으로 실행
sudo su -
mkdir git
cd git
git clone https://github.com/S2uJeong/docker_install.git
// docker 설치
cd docker_install/
sh docker_install.sh
docker run -p 80:80 nginx // 웹 주소창 입력해서 연결확인
// sql 연동
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password(내가입력) -d mysql
docker ps // 입력해서 연동 확인.
스키마 생성을 해서 DB를 생성
해준다. Edit configlation
기능을 통해 환경변수에 host 내용을 바꿔준다.SPRING_DATASOURCE_URL
SPRING_DATASOURCE_USERNAME
SPRING_DATASOURCE_PASSWORD
📌 위 이름들로 변수명을 해주어야 SPRING이 인식함으로, 에러가 나지 않게 스펠링 꼭 지켜서 설정해주자. DB 환경변수 입력시, 아래와 같이 입력 해주어야 한다.
SPRING_DATASOURCE_URL=jdbc:mysql://{host명}:3306/{db명}
ex)
SPRING_DATASOURCE_URL=jdbc:mysql://ec2-15-164-208-176.ap-northeast-2.compute.amazonaws.com:3306/likelion-db
Dockerfile
제작📌 Dockerfile ⬅ 이 이름
은 바꾸지 않고 무조건 철자 그대로 해야한다.
FROM gradle:7.4-jdk11-alpine as builder
WORKDIR /build
# 그래들 파일이 변경되었을 때만 새롭게 의존패키지 다운로드 받게함.
COPY build.gradle settings.gradle /build/
RUN gradle build -x test --parallel --continue > /dev/null 2>&1 || true
# 빌더 이미지에서 애플리케이션 빌드
COPY . /build
RUN gradle build -x test --parallel
# APP
FROM openjdk:11.0-slim
WORKDIR /app
# 빌더 이미지에서 jar 파일만 복사
COPY --from=builder /build/build/libs/*-SNAPSHOT.jar ./app.jar
EXPOSE 8080
# root 대신 nobody 권한으로 실행
USER nobody
ENTRYPOINT [ \
"java", \
"-jar", \
"-Djava.security.egd=file:/dev/./urandom", \
"-Dsun.net.inetaddr.ttl=0", \
"app.jar" \
]
📌 GitLab에서 환경변수 등록 해준다 - $GITLAB_USER
, $PROJECT_NAME
, $GITLAB_PASSWORD
이때, 대문자
❌, 일부 특수기호
❌ ( !, ~ 등) 마스크 기능 사용 시 제대로 해석이 안되므로, @
와 같은 특수기호를 사용하고 소문자를 사용한다.
.gitlab-ci.yml
stages:
- dockerbuild-push
package:
image: docker:latest
stage: dockerbuild-push
services:
- docker:dind
before_script:
- docker login registry.gitlab.com -u $GITLAB_USER -p $GITLAB_PASSWORD
script:
- docker build -t registry.gitlab.com/$GITLAB_USER/$PROJECT_NAME .
- docker push registry.gitlab.com/$GITLAB_USER/$PROJECT_NAME
after_script:
- docker logout
deploy.sh
#set value // 띄어쓰기 넣으면 인식못함 주의 NAME= gitlab (X)
PROJECT_NAME={프로젝트 이름}
#!/bin/bash
set -ex
docker pull registry.gitlab.com/s2ujeong1/$PROJECT_NAME:latest | grep "Image is up to date" && pull_status="already_pulled" || pull_status="newly_pulled"
echo $pull_status
if [ "$pull_status" = "newly_pulled" ]; then
docker stop $PROJECT_NAME
docker rm -f $PROJECT_NAME
docker run -p 8080:8080 --name $PROJECT_NAME -e SPRING_DATASOURCE_URL=jdbc:mysql//ec2-3-36-64-158.ap-northeast-2.compute.amazonaws.com:3306/project-db -e SPRING_DATASOURCE_PASSWORD=0000 -d registry.gitlab.com/s2ujeong1/$PROJECT_NAME
docker image prune -f
fi
crontab -e
이 과정 해주기 전에, 직접 sh deploy.sh
명령해서 스크립트 잘 돌아가는지 확인해보기
* * * * * sh /home/ubuntu/deploy.sh >> /home/ubuntu/deploy.log
DOCKER RUN
docker run -p 8080:8080 --name {gitlab 프로젝트명 } -e SPRING_DATASOURCE_URL={} -e SPRING_DATASOURCE_PASSWORD={} -d {registry path}
ex) docker run -p 8080:8080 --name gitlab-exercise -e SPRING_DATASOURCE_URL=jdbc:mysql://ec2-3-36-64-158.ap-northeast-2.compute.amazonaws.com:3306/likelion_db2 -e SPRING_DATASOURCE_PASSWORD=passward -d registry.gitlab.com/s2ujeong1/gitlab-exercise
DOCKER LOG
확인docker logs {containner id}
DOCKER LOGIN
docker login registry.gitlab.com/{userName}/{projectName} -p {password}