Docker(2) - Docker 관련 기술 세부 소개, 사용하는 Flow

kukjunLEE·2023년 5월 23일
3

Backend 개발자 팁

목록 보기
5/5
post-thumbnail

본 글은, 프로젝트 배포에 있어서 Docker를 어떻게 사용할 수 있는지를 다루고 있습니다.
프로젝트를 제작하고 배포하는 방법은 여러가지가 있지만, 개발, 스테이징, 운영 환경은 모두 다릅니다. 이런 환경에 대한 설정과 배포를 Docker 관련 기술을 통해서 쉽게 운영, 배포할 수 있습니다.

Docker가 무엇인지 모르시는 분, Docker를 이용해서 어떻게 프로젝트 배포를 할 수 있는지 궁금하신 분들이 보시면 좋을 것 같습니다.

본 내용은 1~3단계로 구성되어 있습니다.
1. Docker 개요와 동작하는 Flow
2. Docker 관련 기술 세부 소개와 사용하는 Flow
3. Docker를 이용한 배포 예제
그 중 Docker 관련 기술 세부 소개와 사용하는 Flow와 관련된 내용을 다루고 있습니다.



Docker를 이용한 배포


이전에 설명했던 Docker는 기장 기초적인 동작을 설명하기 위함이었습니다.

하지만 Docker를 이용해서 자동 배포를 구현하기 위해서는

  1. 만든 애플리케이션을 Docker Image로 저장할 수 있는 공간이 필요하고
  2. 이러한 이미지를 다운받아 컨테이너로 만들고, 컨테이너와 호스트를 연결하는 절차
    가 있어야 합니다.
  3. 그리고 이러한 과정을 특정 trigger시에 진행되는 pipeline이 있어야 합니다.

이러한 역할을 하는 기술들을 추가로 소개하겠습니다.



주요 용어

Docker Registry

Docker Registry는 도커 이미지를 저장하고 배포하는데 사용되는 온프레미스 이미지 저장소입니다. 도커 이미지를 빌드하고 푸시하여 다른 사람이 해당 이미지를 다운로드할 수 있도록 합니다.

이전에 설명했던 Docker Hub가 이에 해당하고, Docker에서 공식 지원합니다.

그러나 실제 개발에서는 보안 및 정책 등의 이유로 이미지를 공개하지 않아야 하는 경우, 개인적인 Docker Registry를 구축하여 사용하기도 합니다.

개인적인 Docker Registry를 구축할 때는, Docker Registry 서버를 구축하고 해당 서버에 Docker 이미지를 업로드하여 배포할 수 있습니다. 이를 통해, 개발팀이나 조직 내에서 도커 이미지를 공유하고 재사용할 수 있습니다.

Docker Registry 종류는 다음과 같습니다.

  1. Docker Hub: Docker가 제공하는 공식 레지스트리
  2. Amazon Elastic Container Registry (ECR): AWS에서 제공하는 Docker Registry 서비스
  3. Google Container Registry (GCR): Google Cloud Platform에서 제공하는 Docker Registry 서비스
  4. Harbor: 개인 또는 조직에서 구축할 수 있는 오픈소스 Docker Registry
  5. Azure Container Registry (ACR): Microsoft Azure에서 제공하는 Docker Registry 서비스


Docker Compose

Docker Compose는 여러개의 도커 컨테이너를 정의하고 실행하는 도구로, YAML 파일에 컨테이너, 네트워크, 볼륨 등의 설정을 정의하여 여러 컨테이너를 쉽게 실행, 관리할 수 있습니다.

version: '3'
services:
  web:
    build: ./web
    ports:
      - "3000:3000"
  api:
    build: ./api
    ports:
      - "8080:8080"
    depends_on:
      - db
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: mydb
    ports:
      - "3306:3306"

위의 Docker Compose 파일은 다음과 같은 서비스를 포함합니다.

  1. web: 프론트엔드 서비스, 포트 3000 할당
  2. api: 백엔드 서비스, 포트 8080할당, db service가 꼭 필요함
  3. db: MySQL 데이터베이스 서비스, 포트 3306 할당

