도커+AWS+github action , CI/CD라인 (3)

김지용·2022년 5월 7일
0

aws로 도커를 활용해서 배포해보기

https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/putty.html
putty로 해서 터미널로 ec2 환경접속(방법은 위의 링크 활용)

putty 다운로드 링크 => https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

  • Amazon linux docker 설치 가이드 링크

참조
https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/docker-basics.html

  1. Docker 설치하기

    sudo yum update -y
    sudo amazon-linux-extras install docker -y

  2. Docker 서비스 실행하기

    sudo service docker start

  3. Docker 상태 확인하기

    service docker status

  4. sudo 없이 docker를 사용하기

    sudo usermod -a -G docker ec2-user

💡 해당 권한이 반영된 shell을 사용하려면 나갔다가 다시 들어와야 함!

Docker-compose 를 사용하여 배포하기
- docker-compose를 사용하여 배포하기 위해서는 아래 세가지가 필요!
1. docker-compose 실행파일 설치

	sudo curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

	sudo chmod +x /usr/local/bin/docker-compose
    2. docker-compose.yaml 만들기
	- 'vi docker-compose.yaml' 명령어 치기

-아래 파일 내용 추가
version: "3.9"
services:
flask:
image: ecec1023/docker-memo:version2
ports:
- "80:5000"
mongo:
image: mongo:latest
volumes:
- mongo:/data/db/
ports:
- "27017:27017"

volumes:
mongo:

-지금까지 입력한 문자들은 저장된 것이 아니므로 저장하고 vi를 종료해야한다. 현재 명령 모드이므로 ':wq'를 입력한다. (키보드의 콜론(:)을 누르고 w를 누르고 q를 눌렀다) 'w'는 저장하라는 명령이고 'q'는 종료하라는 명령이다. 이 상태에서 엔터키를 누른다.

중간에

docker build . -t ecec1023/my-favorite-star:latest 해서 빌드해주고
docker push ecec1023/my-favorite-star:latest 해서 푸쉬하기 해줘야함

    3. docker-compose.yaml 실행하기 / docker-compose up -d 명령어
  1. docker ps 로 app.py id 체크해서 아래에 넣고 / init_db 같이 서버에서 한번 실행해야할 때 추가하려고함.
  • docker exec -ti f884fcb925b9 /bin/bash 쳐서 bash 스크립트로 진입
  • vi 설치
    apt-get update
    apt-get install vim
  • vi init_db.py 라고 치고 내용물 채워넣기 /
  • :wq 명령어로 저장하고 vim에서 나오기
  • python init_db.py
  1. .github/workflows/ci-cd-pipeline.yaml 추가해서 push하면
    push할 때 돌아감.

docker exec -it bash
apt-get update
apt-get install vim

중간정리 타임!

도커가 있을 때는
1. 도커설치
2. Docker-compose 설치
3. docker-compose.yaml을 서버에 올리고
4. docker-compose up -d 라는 명령어를 통해 도커 레지스트리로부터
도커 이미지를 다운받고, 그 이미지로부터 컨테이너를 docker-compose.yaml에 있는 형태로 실행이 되어서
서비스를 배포

만약 도커없이 제공하려면?!
1. 파이썬 설치부터 하고
2. pip install requirements.txt 도 해야하는데
로컬에 있는 txt파일을 서버로 올려줘야하는데
보통 SCP라는 명령어를 쓰거나, 윈도우에서는 FileZilla 같은 sftp라고해서
서버끼리 파일을 전송할 수 있는 프로토콜을 편하게 만들어주는클라이언트를 사용해서 파일 업로드
이후에 pip install -r requirements.txt 을 해야함.
3. Mongo를 설치(DB 설치)
yum이라는 패키지 매니저 시스템 파일생성
MongoDB패키지 다운받고, 실행
4.templates 이하 파일들이나, app.py 등도 2번처럼 올려준 다음에 실행이 가능

서비스를 하기 위해 세팅하는 환경이 복잡하고 여러 서버의 환경에 맞춰 다 세팅해줘야하는 게 매우 골머리 아픈 부분이라는 점이 다르다.

  1. 버전 업그레이드 시 바뀐 버전의 파이썬을 깔고 진행하는 등 번거롭고

  2. 라이브러리 업데이트 시 requirements.txt를 다시 올려서 pip install -r requirements.txt 진행

  3. mongodb에서 mysql로 바꾼다든가 등등

