반응형

1. 개요

클라우드 환경에서 비용 효율적인 Docker 기반의 분석 파이프라인을 구성하려면, 자동 확장 및 필요한 리소스를 유동적으로 사용하는 방식이 필수적입니다. AWS와 GCP와 같은 클라우드 서비스는 EKS (Elastic Kubernetes Service)Spot Instances, 또는 Preemptible VMs와 같은 저비용 인스턴스를 통해 이러한 요구를 충족시킬 수 있습니다. 이 글에서는 AWSEKS를 사용하여 Docker 기반의 분석 파이프라인을 구성하고, 비용을 최소화하는 방법을 설명합니다. 또한, 여러 Docker 이미지를 사용하는 경우와 하나의 Docker 이미지로 결합하는 경우의 장단점에 대해 논의하고, Argo Workflows를 사용한 워크플로우 자동화 방법도 다룹니다.


2. AWS에서 Docker 기반 파이프라인 구성 및 비용 절감 방안

AWS는 EKS (Elastic Kubernetes Service)를 통해 Docker 기반의 파이프라인을 유연하게 관리할 수 있으며, 필요한 컴퓨팅 자원을 효율적으로 사용할 수 있도록 도와줍니다. 또한, Spot Instances를 활용하여 비용을 절감할 수 있습니다.

2.1. AWS EKS와 Spot Instances 사용

EKS는 AWS에서 관리형 Kubernetes 서비스를 제공하여 Docker 컨테이너의 배포 및 관리를 쉽게 할 수 있습니다. EKS를 사용하면 Spot Instances와 같은 저비용 인스턴스를 활용해 비용을 절감할 수 있습니다. Spot Instances는 AWS에서 남는 자원을 저렴한 가격에 제공하는 방식으로, 최대 90%까지 비용을 절감할 수 있습니다. 이때, Auto Scaling을 통해 클러스터의 리소스를 유연하게 확장 및 축소할 수 있습니다.

2.2. AWS Fargate 사용

작업이 짧고 일시적인 경우, AWS Fargate를 사용하여 서버리스 환경에서 Docker 컨테이너를 실행하는 것이 비용 절감에 유리할 수 있습니다. Fargate는 EC2 인스턴스를 직접 관리할 필요 없이, 작업량에 따라 자동으로 리소스를 할당하고 종료하므로 필요한 만큼만 비용을 지불하게 됩니다.


3. 여러 Docker 이미지를 사용하는 방식 vs 하나의 Docker 이미지로 결합

Docker 기반의 분석 파이프라인을 구성할 때, 파이프라인의 각 단계를 별도의 Docker 이미지로 나누어 관리할지, 아니면 하나의 Docker 이미지로 통합할지 선택할 수 있습니다. 이 두 가지 방식은 각각의 장단점이 있습니다.

3.1. 여러 Docker 이미지를 사용하는 경우

장점:

  • 모듈화: 각 단계가 독립적으로 관리되므로, 특정 단계에 대한 변경 사항이 생겼을 때 개별 이미지만 수정하면 됩니다. 파이프라인이 유연하게 확장됩니다.
  • 의존성 충돌 방지: 각 Docker 이미지마다 다른 라이브러리와 환경 설정을 사용하여 의존성 충돌을 방지할 수 있습니다.
  • 스케일링 최적화: 각 단계마다 리소스 사용량이 다르다면, 단계별로 리소스를 조정하여 효율적으로 운영할 수 있습니다.
  • 병렬 처리 가능: 파이프라인의 여러 작업을 동시에 처리할 수 있습니다.

단점:

  • 복잡성 증가: 여러 Docker 이미지를 관리해야 하므로 빌드, 배포, 버전 관리가 복잡해질 수 있습니다.
  • 데이터 전달 필요: 각 단계 간의 데이터를 외부 스토리지(S3, EFS 등)를 통해 주고받아야 할 경우 데이터 전달 설정이 필요합니다.
  • 네트워크 비용 증가 가능성: 컨테이너 간 통신이나 데이터 전달이 빈번할 경우 네트워크 비용이 증가할 수 있습니다.

3.2. 하나의 Docker 이미지로 결합하는 경우

