일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- dag
- 데이터 웨어하우스
- ELT
- docker
- 웹 스크래핑
- docker-compose
- Serializer
- airflow.cfg
- 웹 크롤링
- Django Rest Framework(DRF)
- yarn
- ETL
- spark
- selenium
- snowflake
- docker hub
- Kafka
- 데이터파이프라인
- dag 작성
- truncate
- 데이터마트
- 데이터레이크
- AWS
- Django
- airflow
- Hive
- 알고리즘
- SQL
- 컨테이너 삭제
- redshift
Archives
- Today
- Total
개발 기록장
02. Docker에서 웹 서비스 실행 본문
반응형
학습 주제: Dockerization, CI/CD, Github Actions
Hangman 서비스
프로그램 소개
- flask를 사용하여 웹으로 노출
- requirements.txt로 flask 관련 모듈 설치 필요
- pip3 install -r requirements.txt
- 실행 방법: python3 -m flask run --host=0.0.0.0 --port=4000
- 이 경우 app.py를 기본으로 사용
Docker Image 구성하기
Docker 컨테이너 내부 프로세스와 호스트 프로세스간의 통신: 포트매핑
Docker 컨테이너로 포트 4000에 실행된 Flask app이 있다
- jiwon hangman % docker run jiwon4420/hangman 이렇게 실행하면 localhost:4000들어가도 오류 발생
- Docker 컨테이너 내부 프로세스가 오픈한 포트번호는 바깥 프로세스에는 안 보이기 때문
- 예를 들어 앞서 4000번 포트는 호스트 프로세스 브라우저에게는 안 보임
이 app을 호스트 운영체제에서 접근하기 위해서는 Docker 컨테이너 내부 프로세스가 오픈한 포트번호를 외부로 노출해줘야 함. 이것이 포트맵핑
- docker run 수행시 -p 옵션 사용: docker run -p 4000:4000 이미지이름
- jiwon hangman % docker run -p 4000:4000 jiwon4420/hangman 이렇게 실행해야 함
Dockerfile 추가하기: Dockerization
- Dockerfile 작성
- app.py 있는 폴더내에 작성
FROM python:3.8-slim-buster
LABEL Maintainer="chu44200@gmail.com" # 메타데이터 docker inspect 명령으로 찾아볼 수 있음
WORKDIR /app
COPY app.py ./
COPY requirements.txt ./
RUN pip3 install -r requirements.txt
EXPOSE 4000 # 이 포트 번호를 사용하니 포트 매핑 시 참고해라
CMD ["python3", "-m", "flask", "run", "--host=0.0.0.0", "--port=4000"]
명령어 순서
- docker build --platform=linux/amd64 -t keeyong/hangman .
- docker image ls
- docker inspect jiwon4420/hangman
- docker run -p 4000:4000 jiwon4420/hangman
- docker run -p 4000:4000 -d jiwon4420/hangman
- -d: 백그라운드 실행 옵션
- docker push jiwon4420/hangman
- docker Hub repo에 push: 이때 웹페이지에서 따로 Create Repository안 해줘도 됨
CI/CD와 Github Actions
소프트웨어 빌드
- 자신(혹은 팀)이 개발한 소프트웨어를 최종적으로 출시하기 위한 형태로 만드는 것
- 테스트가 빌드의 중요한 일부로 포함
- 참여 개발자들이 많을수록 이 중요성은 더 커짐
- 개발이 끝나기 전부터 빌드를 하면 소프트웨어의 안정성 증대
- Continuous Integration
Continuous Integration이란?
- Software Engineering Practice 중 하나
- 기본 원칙
- 코드 Repo는 하나만 유지(Master)
- 코드 변경을 최대한 자주 반영
- 테스트를 최대한 추가
- Test Coverage
- 빌드를 계속적으로 수행(자동화)
- Commit Build vs. Nightly Build
- 성공한 빌드의 프로덕션 릴리즈(자동화)
- CD: Continuous Delivery
빌드 실패
- 새 코드의 커밋으로 인해 테스트가 실패하는 경우
- 많은 회사들이 빌드 실패시 빌드가 다시 성공할 때까지 코드 변경을 금지함
- 즉, 빌드 실패는 모든 사람들을 잡아두는 족쇄
- 그래서 어느 정도 조직이 커지면 빌드 전담 엔지니어가 생김
- 이 사람의 업무 중 하나는 빌드 실패시 누가 주범인지 알아내는 것
- 빌드 실패시 가벼운 형태로 패널티 부여
CI/CD
소프트웨어 개발 및 배포를 더 효율적이고 안정적으로 만들기 위한 일련의 프로세스와 방법론
- CI(Continuous Integration)
- 개발자들이 변경한 코드(코드 커밋)를 정기적으로, 보통 하루에 여러 번 중앙 리포지토리에 병합하는 프로세스
- CD(Continuous Delivery)
- CI의 결과물인 애플리케이션을 사용자가 쉽게 배포할 수 있도록 준비하는 프로세스
- 코드가 빌드되고 테스트된 후, 자동화된 방식으로 스테이징 환경까지 배포되며, 필요에 따라 프로덕션 환경으로의 배포는 수동으로 수행
- CD(Continuous Deployment)
- Continuous Delivery의 확장된 개념으로, 코드 변경 사항이 자동으로 프로덕션 환경까지 배포되는 프로세스
- 즉, 모든 코드 변경이 자동으로 프로덕션 환경에 릴리즈됩니다.
GitHub와 CI/CD
Push나 Merge 시점이 CI/CD를 실행하기 위한 순간
- 코드가 Main/Master 브랜치에 추가되는 순간 CI/CD 트리거
- 이를 특정 Main/Master나 특정 브랜치만 대상으로 하도록 설정 가능
- 이때 테스트 수행하고 최종적으로 Docker Image등을 만들도록 하는 것이 가능
- 그래서 CI/CD는 Github에서 구현하는 것이 가장 자연스러움
- Github에서는 이를 Actions라는 기능을 통해 Workflow라는 이름으로 구현 가능
Github Actions
- CI/CD를 Github에서 구현하기 위한 서비스
- 코드 테스트, 빌드, 배포 자동화 기능 제공
- Workflow라 부르며 아래 컴포넌트로 구성
- Event
- Jobs
- Actions
- Runner
- Github hosted runners
- Self hosted runners
Github Actions - Workflow
Workflow는 트리거 이벤트가 발생하면 시작되는 일련의 동작들을 지칭
- 트리거 이벤트의 예
- 코드 커밋(main과 같은 특정 브랜치를 대상으로만 제한 가능)
- PR 생성
- 다른 Workflow의 성공적인 실행
- Workflow를 위한 명령어들은 YAML 파일로 저장
- 명령어들로는 환경설정과 script 실행들이 대표적
- Workflow는 Job들로 나눠지며 각 Job은 일련의 스텝을 수행
- 각 스텝은 하나 혹은 그 이상의 명령어를 실행
- 이 명령어는 actions라고 부르는 명령어들의 집합이 될 수도 있음
- 각 스텝은 윈도우나 리눅스 서버 위에서 runner에 의해 실행
- 이걸 Docker Image에서 수행하는 것이 서비스 배포 과정에 따라 더 일반적이기도 함
- 각 스텝은 하나 혹은 그 이상의 명령어를 실행
Github에서 Github Actions 선택
- 적용하려는 repo에서 Actions 메뉴 서택
- 다음으로 Workflow 하나 생성
- yml 파일을 직접 생성 혹은 템플릿(CI Templates)선택 후 수정
- Python Application 혹은 Docker Image
Dockerization 추가: Github Action을 통해 Docker Image 빌드/푸시 구현
- 먼저 learndataeng/hangman_web repo를 본인의 Github 어카운트로 fork
- 여기에 앞서 만든 Dockerfile 존재해야 함
- Github Actions를 통해 main 브랜치에 push나 PR이 있는 경우 Docker Image를 만들고 Docker Hub으로 푸시
- 하나의 repo에 대해 다수의 workflow들이 존재 가능
- 모두 .github/workflows/ 밑에 yml 파일 형태로 존재
순서
- Acitions 탭에서 사용할 Template: Docker Image
- docker login 정보 Repo/settings/secrets/actions에서 저장
- DOCKER_USER
- DOCKER_PASSWORD
- 위의 내용들을 .github/workflows/docker-image.yml에 기술
name: Docker Image CI
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: docker login
env:
DOCKER_USER: ${{secrets.DOCKER_USER}}
DOCKER_PASSWORD: ${{secrets.DOCKER_PASSWORD}}
run: |
docker login -u $DOCKER_USER -p $DOCKER_PASSWORD
- name: Build the Docker image
run: docker build --tag ${{secrets.DOCKER_USER}}/hangman:latest .
- name: docker push
run: docker push ${{secrets.DOCKER_USER}}/hangman:latest
기타
flake8: 파이썬 코드 스타일 체크
파이썬 코드에서 에러나 코딩 스타일 등에서 이슈를 체크해주는 툴
* 이런 툴을 Linting tool이라고 함(언어별로 존재)
* flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
반응형
'데브코스(DE) > Docker & K8S' 카테고리의 다른 글
05. Kubernetes(K8s) (0) | 2024.05.31 |
---|---|
04. Docker Compose (0) | 2024.05.30 |
03. Docker Volume과 다수 컨테이너 SW 다루기 (0) | 2024.05.29 |
01. Docker (0) | 2024.05.28 |