본문 바로가기

cloud

[NCP] Naver Cloud Platform 활용기 - (3) docker 기반 애플리케이션 배포

Naver Cloud Platform 활용기 - (1) server 생성하기
Naver Cloud Platform 활용기 - (2) Cloud DB for MySQL 생성하기
Naver Cloud Platform 활용기 - (3) docker 기반 애플리케이션 배포
Naver Cloud Platform 활용기 - (4) pinpoint를 활용한 시스템 모니터링
Naver Cloud Platform 활용기 - (5) jmeter를 활용한 load test와 pinpoint 모니터링

 

이전 글에서 NCP 기반 linux server와 db server를 생성하였다. 이제 ubuntu 서버에서 미리 만들어 둔 docker image를 가져와 실행시켜보고자 한다.

지금부터는 어느 클라우드를 쓰든 동일한 방법으로 서버를 구성할 수 있으므로 다른 글들을 참조해도 좋다.

github actions를 활용해 docker 기반으로 ci pipeline을 구성하는 방법은 다음 글을 참고하길 바란다. 해당 글은 spring boot 기반 애플리케이션을 도커 기반으로 빌드하고 docker hub 이미지 push를 github actions 기반으로 설정한 것이다. deploy에 대한 설정은 아래 글에서 다루진 않았는데, 이번 글에서 ssh 기반으로 ncp server에 접근하는 방법을 알아볼 예정이다.

Spring boot 도커 hub에 올리고 로컬 DB(MySQL)와 연동하기(feat. github actions)

 

Server 내 Docker 설치

서버에 docker를 설치하는 방법은 여러 글에서 나오므로 생략한다. 도커 공식 사이트의 글을 참고하여 설치하는 것을 권장한다.

https://docs.docker.com/engine/install/ubuntu/

 

Spring Boot application datasource 설정

Cloud DB for MySQL에 접속하려면 db 서버 생성 시 설정한 Public 도메인이 host가 되고, port는 설정했던 3306으로 설정하면 된다. 만약 port를 다른 것으로 설정했다면 해당 포트를 명시하면 된다.

이 때, 이전 글에서 설명한 것처럼 db AGC 내 application server의 IP가 3306 포트에 접근할 수 있도록 설정해주어야 한다.

username, password도 아래와 같이 'DB User 관리'에서 설정한 user 정보를 넣어주면 된다.

# application.yml

spring:
  datasource:
    url: jdbc:mysql://{cloud-mysql-public-domain}:3306/{database-name}
    username: {your-username}
    password: {your-password}
    driver-class-name: com.mysql.cj.jdbc.Driver

 

application에서 설정한 database도 같이 만들어줘야 하는데 아래처럼 추가할 수 있다.

 

서버를 생성하고 기반 프로그램을 설치하는 내용을 대략적으로 정리하면 다음과 같다.

# docker 설치
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# docker login
docker login -u {username} -p {password}

# docker login 안될 시
apt-get install gnupg2 pass

# docker-compose 안될 시
apt install docker-compose

# redis 설치
sudo apt install lsb-release curl gpg
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list

sudo apt-get update
sudo apt-get install redis

# redis status
redis-cli ping

 

이제 docker-hub에 업로드한 image를 pull 받아서 application을 docker-compose 기반으로 실행시켜보자. docker container network로 인해 host ip로 접근 시 연결이 안될 수 있는데, 이 때는 network mode를 host로 바꾸어주면 된다.

version: '3'
services:
  web:
    image: {docker-hub-name}/{docker-hub-repo}:{tag}
    container_name: {your-container-name}
    restart: always
    ports:
      - 8080:8080
    network_mode: host  #docker-container 네트워크가 아닌 host network를 사용하고 싶을 시 사용
    
    # application.yml에 설정해두었다면 굳이 안해도 된다.
    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://{cloud-db-public-domain}:3306/{your-database}
      - SPRING_DATASOURCE_USERNAME={your-username}
      - SPRING_DATASOURCE_PASSWORD={your-password}

 

postman으로 테스트했을 때 정상적으로 연결이 되었고, db에도 정상적으로 데이터가 insert 되었다.

 

github actions에서 NCP server 접속하기

추가적으로 위에서 github actions로 ssh 기반 NCP server 접속 방법을 살펴보고자 했다. 최종적으로 구성한 deploy.yml 구성은 다음과 같다.

마지막에 ssh 접근 step이 있는데, NCP에서 생성한 server의 공인IP를 host에 입력하고 해당 서버의 username, password를 명시해주면 해당 서버에 접근이 가능하다. 이전 글에서 ACG는 미리 설정해두었다.

서버 접속 이후 특정 script를 실행시키도록 미리 shell script를 만들어두고 아래와 같이 설정하였다.

name: dev-deploy

on:
  workflow_dispatch:
  push:
    branches: [ "main", "develop", "feature/github-actions" ]

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - name: Set up JDK 11
        uses: actions/setup-java@v3
        with:
          java-version: '11'
          distribution: 'temurin'

      - name: Grant execute permission for gradlew
        run: chmod +x gradlew

      - name: Build with Gradle
        run: ./gradlew clean build

      # 도커허브 로그인
      - name: Login to DockerHub
        uses: docker/login-action@v2
        with:
          username: ${{secrets.DOCKER_HUB_USERNAME}}
          password: ${{secrets.DOCKER_HUB_TOKEN}}

      # 도커 이미지 생성 및 도커허브 업로드
      - name: Create docker image and Upload to DockerHub
        env:
          NAME: ${{ secrets.DOCKER_NAME }}
          REPO: ${{ secrets.DOCKER_REPO }}
          IMAGE: ${{ secrets.DOCKER_IMAGE }}
        run: |
          docker build -f ./dockerfile -t $IMAGE .
          docker tag $IMAGE:latest $NAME/$REPO:latest
          docker push $NAME/$REPO:latest

      # ssh 접속 및 shell 실행
      - name: executing remote ssh commands using password
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.NCP_HOST }}
          username: ${{ secrets.NCP_DEV_USERNAME }}
          password: ${{ secrets.NCP_DEV_PASSWORD }}
          script: |
            ./playground.sh