장점:

  • 단순화: 모든 파이프라인 단계를 하나의 Docker 이미지로 통합하면, 빌드와 배포가 단순해집니다.
  • 빠른 데이터 처리: 데이터가 같은 컨테이너 내에서 처리되므로, 외부 데이터 전달이 필요 없고, 처리 속도가 빨라질 수 있습니다.
  • 데이터 관리 용이: 데이터가 한 컨테이너 내부에서 처리되므로, 외부 저장소나 데이터 전달 방식을 고려할 필요가 적습니다.

단점:

  • 의존성 관리 어려움: 여러 단계가 하나의 Docker 이미지 내에 포함되므로, 서로 다른 라이브러리나 환경을 관리하는 데 어려움이 있을 수 있습니다.
  • 확장성 제한: 단계별로 리소스를 최적화하기 어렵습니다. 파이프라인의 일부 단계에서 리소스를 많이 요구하더라도, 개별적으로 조정할 수 없습니다.
  • 유지보수 어려움: 파이프라인의 일부가 변경되면 전체 이미지를 다시 빌드하고 배포해야 하므로 비효율적일 수 있습니다.

4. Argo Workflows를 통한 자동화된 파이프라인 관리

Argo Workflows는 Kubernetes 기반의 워크플로우 관리 도구로, 복잡한 파이프라인을 체계적으로 관리하고 자동화할 수 있도록 돕습니다. 특히 Argo Workflows는 여러 단계로 나뉜 작업의 의존성을 관리하고, 순차적 또는 병렬적으로 실행할 수 있는 기능을 제공합니다.

4.1. Argo Workflows에서 여러 Docker 이미지 사용

Argo Workflows에서는 여러 Docker 이미지를 활용하여 각 단계별로 컨테이너를 실행할 수 있습니다. 이를 통해 여러 작업을 병렬 또는 순차적으로 처리할 수 있습니다.

Argo Workflows 예시: Job 간 의존성 설정

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: pipeline-
spec:
  entrypoint: main
  templates:
  - name: main
    steps:
    - - name: preprocessing
        template: preprocessing-job
    - - name: analysis
        template: analysis-job
    - - name: postprocessing
        template: postprocessing-job

  - name: preprocessing-job
    container:
      image: <aws_account_id>.dkr.ecr.<region>.amazonaws.com/my-preprocessing:latest
      command: ["python", "preprocessing.py"]

  - name: analysis-job
    container:
      image: <aws_account_id>.dkr.ecr.<region>.amazonaws.com/my-analysis:latest
      command: ["python", "analysis.py"]

  - name: postprocessing-job
    container:
      image: <aws_account_id>.dkr.ecr.<region>.amazonaws.com/my-postprocessing:latest
      command: ["python", "postprocessing.py"]

이 예시는 Argo Workflows에서 여러 Docker 이미지를 사용하여 Preprocessing, Analysis, Postprocessing을 순차적으로 실행하는 방식입니다. 각 작업이 완료되면 다음 작업이 실행됩니다.


5. Argo Workflows에서 스토리지 마운트 사용

Argo Workflows는 Kubernetes 기반으로 동작하기 때문에, Persistent Volume (PV)Persistent Volume Claim (PVC) 또는 외부 스토리지를 사용하여 데이터를 공유할 수 있습니다.

5.1. PVC 마운트 사용 예시

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: pvc-workflow-
spec:
  entrypoint: main
  volumeClaimTemplates:
  - metadata:
      name: workflow-pvc
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 5Gi
  templates:
  - name: main
    steps:
    - - name: preprocess
        template: preprocess
    - - name: analyze
        template: analyze

  - name: preprocess
    script:
      image: python:3.8
      command: [python]
      source: |
        with open('/mnt/data/preprocessed.txt', 'w') as f:
            f.write('Preprocessed data')
      volumeMounts:
      - name: workflow-pvc
        mountPath: /mnt/data

  - name: analyze
    script:
      image: python:3.8
      command: [python]
      source: |
        with open('/mnt/data/preprocessed.txt', 'r') as f:
            print(f.read())
      volumeMounts:
      - name: workflow-pvc
        mountPath: /mnt/data

