docker로 실행되는 web을 EC2에 배포하는 과정을 GithubAction을 사용하여 자동화하자
컨테이너 실행 시 웹이 열리는 도커파일을 준비합니다.
웹을 만들기 전에 배포를 찾아서 이 글으로 왔을 리는 없으니 웹은 잘 만들었다고 생각하겠습니다.
만약 리액트로 웹을 만들었다면 아래와 같이 작성해 줄 수 있고 파일 이름은 Dockerfile
입니다.
#Dockerfile
FROM node:16
WORKDIR /usr/src/app
COPY package.json ./
RUN npm install
COPY . .
CMD [ "npm", "start"]
docker daemon을 실행시키고 아래 명령어로 정상적으로 실행되는지 확인합니다.
{포트}에는 자신의 웹이 실행되는 포트를 적으면 됩니다.
docker build --tag my-web:latest .
docker run -d -p 80:{포트} --name my-web my-web:latest
위와 같이 실행하면 localhost:80에서 웹 페이지로 접근할 수 있습니다.
docker에 대한 자세한 내용은 생략하겠습니다.
Github repository에서 Action을 설정해줍시다.
Dockerfile
이 있는 repository로 이동하고 Actions
을 클릭합니다.set up a workflow yourself
를 클릭하여 workflow를 만들어줍시다.name: CICD # actions 이름. 아무렇게나 지어도 됨
on:
push:
branches: [main] # main branch에 push될 때 해당 파일을 실행
jobs:
# 빌드
build:
runs-on: ubuntu-latest
steps: #step 순서대로 실행됨
# 레포지토리의 파일을 CI 서버로 내려받음
- name: Checkout # step의 이름. 아무렇게나 지어도 됨
uses: actions/checkout@v2 # 사용할 동작을 정의
# docker cli 플러그인인 buildx 설치. 후에 도커를 빌드할 수 있게 해줌
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
# dockerhub에 이미지를 업로드 하기 위해 도커 로그인
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }} # dockerhub name
password: ${{ secrets.DOCKERHUB_TOKEN }} # dockerhub password
# .env파일 생성. 웹을 만들다보면 유출되면 안되는 변수를 .env에 담는다. 배포할 때는 같이 빌드되어야하기 때문에 깃헙 액션으로 설정해줘야 한다.
- name: Generate Environment Variables File for Production
run: |
echo "VARIABLE=$VARIABLE" >> ./dir/.env
env:
VARIABLE: ${{ secrets.VARIABLE }}
# docker 이미지를 생성하고 dockerhub에 푸쉬
- name: Proxy Build And Push
uses: docker/build-push-action@v2
with:
context: ./dir # dockerfile이 있는 위치랑 맞춰주자
file: ./dir/Dockerfile # 빌드할 Dockerfile이 있는 디렉토리
platforms: linux/amd64 # 빌드할 때 사용할 환경.
push: true # Dockerhub 푸쉬 여부
tags: ${{ secrets.DOCKERHUB_USERNAME }}/my-web # docker 이미지 이름
# 배포
deploy:
needs: build # build 후에 실행되도록 정의
name: Deploy
runs-on: [self-hosted, label-go] # AWS ./configure에서 사용할 label명
steps:
- name: Login to ghcr
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GHCR_TOKEN }}
- name: Docker run
run: |
docker stop my-web && docker rm my-web && docker rmi ${{ secrets.DOCKERHUB_USERNAME }}/my-web:latest
docker pull ${{ secrets.DOCKERHUB_USERNAME }}/my-web:latest
docker run -d -p 80:80 --name my-web ${{ secrets.DOCKERHUB_USERNAME }}/my-web:latest
github 레포지토리에서 Settings
> Secrets
> Actions
> New repository secret
을 눌러 변수를 생성한다.
아래와 같이 변수를 선언하는 창이 뜨는데 Name과 Value에 넣어줘야 할 값들은 다음과 같다.
Name | Value |
---|---|
DOCKERHUB_USERNAME | DockerHub userName |
DOCKERHUB_TOKEN | DockerHub 토큰 |
VARIABLE | .env에 들어갈 환경변수 |
GHCR_TOKEN | Github 로그인을 위한 토큰 |
DOCKERHUB_USERNAME는 자신이 DockerHub에 로그인할 때 사용하는 것을 입력해주면 되고 DOCKERHUB_TOKEN는 Account Settings
> Security
> New Access Token
으로 생성해주면 된다. 생성할 때 알려주는 토큰은 다시 볼 수 없으니 잘 복사해서 옮겨주자.
깃헙 우측 상단의 자기 프로필을 누른 후 Settings
> Developer settings
> Personal access tokens
> New personal access token
로 생성하자.
다음과 같이 3개의 권한을 체크해주고 생성해준 후 토큰을 잘 복사해서 옮겨주자. 이 토큰은 재발급 받을 수 있다.
EC2를 생성하고 docker와 github runner를 깔아주자
ec2를 생성하고 ssh로 접속해주자.
도커를 설치하고 ec2-user에게 도커를 실행할 권한을 주고 나갔다가 들어와야 한다.
sudo yum update -y
sudo amazon-linux-extras install docker
sudo su usermod -a -G docker ec2-user
아래 명령어가 ec2-user권한으로 실행된다면 docker에 대한 준비는 끝났다.
docker info
이제 runner를 깔아주자
Settings
> Actions
> Runners
> New self-hosted runner
를 클릭하여 러너를 생성해주자
ec2환경이 Linux이므로 Linux를 선택하고 그 밑에 나오는 코드를 ec2에서 주르륵 복붙해야 한다.
복붙하기 전에
sudo yum install perl-Digest-SHA -y
위 명령어로 shamsum 명령어를 실행가능하게 해주자
그리고 runner를 설치하다가 config에서 입력값을 입력하는 절차가 있는데 이 때 다른 건 다 엔터키로 넘어가고
label은 label-go
라고 입력해주자.
그리고 ./run.sh 로 러너를 실행한 상태에서 메인에 푸쉬가 들어가면 ec2에 배포가 된다.