이 예시를 실행하면 각 서비스가 독립적인 컨테이너로 실행되며, 각 컨테이너는 서로에게 액세스할 수 있습니다.

예를 들어 web 컨테이너는 api 컨테이너에게 API 요청을 보낼 수 있으며, api 컨테이너는 db 컨테이너에게 데이터베이스 연결을 처리할 수 있습니다. 이러한 구성을 통해 전체 서비스를 동시에 실행하고 테스트할 수 있습니다.



Container Ochestration

Container Orchestration은 여러 대의 서버에서 동작하는 컨테이너들을 관리하는 작업을 자동화하는 기술입니다.

컨테이너 기술은 애플리케이션을 가상화하여 여러 대의 서버에서 쉽게 이동하고 배포할 수 있도록 해줍니다. 그러나 수동으로 컨테이너들을 관리하는 것은 복잡하고 시간이 많이 소요됩니다. 이러한 문제를 해결하기 위해 컨테이너 오케스트레이션 도구가 등장하게 되었습니다.

컨테이너 오케스트레이션 도구는 여러 대의 서버에서 컨테이너를 배포하고 관리하는 작업을 자동화합니다. 이를 통해 컨테이너들이 안정적으로 동작하며, 로드 밸런싱, 확장성, 안정성 등의 요구사항을 충족시킬 수 있습니다. 컨테이너 오케스트레이션 도구에는 Kubernetes, Docker Swarm, Apache Mesos 등이 있으며, 이 중에서 Kubernetes가 가장 인기 있는 컨테이너 오케스트레이션 도구입니다.

앞서 말한 Docker Compose도 컨테이너 관리를 할 수 있지만, 규모 측면에서 다릅니다. Docker Compose는 단일 호스트의 여러 Container를 관리할 수 있는 기술이지만 Container Ochestration의 경우 여러 호스트의 수 많은 Container를 관리할 수 있는 기술입니다.

Container Ochestration의 종류는 다음과 같습니다.

  1. Kubernetes (k8s): 구글에서 개발한 오픈소스 컨테이너 오케스트레이션 툴로, 대규모 컨테이너 환경에서 사용하기에 적합합니다.
  2. Docker Swarm: 도커에서 제공하는 컨테이너 오케스트레이션 툴로, 다수의 호스트에서 실행되는 컨테이너들을 관리할 수 있습니다.
  3. Apache Mesos: 대규모 분산 시스템에서 컨테이너 오케스트레이션을 수행하는 오픈소스 툴입니다.
  4. Amazon ECS: Amazon Web Services (AWS)에서 제공하는 관리형 컨테이너 오케스트레이션 서비스로, 간단한 설정으로 컨테이너를 배포하고 관리할 수 있고, AWS Infra를 이용할 수 있다는 강점이 있습니다.
  5. Amazon EKS: Amazon Web Services (AWS)에서 제공하는 관리형 Kubernetes 서비스로, 간단한 설정으로 Kubernetes 클러스터를 배포하고 관리할 수 있습니다.
  6. Google Kubernetes Engine (GKE): 구글 클라우드 플랫폼에서 제공하는 Kubernetes 서비스입니다.
  7. Rancher: Kubernetes, Docker Swarm 등 다양한 컨테이너 오케스트레이션 툴을 지원하는 오픈소스 툴입니다.



CICD Tool

CICD Tool은 Continuous Integration, Continuous Delivery, Continuous Deployment를 지원하기 위한 자동화 도구입니다. 개발자들이 코드 변경 사항을 자동으로 통합, 빌드, 테스트하고, 자동화된 배포 프로세스를 통해 신속하게 제품을 출시할 수 있도록 돕습니다.