이 예시는 Persistent Volume Claim (PVC)를 사용하여 여러 단계 간 데이터를 공유하는 방식입니다.

5.2. 외부 스토리지 (S3) 사용 예시

Argo Workflows에서 S3와 같은 외부 스토리지를 활용하여 데이터를 주고받을 수 있습니다. 이를 위해 AWS CLI나 Boto3와 같은 SDK를 사용합니다.

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: s3-workflow-
spec:
  entrypoint: main
  templates:
  - name: main
    steps:
    - - name: preprocess
        template: preprocess
    - - name: analyze
        template: analyze

  - name: preprocess
    script:
      image: amazon/aws-cli
      command: [sh, -c]
      source: |
        echo "Preprocessing data" > /tmp/data.txt
        aws s3 cp /tmp/data.txt s3://my-bucket/preprocessed_data.txt

  - name: analyze
    script:
      image: amazon/aws-cli
      command: [sh, -c]
      source: |
        aws s3 cp s3://my-bucket/preprocessed_data.txt /tmp/data.txt
        cat /tmp/data.txt

이 예시는 데이터를 S3에 업로드하고, 다음 단계에서 다시 S3에서 다운로드하여 사용하는 방식입니다.


6. 결론

AWS EKS를 사용하여 Docker 기반의 파이프라인을 구성하는 것은 비용 효율적이고 확장 가능한 솔루션을 제공합니다. Spot InstancesFargate를 활용하면 비용을 최소화할 수 있으며, Argo Workflows는 복잡한 파이프라인을 자동화하고 관리하는 데 매우 유용합니다. 파이프라인을 구성할 때 여러 Docker 이미지를 사용할지, 하나의 Docker 이미지로 통합할지는 파이프라인의 복잡성과 요구사항에 따라 결정할 수 있습니다. 또한, Argo Workflows를 통해 저장소 마운트를 활용하거나 외부 스토리지를 사용하여 데이터를 유연하게 관리할 수 있습니다.


이 블로그 글을 통해 클라우드 환경에서 Docker 기반 파이프라인을 구성하고, Argo Workflows를 활용하여 자동화하는 방법을 이해하는 데 도움이 되기를 바랍니다.

반응형
반응형

Docker란?

Docker는 애플리케이션을 컨테이너로 패키징하여 실행할 수 있는 오픈 소스 플랫폼입니다. 컨테이너는 애플리케이션과 그 의존성을 함께 묶어 격리된 환경에서 실행되도록 합니다. 이를 통해 개발자는 애플리케이션을 어디서나 동일한 환경에서 실행할 수 있으며, 배포 및 관리를 단순화할 수 있습니다. Docker는 특히 가상 머신보다 더 가볍고 빠르게 애플리케이션을 실행할 수 있는 장점을 가지고 있어, 개발과 운영 환경에서 널리 사용되고 있습니다.

Docker의 주요 특징:

  • 컨테이너: 격리된 환경에서 애플리케이션을 실행할 수 있어, 다른 컨테이너나 시스템에 영향을 미치지 않음.
  • 이미지: 애플리케이션과 의존성을 포함한 패키지로, 한번 빌드하면 어디서나 동일한 환경에서 실행 가능.
  • 경량성: 가상 머신보다 적은 리소스를 사용하며, 더 빠른 배포 및 실행이 가능.

Docker의 장점

1. 애플리케이션의 이식성

Docker는 애플리케이션을 컨테이너화하여 운영 체제의 종류나 환경에 상관없이 동일하게 실행할 수 있습니다. 이를 통해 개발, 테스트, 프로덕션 환경 간에 애플리케이션의 이식성을 보장할 수 있습니다.

2. 빠르고 경량

컨테이너는 가상 머신에 비해 매우 가볍고 빠릅니다. 가상 머신은 각각 운영 체제를 포함하는 반면, Docker 컨테이너는 호스트 운영 체제의 커널을 공유하므로 시작 속도와 리소스 사용량이 적습니다.

3. 개발 및 배포의 일관성