그리고 결과적으로 새로운 OS로 이전을 한다면 위에서 사용했던 명령어들이 바뀌면서 다시 생성해야하는 경우도 있을 수 있는데 도커를 사용한다면 도커를 설치하는 부분까지만 찾아서 설치하고
도커명령어만 사용하면 편하게 서비스 제공이 가능!

CI/CD 개념정리! 필요성!
1.코드작성
2.작성한 코드가 잘 작동하는지 확인
3.확인이 되면 작성한 코드를 배포

  1. 버전업그레이드, 라이브러리 업데이트 등 최신화

도커를 통해 코드를 서비스 올리기
환경구축
-이미지 빌드해서 도커 레지스트리에 올려놓고
-도커레지스트리에 있는 이미지를 도커로 실행

테스트 코드작성 / 자동화된 테스트실행

도커 = 배포를 편하게 하기위해 사용
CI = 배포를 해도 괜찮은 상태인지 확인하기 위해 사용
CD = 반영된 소스코드가 실제 서비스에 반영되게 하는 것!

깃헙 레포만들면 나오는 파일올리기 명령어
git init
git status
git add .dockerignore Dockerfile 등등 파일이름들

git status로 추가된 거 체크
git commit -m "커밋 코멘트"
git branch -M main
git remote add origin git@<http 빼고 깃코드주소복사>
git push -u origin main

테스트코드 참고자료
https://www.educative.io/edpresso/5-reasons-why-testing-code-is-great

github action 의외의 자동화툴
Travis, Circle CI, Jenkins 등등

  • github action를 정의하는 기본 6가지 용어
    1. Workflows: 자동화 하려고 하는 과정들
      • 한개 또는 여러개의 job으로 구성되며, event에 의해서 시작
      • 빌드, 테스트, 릴리즈, 배포 등의 작업이라고 생각하면 됨
    2. Events : workflow를 trigger되는 행동들
      • push, pull request, cronjob(주기적 실행) 등이 있음.
    3. Jobs: 동일한 runner에서 실행하려고하는 여러개의 step의 모임
    4. Steps: job을 구성하는 한개의 커맨드로 action이거나 shell command로 구성
    5. Actions: 다른 곳에서 정의된 커맨드의 모음
    6. Runner: Job이 실행되는 환경

CI파이프라인
1. 테스트 코드 실행
2. docker image 빌드해서 docker hub에 푸쉬

github action은 .github/workflows/ 하위에 yaml 파일을 만들어야 함
-도커토큰을 이용해서 ci라인에 dockerhub에 푸쉬까지 연결
-남들이 만들어놓은 도커사용 액션 사용

name: ci-pipeline
on:
push:
branches:
- main
jobs:
run-test-code:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
python-version: "3.8"
- run: pip install -r requirements.dev.txt
- run: pytest
build-image:
needs: [run-test-code]
runs-on: ubuntu-latest
steps:
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
-
name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
-
name: Build and push
id: docker_build
uses: docker/build-push-action@v2
with:
push: true
tags: ${{ secrets.DOCKERHUB_USERNAME }}/docker-memo:latest
-
name: Image digest
run: echo ${{ steps.docker_build.outputs.digest }}

  • Continuous deployment의 과정 생각하기
    • 서버에 접속 + docker compose up 하면 끝!
    • 만약 없었더라면, 다양한 케이스에 따라서 CD 파이프라인을 구축해야 함

github action으로 cd 파이프라인 생성
1. docker-compose.yaml을 서버에 업로드
2. docker-compose up 명령어를 서버에서 실행해야함.

깃헙 액션에 필요한 두 가지
1. 서버 접속에 필요한 ssh key 등록
2. 서버에 접속할 수 있는 주소인 ip 등록

  • 현재 CD 파이프라인의 문제점
    • docker image의 tag를 latest로 사용하는 부분
      - 특정 latest 태그에 문제가 생길 때 중복된 태그 중 어떤 태그가 해당태그인지 찾기가 번거로움.
    • 현재는 배포할 때, 기존 docker container가 내려가고 새로운 docker container가 생성될 때 이슈가 있음
    • 서비스의 요구사항에 따라 다양한 종류의 서비스 제공방법이 있고, 그에 맞는 CD 파이프라인이 존재

ssh -i ~/.ssh/sparta-docker.pem ec2-user@{public_ip}

sparta_like_star_docker

docker build . -t ecec1023/my-favorite-star:latest

profile
김죵입니당 ^^

0개의 댓글