EC2(or Server) + Github Action + Docker로 API 서버 코드 배포해보기

Restart Programmer
6 min readMay 1, 2024

--

최근에 Github Action을 사용할 일이 있어서 작업을 했다. 이 경험을 토대로 정말 간단한 서버에 SSH 접속을 통한 Docker Container 배포를 해보는 것을 공유할려고 한다.

EC2라고 제목에서 달기는 했는데, EC2가 아니더라도, 리눅스가 깔려있는 운영체제로 생각할려고 합니다. 여기서는 예시를 토대로 Ubuntu22.04 LTS를 기반으로 작업을 수행해보자. (Debian 개열이면 다 될거 같습니다.)

Photo by Alex Kulikov on Unsplash

SSH 접속

SSH 하는 방법을 잘 알고 있으면 됩니다. AWS는 pem으로 Key값을 사용하는데 그런 경우 명령어는 다음과 같습니다.

ssh -i {key_name}.pem {id}@{ip}
ssh {id}@{ip} # 비밀번호일 경우 이렇게 입력하면 된다.

아래의 명령어를 통해서 운영체제의 프로그램들을 업데이트해보자!!

sudo apt update && sudo apt upgrade -y

Docker 설치

Docker 설치는 아래의 링크에서 설명이 자세히 나와있다.

공식문서를 그대로 따라해보자.

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] 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

GPG key 추가하고 APT 저장소 추가 후에 설치하는 내용인데, 생략하고 도커 설치를 완료했으면 docker -version 을 쳐보면 된다.

DokerImage 파일 만드는 부분은 생략합니다.

Github Action

Github Action은 Github Repository에서 바로 소프트웨어 개발 플로우를 진행하기 편하게 해주는 도구입니다. 빌드나 테스트 배포 등의 파이프라인을 만들 수 있게 해주는 도구입니다.

자세한 설명과 이론은 Github Action Document를 참고하시길 바랍니다.

저는 Github Action으로 아래와 같이 구성했다.

name: API CI

on:
push:
branches: [ "main" ]

jobs:
deploy:
name: deploy watermark api server
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v2

- name: Code Repository File to EC2
uses: appleboy/scp-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_KEY }}
port: 22
source: "."
target: "/home/ubuntu/api"

- name: Docker Image Build And Run
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_KEY }}
port: 22
script: |
cd /home/ubuntu/api
sudo docker build -t api .
sudo docker container stop api
sudo docker container rm api
sudo docker run --name api --env-file .env -d -p 80:80 api

위에 보면 3가지 스텝으로 작동합니다.

  1. 브랜치 체크아웃을 함
  2. 체크아웃한 브랜치를 Repository를 서버에 다운로드 합니다. (기존에 Github Screts으로 등록해둔 값을 가져와서 반영합니다.
  3. SSH 접속을 해서 Docker 이미지를 빌드하고 실행시켜줍니다.

조금 더 디테일하게 설명하자면

2번 행위 당시에 서버 접속 정보로 username은 ssh 접속 user값, key값은 pem 파일값, 만약 비밀번호라면 password 속성을 추가해서 작성하면 됩니다. (key 값을 없앤채로)

아래의 target은 Repository 디렉토리를 설정합니다.

해당 Github Action은 아래 링크에 더 자세히 옵션들이 나와있습니다.

그리고 세번째 Docker 명령어는 복사한 레포지토리를 타서 DockerImage 파일이 설정되어 있다는 가정하에 이미지를 빌드하고 예전의 컨테이너를 제거한 뒤에 이를 다시 실행시킨다.

다들 도움이 되었으면 좋겠다.

--

--