CICD Tool 종류는 다음과 같습니다.

  1. GitHub Actions: GitHub에서 제공하는 CI/CD 도구입니다. 깃허브와의 연동이 강점으로, 트리거 설정이 유연합니다.
  2. Bitbucket Pipelines: Atlassian에서 개발한 CI/CD 도구입니다. Bitbucket과의 연동이 강점으로, 자동화된 테스트와 배포를 지원합니다.
  3. Jenkins: 대규모 프로젝트에서 널리 사용되는 오픈소스 CI/CD 도구입니다. 다양한 플러그인을 통해 많은 유연성을 제공합니다.
  4. Travis CI: 깃허브와 함께 사용하기 쉬운 클라우드 기반 CI/CD 도구입니다. 쉬운 구성 및 빠른 결과 제공으로 인기가 있습니다.
  5. CircleCI: 개발자 친화적인 클라우드 기반 CI/CD 도구입니다. 매우 빠른 빌드 시간과 쉬운 구성으로 알려져 있습니다.
  6. GitLab CI/CD: GitLab의 기본 기능으로 포함된 CI/CD 도구입니다. GitLab의 모든 기능을 통합하여 사용할 수 있습니다.
  7. Bamboo: Atlassian에서 개발한 CI/CD 도구입니다. Atlassian 제품군과 연동하여 사용할 수 있습니다.
  8. TeamCity: JetBrains에서 개발한 CI/CD 도구입니다. 많은 플러그인과 유연한 구성을 제공합니다.
  9. AWS CodePipeline: AWS에서 제공하는 CI/CD 도구입니다. AWS 서비스와 쉽게 통합하여 사용할 수 있습니다.
  10. Azure DevOps: Microsoft에서 제공하는 CI/CD 도구입니다. Git 리포지토리와 연동하여 사용할 수 있으며, Azure 서비스와 쉽게 통합하여 사용할 수 있습니다.
  11. Google Cloud Build: Google Cloud Platform에서 제공하는 CI/CD 도구입니다. 빌드 구성과 구동이 간편하며, 다른 Google Cloud 서비스와 쉽게 통합하여 사용할 수 있습니다.

다양한 종류의 CICD Tool이 있으므로, 프로젝트의 요구사항과 여러 조건을 고려해서 선택할 수 있습니다.





사용하는 Flow


이러한 기술들을 이용해서 어떻게 배포가 이루어지는지, 간단하게 그림으로 설명해보도록 하겠습니다.



Docker Registry, Docker Compose를 이용한 명시적 배포


Docker Registry, Docker Compose를 이용한 명시적 배포가 의미하는 것은 App을 만들고 이를 운영 서버에 배포하는 과정에 개발자가 직접 관여하는 것을 말합니다.

해당 Flow는 다음과 같습니다.



하지만 운영서버에 직접 접근할 수 있는 경우는 많지 않겠죠?

그래서 로컬서버에서 운영서버에 원격으로 접속해 명령을 내립니다.

이런 접근 방식은 프로덕션 환경에 직접 접근한다는 점과, 자동화할 수 있는 부분을 수동으로 하고 있다는 점때문에 실제로는 잘 사용하지 않습니다.




Docker Compose와 CICD Tool을 이용한 자동 배포


Docker Compose와 CICD Tool을 이용한 자동 배포가 의미하는 것은, 개발자가 배포 과정에 대해서 관여하지 않는 것을 의미합니다.



해당 Flow는 다음과 같습니다.

이제는 개발자는 Git으로 업로드만 하면 나머지 부분은 CICD Tool을 이용에서 자동화할 수 있습니다. 😃




추가 예정

  1. Docker Compose를 이용했지만 지금은 단일 서비스를 예시로 들고 있습니다. 여러 서비스들을 모아서 사용하는 Flow도 추후에 추가하도록 하겠습니다.
  2. Container Ochestration에 대한 Flow도 사용하는 Flow를 보여드리고 싶었는데, 작성하다보니, 이론이 너무 부족한 것 같아, 다음에 더 준비해서 추가하도록 하겠습니다. 🙇🏻‍♂️


다음 3편에서는 실제로 Docker를 이용해서 서비스를 배포하는 실습을 만들어보도록 하겠습니다.

profile
Backend Developer

4개의 댓글

comment-user-thumbnail
2023년 5월 29일

멋잇다 이국준!!!!

답글 달기
comment-user-thumbnail
2023년 6월 2일

다음 포스트를 기다리고 있어용 🤩

답글 달기
comment-user-thumbnail
2023년 6월 25일

실습으로 알려주세요 아직은 어렵네요 😭

답글 달기
comment-user-thumbnail
2023년 7월 2일

CI/CD 도전중인데, 많이 도움 받고 갑니다.

답글 달기