Docker, Docker AWS연동, CI,CD

김하진·2022년 7월 11일
0

주말내내 Docker 강의를 들었다.

요즘 aws 나 여러 아키텍쳐들을 하나씩 접해보고 있는데 뭔가 맥이 환경설정이 편한거 같기도.. 하고

계속 맥에 눈이간다 ..

Docker 의 구성요소

  • docker image & container
    • image는 어플리케이션을 실행하기 위한 필요한 모든 것이 생성되어 있는 파일입니다.
    • container는 image를 사용하여 실행한 것입니다. 프로세스의 독립성을 보장하기 위해서 네트워크나 저장소가 분리되어 있습니다.
  • docker registry
    • docker image를 저장하는 공간
  • dockerd
    • docker API requests를 받아서 docker object(image, container등)를 관리
  • docker client
    • 사용자가 docker를 사용하기 위해서 사용하는 cli

기존기술과 다른 요소

  • 각각의 application을 원하는 환경에서 실행하는 기술이 예전에는 없었나?

    • 비슷한 것으로 가상 머신(VM) 기술이 있었습니다.

       Virtual Machine과 docker의 차이
       
  • 기존 가상화 기술(VMware, VirtualBox) 은 하이퍼바이저를 사용해서 여러개의 운영체재를 하나의 호스트에서 생성해 사용하는 방식

    • 시스템 자원을 가상화하고, 공간을 생성하는 작업은 하이퍼바이저를 거치기 때문에 성능의 손실이 발생합니다.
    • OS까지 포함해야하므로 이미지의 크기 또한 커집니다.
    • 완벽한 OS를 생성할 수 있다는 장점은 있지만 성능 손실이 있음
  • 도커는 리눅스의 자체 기능인 chroot, namespace, cgroup기술을 사용해서 프로세스 단위의 격리 환경을 만들기 때문세 성능 손실이 거의 없습니다.

    • OS를 따로 가지고 있는 것이 아니기 때문에 이미지의 크기도 매우 작아집니다.
    • host OS의 kernel을 공유해서 사용하므로 성능 손실이 거의 없습니다.

docekr Volume

named volume이란 docker에서 유지되는 데이터를 관리해야 할 때 편리하게 이름으로 사용할 수 있게 만들어둔 volume 입니다

docker volume create memo

docker run -p 27017:27017 -v memo:/data/db mongo

volume -> container 연결하기

docker run -v {host_path}:{container_path} <docker_image>

docker run -v "$(pwd)/templates:/templates" -p 80:5000 wellshsdocker-memo:version2

docker compose

ex)

version: "3.9"
services:
  flask:
    build:
      context: .
    volumes:
      - ./templates:/templates
    ports:
      - "5000:5000"
  mongo:
    image: mongo:latest
    volumes:
      - mongo:/data/db/
    ports:
      - "27017:27017"

volumes:
  mongo:

기존의 방식보다 compose 를 이용하면 간단하고 편하게 도커를 실행 할 수 있다.

docker-compose up -d
docker-compose down

위 명령어를 통해 container 를 띄우고 삭제 할 수 있다.

docker 여러 명령어들

리소스 삭제하기
docker rm container_id
docker rmi image_id
docker network rm network_id
docker volume rm volume id
docker system prune
docker system prune -a 를 사용하면 전체 삭제

docker ps -a 컨테이너 확인

docker images 이미지 확인

docker network ls network 확인

docker volume ls volume 확인

AWS 연동

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

putty 를 통해서 키페어를 따로 작업해줘야 한다.

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

sudo service docker start
서비스 실행

service docker status
docker 상태 확인

sudo usermod -a -G docker ec2-user
sudo 없이 docker 실행

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

Docker compose 설치하기

docker-compose.yaml 을 통해 compose 로 실행 할 수 있다

version: "3.9"
services:
  flask:
    image: wellshs/docker-memo:version2
    ports:
      - "80:5000"
  mongo:
    image: mongo:latest
    volumes:
      - mongo:/data/db/
    ports:
      - "27017:27017"

volumes:
  mongo:

CI/CD

  • CI/CD란?

    • 서비스를 제공하는 과정에서 CI(지속적 통합)와 CD(지속적 배포)라는 자동화 방법이 있습니다.
    1. Continuous Integration은 여러 개발자들이 함께 개발을 하는 과정에서 코드가 잘 작동 하는지를 확인하는 것입니다
      • CI를 하면 애플리케이션에 대한 새로운 코드 변경 사항이 정기적으로 빌드 및 테스트되어 공유 리포지토리에 통합돼요
      • 왜 필요할까요?
        • 여러명의 개발자가 같이 일하기 위해서
        • 지속적인 통합이 되지 않고 만약 특정한 날에 여러사람이 코드를 병합한다고 할 때, 서로의 작업영역이 충돌이 날 가능성이 존재함
        • 문제가 있는 경우를 수정하는게 더욱 복잡해지는 경우가 존재함
      • 어떻게 할까요?
        • 테스트 코드 작성
        • 자동화된 테스트 실행
      • 이걸 근데 왜 도커를 배우는데 하시나요??
        • 도커를 사용하는 이유는 배포를 편리하기 하기 위해서인데요
        • 배포를 하기 전에 이 배포를 해도 괜찮은 상태인지 확인하기 위해서 CI를 사용합니다.
    2. Continuous Deployment는 반영된 소스코드가 실제 서비스에도 자동으로 반영이 되게 하는 것입니다
      • 도커를 사용하면 Continuous Deployment 과정이 더 쉽고 빠르게 진행될 수 있습니다.

    git action 기본 문법들

  • 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이 실행되는 환경

github action을 정의하기 위해서는 github action은 .github/workflows/ 하위에 yaml 파일을 만들어야 합니다

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 }}
  • docker registry에 push를 하려면 docker registry를 인증할 정보가 필요합니다.
  • https://hub.docker.com/settings/security 에 접속해서 Access token을 생성한 뒤 클립보드에 복사합니다.
  • github repository에서 settings를 누른 뒤, 왼쪽 메뉴에서 secrets를 누릅니다.
    • new repository secret을 생성해서 두개의 secret을 생성합니다.
      1. DOCKERHUB_TOKEN : 아까 생성한 token

CD구축하기

Dockerfile

FROM python:3.8-slim AS builder

ADD requirements.txt requirements.txt

RUN pip install -r requirements.txt

FROM python:3.8-slim-buster
COPY --from=builder /usr/local/lib/python3.8/site-packages/ /usr/local/lib/python3.8/site-packages/

ADD templates templates

ADD app.py .

ADD utils.py .

CMD ["python", "app.py"]

ci-cd-pipeline.yaml

name: ci-cd-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 }}
  cd-pipeline:
    needs: build-image
    name: continuos deploy
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@master
      - name: copy file via ssh password
        uses: appleboy/scp-action@master
        with:
          host: ${{ secrets.HOST }}
          username: ec2-user
          key: ${{ secrets.PRIVATE_KEY }}
          port: 22
          source: "docker-compose.yaml"
          target: "/home/ec2-user/"
      - name: executing remote ssh commands using password
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.HOST }}
          username: ec2-user
          key: ${{ secrets.PRIVATE_KEY }}
          port: 22
          script: "docker-compose pull && docker-compose up -d"

docker-compose.yaml

version: "3.9"
services:
  flask:
    image: wellshs/docker-memo:latest
    ports:
      - "80:5000"
  mongo:
    image: mongo:latest
    volumes:
      - mongo:/data/db/
    ports:
      - "27017:27017"

volumes:
  mongo:
profile
진킴

0개의 댓글