Docker 이미지를 사용하면 애플리케이션을 어디서나 동일한 환경에서 실행할 수 있습니다. 개발자가 작성한 코드를 프로덕션 환경에 배포할 때, 환경 차이로 인한 문제를 최소화할 수 있습니다.

4. 버전 관리 및 롤백

Docker 이미지는 여러 레이어로 구성되며, 이미지의 버전을 관리할 수 있습니다. 이를 통해 쉽게 롤백하거나 특정 버전의 애플리케이션을 실행할 수 있습니다.

5. 확장성

Docker는 클러스터링 및 오케스트레이션 도구(Kubernetes 등)와 결합하여 대규모 애플리케이션을 쉽게 확장할 수 있습니다. 이를 통해 클라우드 환경에서의 자원 관리와 확장성을 극대화할 수 있습니다.

Docker의 단점

1. 복잡한 네트워킹 설정

Docker의 네트워킹은 복잡할 수 있으며, 특히 여러 컨테이너 간의 통신이나 클러스터링 환경에서는 네트워크 설정에 대한 깊은 이해가 필요합니다.

2. 컨테이너 보안 문제

Docker는 기본적으로 root 권한으로 실행되기 때문에, 보안 취약점이 발견되면 컨테이너 탈출 공격 등이 발생할 수 있습니다. 이를 방지하기 위해 rootless Docker나 보안 강화 설정이 필요합니다.

3. 상태 관리의 어려움

컨테이너는 기본적으로 비상태성(stateless)으로 설계되어 있습니다. 이를 사용하여 영속적인 데이터를 저장하거나 관리하는 것은 다소 복잡할 수 있으며, 적절한 볼륨 관리가 필요합니다.

 

1. Rootless Docker와 일반 Docker 차이 및 설치 방법

sudo systemctl enable docker
sudo systemctl start docker

1. 일반 Docker 설치 방법

Ubuntu에서 일반 Docker를 설치하려면 다음 단계를 따릅니다:

  • Docker 패키지 설치를 위한 필수 패키지를 먼저 설치합니다.
sudo systemctl enable docker
sudo systemctl start docker
  • Docker GPG 키를 추가한 후, Docker 공식 저장소를 설정합니다.
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  • Docker 패키지를 설치합니다.
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  • Docker 설치 후, Docker 서비스를 활성화하고 시작합니다.
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release

2. Docker 사용 시 그룹에 사용자 추가

Docker는 기본적으로 root 권한으로 실행되기 때문에, sudo 없이 Docker 명령어를 실행하려면 사용자를 docker 그룹에 추가해야 합니다. 다음 명령어를 실행하여 현재 사용자를 docker 그룹에 추가합니다.

sudo usermod -aG docker $USER

사용자를 docker 그룹에 추가한 후, 적용을 위해 로그아웃하고 다시 로그인합니다. 또는 아래 명령어를 실행하여 새로 추가된 그룹을 바로 적용할 수 있습니다.

newgrp docker

이제 sudo 없이 Docker 명령을 실행할 수 있습니다.

docker run hello-world

Rootless Docker 설치 방법

Rootless Docker는 root 권한 없이 컨테이너를 실행할 수 있도록 지원하는 도구입니다. 보안이 중요한 환경에서 주로 사용되며, 다음과 같이 설치할 수 있습니다:

  1. 일반 Docker를 먼저 설치하고,
  2. Rootless 설정을 활성화합니다.
dockerd-rootless-setuptool.sh install
export PATH=/usr/bin:$PATH
export DOCKER_HOST=unix:///run/user/$(id -u)/docker.sock
systemctl --user start docker

Rootless Docker는 루트 권한 없이 실행되기 때문에 보안성 측면에서 매우 유리합니다. 특히 여러 사용자가 동일한 서버에서 컨테이너를 실행하거나, 루트 권한을 요구하지 않는 환경에서 적합합니다.


2. Docker 컨테이너에서 볼륨 권한 문제 해결

Docker 컨테이너에서 호스트 파일 시스템과 볼륨을 마운트할 때, 컨테이너가 생성한 파일은 기본적으로 root 권한으로 작성됩니다. 이로 인해 호스트 시스템에서 권한 문제가 발생할 수 있습니다.

