github 배포에 이어서 도커배포도 해봤다.
대부분 비슷하지만 도커 설치 하고 actions부분에서 실행하는 코드가 살짝 다르다.
name: Docker Image CD
on:
push:
branches:
- prod
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build & Push the Front Docker image
uses: docker/build-push-action@v2
with:
context: ./frontend
file: ./frontend/dockerfile
push: true
tags: ${{ secrets.DOCKER_FRONT_REPO }}
build-args: |
REACT_APP_BASE_URL=${{ secrets.REACT_APP_BASE_URL }}
REACT_APP_FABRIC_URL=${{ secrets.REACT_APP_FABRIC_URL }}
- name: Deploy Front to prod
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.FRONT_HOST }}
username: ${{ secrets.AWS_USERNAME }}
password: ${{ secrets.AWS_PASSWORD }}
port: 22
script: |
sudo docker rm -f $(docker ps -qa)
sudo docker rmi ${{ secrets.DOCKER_FRONT_REPO }}
sudo docker pull ${{ secrets.DOCKER_FRONT_REPO }}
sudo docker run --rm -d -p ${{ secrets.AWS_PORT }}:80 ${{ secrets.DOCKER_FRONT_REPO }}
1. 환경 구축
EC2 : Amazon Linux
(1) EC2 아이디, 비밀번호 설정
EC2 터미널 이동 -> 아이디, 비밀번호 설정 -> 비밀번호로 접근 허용
깃허브에서 EC2에 접근하는 방법은 비밀키를 만들 수도 있지만 간단하게 아이디, 비밀번호를 통해 접근할 수도 있다.
위 링크에서 키를 만드는 방법을 볼 수 있다.
나는 비밀번호를 통해 접근하도록 설정할 것이다.
EC2 터미널 이동후 아래 코드 작성
sudo passwd ec2-user
나는 기본으로 주어지는 ec2-user 에 대해서 비밀번호를 설정하고 접근을 허용해줄 예정이다.
sudo vi /etc/ssh/sshd_config
PasswordAuthentication 부분을 yes로 변경하고 저장
sudo service sshd restart
sshd 다시 시작하면 아이디, 비밀번호로 ec2에 접근할 수 있다.
(2) 도커 설치
sudo yum update -y
sudo yum install docker -y
sudo usermod -a -G docker ec2-user
sudo service docker start
도커를 설치하고 권한을 준 후 도커를 실행한다.
도커 컴포즈까지 설치해야하면 아래와 같이 설치해준다.
sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
2. Actions 추가
깃 허브 레퍼지토리에 Actions가 있다 클릭해서 추가한다.
그러면 .github/workflows에 yml파일이 하나 생성된다. git hub에서 조건에 맞으면 이 파일을 자동으로 읽는 것이다.
3. yml 파일 작성
on:
push:
branches:
- prod
yml파일을 작동시킬 조건을 적는 곳이다.
위 같은 경우는 prod 브런치에 push 하는 이벤트를 on 하도록 설정해줬다.
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build & Push the Front Docker image
uses: docker/build-push-action@v2
with:
context: ./frontend
file: ./frontend/dockerfile
push: true
tags: ${{ secrets.DOCKER_FRONT_REPO }}
build-args: |
REACT_APP_BASE_URL=${{ secrets.REACT_APP_BASE_URL }}
REACT_APP_FABRIC_URL=${{ secrets.REACT_APP_FABRIC_URL }}
- name: Deploy Front to prod
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.FRONT_HOST }}
username: ${{ secrets.AWS_USERNAME }}
password: ${{ secrets.AWS_PASSWORD }}
port: 22
script: |
sudo docker rm -f $(docker ps -qa)
sudo docker pull ${{ secrets.DOCKER_FRONT_REPO }}
sudo docker run --rm -d -p ${{ secrets.AWS_PORT }}:80 ${{ secrets.DOCKER_FRONT_REPO }}
ubuntu-latest 환경에서 작동하도록 설정하고
name은 적고 싶은걸 적으면 된다.
uses는 정해진 형식이 있다.
나는 appleboy/ssh-action@master 라는 정해진 action을 사용했고 틀을 맞춰주었다.
screts 는 github에서 제공하는 비밀 변수이다. .env라고 생각하면 된다.
해당 github 레퍼지토리 -> settings -> secrets and variables -> Actions 에서 키값과 밸류값을 설정할 수 있다.
HOST_DEV는 이부분을 넣으면 된다.
USERNAME 은 ec2-user, PASSWORD는 아까 설정한 비밀번호를 넣어주면 된다.
도커를 이미 알고있다면 위 코드들을 보면 흐름을 이해할 수 있을 것이다.
도커 컨테이너 전체 제거 -> 이미지 pull -> 이미지 실행
4. 자동배포
prod 브런치에 푸시하면 자동배포가 시작된다.
이렇게 볼수 있고 클릭해서 보면 실시간으로 진행되는 과정도 볼수 있다.
'개발 > Devops' 카테고리의 다른 글
[Devops] ELK 디스크 부족 이슈 S3로 해결하기 - ubuntu 22.04 (0) | 2023.11.23 |
---|---|
[Devops] ELK Stack 8.x 설치 - ubuntu 22.04 (0) | 2023.11.13 |
[Devops] spring boot 블루/그린 무중단 배포 (gitlab ci, docker, nginx) (0) | 2023.06.19 |
[Devops] react 무중단 배포 (gitlab ci, s3, cloudfront) (0) | 2023.06.19 |
[Devops] github actions로 자동 배포 설정하기 (nodejs 배포) (0) | 2023.02.16 |