문제 상황

  • 컨테이너에서 생성한 파일이 root 소유자로 설정되어, 호스트의 일반 사용자가 해당 파일을 수정하거나 삭제할 수 없습니다.

해결 방법

  • 컨테이너 실행 시 특정 사용자로 실행: --user 옵션을 사용하여 컨테이너 내부에서 파일을 생성하는 사용자의 권한을 설정할 수 있습니다. 이 방법은 호스트 시스템의 사용자와 권한을 맞추는 데 유용합니다.
docker run -v /host/path:/container/path --user $(id -u):$(id -g) my_container
  • 권한 수정: 컨테이너 내에서 chown 명령을 사용하여 마운트된 디렉토리의 소유권을 변경할 수 있습니다.
docker run -v /host/path:/container/path my_container bash -c "chown -R user:group /container/path && your_command"

이 방법을 통해 컨테이너 내에서 생성된 파일의 소유자를 호스트 시스템의 사용자와 일치시켜, 권한 문제를 해결할 수 있습니다.


3. Rootless Docker 사용이 적합한 상황

Rootless Docker는 다음과 같은 경우에 적합합니다:

보안이 중요한 환경

Rootless Docker는 root 권한을 사용하지 않기 때문에, 컨테이너 내부에서 발생하는 보안 문제가 호스트 시스템에 영향을 미치지 않습니다. 여러 사용자가 동일한 서버에서 컨테이너를 실행하거나, 멀티 테넌트 시스템을 운영하는 환경에서 유용합니다.

루트 권한을 얻기 어려운 환경

루트 권한을 얻을 수 없는 공유 서버나 클라우드 환경에서는 Rootless Docker를 사용하여 비루트 사용자로도 컨테이너를 실행할 수 있습니다.

컨테이너 격리 테스트

보안 취약성 테스트나 컨테이너의 격리성에 대한 테스트를 진행할 때도 Rootless Docker는 유용합니다. 루트 권한을 사용하지 않기 때문에, 더 높은 수준의 보안을 유지하면서 테스트를 수행할 수 있습니다.

 

Docker는 다양한 환경에서 애플리케이션을 손쉽게 배포하고 관리할 수 있는 도구이지만, 컨테이너와 호스트 시스템 간의 권한 문제는 종종 발생합니다. 특히 컨테이너 내부에서 생성된 파일의 권한 문제를 해결하거나, 보안이 중요한 환경에서 Rootless Docker를 사용하는 방법을 잘 이해하면, 보다 안전하고 효율적인 Docker 사용이 가능합니다.

반응형

'Computer Science > linux' 카테고리의 다른 글

Docker Compose 사용하기  (0) 2024.09.20
Dockerfile 작성하기  (1) 2024.09.15
Slurm 설치  (0) 2024.06.05
사용자 계정 관리 및 조직의 구조화 툴 (LDAP)  (0) 2024.05.17
Docker와 MariaDB연결하기  (0) 2022.08.24
반응형

Docker에서 MariaDB컨테이너 띄우기.

 

1. MariaDB 저장용 Volumne 컨테이너 만들기

Docker create -it -v /var/lib/mysql --name maria_vol busybox

MariaDB의 데이터베이스 저장은 /var/lib/mysql 아래에 저장되는데 Host 데이터와 직접 연결하는 것은 안정적이지 않기 때문에 volumn 컨테이너를 새롭게 만들어서 붙인다.

 

2. MariaDB 이미지 생성

docker pull mariadb

 

3. MariaDB run

docker run -d --name mymaria --volumes-from maria_vol -e MYSQL_ROOT_PASSWORD=1111 -p 3306:3306 mariadb

mymaria 라는 이름의 컨테이너를 생성했다.

 

이 컨테이너 안에서 데이터를 관리하면 된다!

반응형

'Computer Science > linux' 카테고리의 다른 글

Slurm 설치  (0) 2024.06.05
사용자 계정 관리 및 조직의 구조화 툴 (LDAP)  (0) 2024.05.17
centos 8에 slurm 설치하기  (0) 2022.05.11
conda 채널 추가  (0) 2022.02.22
conda proxy 에러 해결방법  (0) 2022.02.07

+ Recent posts