on my way

CI/CD-07: Podman을 이용한 컨테이너 관리 4 및 Kubernetes 서비스 전환 본문

Computer Science/CICD

CI/CD-07: Podman을 이용한 컨테이너 관리 4 및 Kubernetes 서비스 전환

wingbeat 2024. 9. 1. 19:45
반응형

이 이미지는 소스 코드로부터 Kubernetes 클러스터에 애플리케이션을 배포하는 전체 과정을 시각적으로 설명하고 있습니다.

각 단계를 쉽게 이해할 수 있도록 자세히 설명하겠습니다.

1. 소스 코드부터 컨테이너 이미지 생성까지

  1. Source Code (php-ip):
    • 애플리케이션의 소스 코드입니다. 여기서는 PHP와 같은 언어로 작성된 코드를 나타냅니다.
  2. Compile:
    • 소스 코드를 컴파일하여 실행 가능한 파일로 변환합니다.
    • 예를 들어, 자바 소스 코드를 컴파일하여 바이트 코드(.class 파일)로 변환하는 과정입니다.
  3. Package (war/jar):
    • 컴파일된 코드를 패키징하여 배포 가능한 형식(WAR 또는 JAR 파일)으로 만듭니다.
    • 이는 웹 애플리케이션 또는 라이브러리를 배포하는 데 사용됩니다.
  4. Container Image:
    • 패키징된 파일을 컨테이너 이미지로 변환합니다.
    • Docker 또는 Buildah와 같은 도구를 사용하여 이 이미지를 생성합니다.
  5. Container Test (podman):
    • 생성된 컨테이너 이미지를 Podman을 사용하여 테스트합니다.
    • 이 과정에서 이미지가 제대로 동작하는지 확인합니다.

2. 소스 코드와 Git

  1. Git:
    • 소스 코드를 버전 관리 시스템인 Git을 사용하여 관리합니다.
    • 코드 변경 사항을 추적하고 협업할 수 있게 합니다.
  2. Build BranchRelease Branch:
    • 개발 브랜치와 릴리스 브랜치를 사용하여 소스 코드를 관리합니다.
    • 개발 브랜치에서 작업을 하고, 안정된 버전은 릴리스 브랜치에 병합합니다.

3. Buildah와 레지스트리

  1. Buildah:
    • 컨테이너 이미지를 빌드하는 도구입니다. 여기서는 Git에서 클론한 소스 코드를 사용하여 컨테이너 이미지를 생성합니다.
    • 생성된 이미지는 레지스트리에 푸시됩니다.
  2. Registry:
    • 생성된 컨테이너 이미지를 저장하는 곳입니다. 이 이미지는 나중에 Kubernetes에서 사용할 수 있습니다.

4. Kubernetes 리소스 생성

  1. Kubectl Create Commands:
    • kubectl create deployment --image=registry.demo.io/official/blogdb:v1 --image=registry.demo.io/official/blogweb:v1 --port=8080 --dry-run=client --output=yaml --replicas=1 official-blog --namespace=official-blog > official-blog-deployment.yaml
      • 이 명령어는 블로그 애플리케이션의 배포를 정의하는 YAML 파일을 생성합니다.
    • kubectl create namespace official-blog --dry-run=client --output=yaml > official-blog-namespace.yaml
      • 이 명령어는 네임스페이스를 정의하는 YAML 파일을 생성합니다.
    • kubectl create service clusterip official-blog --output=yaml --dry-run=client --tcp 8080:8080 --tcp 5432:5432 > official-blog-service.yaml
      • 이 명령어는 서비스 리소스를 정의하는 YAML 파일을 생성합니다.

5. Tekton과 Kubernetes

  1. Tekton:
    • CI/CD 파이프라인 도구로, 소스 코드를 빌드하고 테스트하며 배포하는 과정을 자동화합니다.
    • 여기서는 Tekton이 빌드 프로세스를 트리거하여 컨테이너 이미지를 빌드하고, Kubernetes 클러스터에 배포합니다.
  2. Kubectl:
    • kubectl은 Kubernetes 클러스터와 상호작용하는 명령줄 도구입니다.
    • 여기서는 Tekton 파이프라인이 생성한 YAML 파일을 사용하여 Kubernetes 리소스를 생성합니다.

전체 프로세스 요약

  • Source Code -> Compile -> Package -> Container Image -> Container Test
  • Git을 통해 소스 코드 관리 및 변경 사항 추적
  • Buildah를 사용하여 컨테이너 이미지 생성 및 레지스트리에 푸시
  • Kubectl을 사용하여 Kubernetes 리소스를 생성하는 YAML 파일 생성
  • Tekton을 사용하여 CI/CD 파이프라인 실행
  • Kubernetes에 애플리케이션 배포 및 관리

이를 통해 소스 코드부터 Kubernetes 클러스터에 애플리케이션을 배포하는 전체 과정을 효율적으로 자동화할 수 있습니다.

베어메탈 환경 AKA Dev Workstation

  1. Maven:
    • java test.java: Java 소스 파일(test.java)을 Maven을 사용하여 컴파일합니다.
    • pom.xml: 프로젝트의 의존성, 빌드 설정 등이 정의된 Maven 프로젝트 객체 모델 파일입니다.
    • mvn clean package: Maven을 사용하여 프로젝트를 빌드하고 패키징합니다. 이 명령어는 소스 코드를 컴파일하고, 테스트를 실행한 후, JAR 또는 WAR 파일로 패키징합니다.
  2. Spring:
    • javac: Java 컴파일러를 사용하여 소스 파일을 바이트코드(.class 파일)로 컴파일합니다.
    • war/jar: Spring 애플리케이션을 JAR 또는 WAR 파일로 패키징합니다.
  3. JUnit:
    • JUnit: 자바 애플리케이션의 단위 테스트를 수행하는 도구입니다. Spring 애플리케이션의 각 기능이 올바르게 작동하는지 확인합니다.
  4. Container Image:
    • Buildah: Buildah를 사용하여 Dockerfile을 기반으로 컨테이너 이미지를 빌드합니다. 이 이미지에는 애플리케이션 코드와 실행 환경이 포함됩니다.
    • 컨테이너 이미지는 애플리케이션 이미지와 pod 이미지(일시 중지 상태)로 나눌 수 있습니다.
  5. Podman:
    • podman pod create: Podman을 사용하여 새로운 Pod를 생성합니다. Pod는 하나 이상의 컨테이너를 포함하는 논리적인 단위입니다.
    • podman pod create --name blog-web: 웹 애플리케이션 컨테이너를 포함하는 Pod를 생성합니다.
    • podman pod create --name blog-db: 데이터베이스 컨테이너를 포함하는 Pod를 생성합니다.

결과

  1. Web/8080:
    • 웹 애플리케이션 컨테이너는 포드 내에서 8080 포트를 사용합니다.
    • 사용자 요청이 80 포트로 들어오면 컨테이너의 8080 포트로 전달됩니다.
  2. DB/3456:
    • 데이터베이스 컨테이너는 포드 내에서 3456 포트를 사용합니다.
    • 내부 네트워크를 통해 애플리케이션 컨테이너와 통신합니다.
  3. Infra-container (POD):
    • infra-container는 기본 설정을 포함하는 Pod입니다.
    • 이 Pod는 여러 컨테이너가 하나의 네임스페이스 내에서 실행될 수 있도록 합니다.
    • /etc/hosts 파일에는 로컬 호스트네임이 정의되어 있으며, 이를 통해 컨테이너 간의 통신이 이루어집니다.

Maven

Maven은 Apache Software Foundation에서 개발한 프로젝트 관리 도구입니다.

Java 프로젝트의 빌드 자동화, 의존성 관리, 프로젝트 보고서 생성 등을 담당합니다.

역할:

  1. 빌드 자동화: mvn clean package 명령어를 통해 소스 코드를 컴파일하고, 테스트하며, JAR 또는 WAR 파일로 패키징합니다.
  2. 의존성 관리: 프로젝트에서 사용되는 라이브러리와 플러그인을 자동으로 다운로드하고, 버전을 관리합니다. pom.xml 파일에 의존성을 명시하면 Maven이 이를 자동으로 처리합니다.
  3. 프로젝트 표준화: 프로젝트 구조를 표준화하고, 빌드 과정, 테스트, 배포 등의 작업을 일관되게 수행합니다.
  4. 프로젝트 보고서 생성: 프로젝트의 문서화, 코드 품질 보고서, 테스트 보고서 등을 자동으로 생성합니다.

Spring

Spring Framework는 자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크입니다.

경량 컨테이너로, 애플리케이션의 모든 레이어에 걸쳐서 다양한 기능을 제공합니다.

역할:

  1. 의존성 주입 (Dependency Injection): 객체 간의 의존성을 주입하여 코드의 결합도를 낮추고, 테스트와 유지보수를 쉽게 만듭니다.
  2. AOP (Aspect-Oriented Programming): 횡단 관심사를 모듈화하여 코드의 중복을 줄이고, 유지보수를 용이하게 합니다.
  3. MVC (Model-View-Controller): 웹 애플리케이션을 구성하는 구조를 제공하여, 비즈니스 로직과 UI 로직을 분리합니다.
  4. 데이터 접근: 다양한 데이터 접근 기술(JDBC, JPA, Hibernate 등)을 지원하며, 데이터베이스와의 상호작용을 단순화합니다.
  5. 통합: 다양한 외부 시스템과의 통합을 쉽게 할 수 있도록 다양한 모듈과 API를 제공합니다.

JUnit

JUnit은 자바 프로그래밍 언어를 위한 단위 테스트 프레임워크입니다.

테스트 주도 개발(TDD)을 지원하며, 코드의 기능이 올바르게 동작하는지 검증할 수 있습니다.

역할:

  1. 단위 테스트: 개별 메소드나 클래스의 기능을 테스트하여 코드의 정확성을 검증합니다.
  2. 리그레션 테스트: 코드 변경 후에도 기존 기능이 올바르게 동작하는지 확인합니다.
  3. 자동화 테스트: 테스트 코드를 자동으로 실행하여, 반복적인 테스트 작업을 자동화합니다.
  4. 테스트 커버리지: 코드의 어느 부분이 테스트되었는지 확인할 수 있어, 테스트 커버리지를 높일 수 있습니다.
  5. 통합 테스트: 여러 컴포넌트가 함께 동작하는지 검증하는 통합 테스트를 지원합니다.

각 도구의 역할 요약

  1. Maven:
    • 프로젝트 빌드와 의존성 관리를 자동화하여 개발 과정을 단순화합니다.
    • 프로젝트 표준화를 통해 일관된 빌드 환경을 제공합니다.
  2. Spring:
    • 애플리케이션 개발의 다양한 요구 사항을 지원하는 경량 프레임워크입니다.
    • 의존성 주입, AOP, MVC 등의 기능을 통해 모듈화와 재사용성을 높입니다.
  3. JUnit:
    • 단위 테스트 프레임워크로, 코드의 기능을 검증하고 리그레션 테스트를 수행합니다.
    • 테스트 자동화를 통해 개발 속도를 높이고, 코드 품질을 향상시킵니다.

이 세 가지 도구는 함께 사용되어, Java 애플리케이션의 개발, 테스트, 배포 과정을 효율적이고 효과적으로 관리할 수 있습니다.

요약

이 그림은 소스 코드 작성부터 컨테이너 이미지 생성 및 배포까지의 과정을 시각적으로 설명하고 있습니다.

Maven을 사용하여 소스 코드를 컴파일하고 패키징한 후, Spring 프레임워크와 JUnit을 사용하여 애플리케이션을 테스트합니다.

Buildah를 사용하여 컨테이너 이미지를 빌드하고, Podman을 사용하여 Pod를 생성하여 애플리케이션을 배포합니다.

이를 통해 애플리케이션 개발과 배포 과정에서 각 단계의 역할과 작업 흐름을 이해할 수 있습니다.


이 이미지는 Podman을 사용한 컨테이너 관리 과정을 시각적으로 설명하고 있습니다.

Podman은 컨테이너를 관리하기 위한 오픈 소스 도구로, Docker와 유사하지만 데몬리스(daemonless) 방식으로 동작하는 점이 다릅니다.

이미지 구성 요소 설명

1. Podman Host

Podman Host는 컨테이너가 실행되는 서버나 머신을 의미합니다.

이곳에서 Podman 명령어를 사용하여 컨테이너를 빌드, 가져오기, 실행할 수 있습니다.

  • Podman CLI (Command Line Interface): Podman을 제어하기 위한 명령어 인터페이스입니다. 세 가지 주요 명령어가 있습니다.
    • podman build: Dockerfile을 사용하여 새로운 컨테이너 이미지를 빌드합니다.
    • podman pull: 컨테이너 레지스트리에서 이미지를 가져옵니다.
    • podman run: 가져온 이미지를 기반으로 컨테이너를 실행합니다.

2. Containers

컨테이너는 독립적으로 실행되는 애플리케이션의 인스턴스를 의미합니다.

여러 개의 컨테이너가 실행될 수 있으며, 각 컨테이너는 고유한 환경에서 독립적으로 동작합니다.

3. Images

이미지는 컨테이너의 실행 환경을 정의한 파일 시스템 스냅샷입니다.

애플리케이션 코드, 라이브러리, 설정 파일 등을 포함하고 있습니다.

여러 컨테이너가 동일한 이미지를 사용할 수 있습니다.

  • 이미지 예시:
    • Red Hat
    • Redis
    • Nginx

4. Container Registry

컨테이너 이미지를 저장하고 배포하는 저장소입니다.

Public 및 private 레지스트리가 존재하며, 이미지를 push(업로드)하거나 pull(다운로드)할 수 있습니다.

  • 이미지 예시:
    • Red Hat
    • Ubuntu
    • CentOS
    • Redis
    • Nginx
    • MongoDB

프로세스 설명

  1. Podman Build:
    • podman build 명령어를 사용하여 Dockerfile을 기반으로 새로운 이미지를 빌드합니다.
    • 빌드된 이미지는 Podman Host의 이미지 목록에 추가됩니다.
  2. Podman Pull:
    • podman pull 명령어를 사용하여 컨테이너 레지스트리에서 이미지를 가져옵니다.
    • 가져온 이미지는 Podman Host의 이미지 목록에 추가됩니다.
  3. Podman Run:
    • podman run 명령어를 사용하여 이미지를 기반으로 컨테이너를 실행합니다.
    • 실행된 컨테이너는 Podman Host에서 독립적으로 동작하며, 필요에 따라 여러 개의 컨테이너를 동시에 실행할 수 있습니다.

요약

  • Podman Host: 컨테이너가 실행되는 환경.
  • Podman CLI: Podman을 제어하기 위한 명령어 인터페이스.
  • Containers: 독립적으로 실행되는 애플리케이션 인스턴스.
  • Images: 컨테이너의 실행 환경을 정의한 파일 시스템 스냅샷.
  • Container Registry: 컨테이너 이미지를 저장하고 배포하는 저장소.

Podman은 이러한 요소들을 통해 컨테이너의 빌드, 가져오기, 실행을 관리하며, 다양한 애플리케이션을 효율적으로 배포하고 실행할 수 있도록 돕습니다.

Kubernetes 클러스터 구성 요소

1. Control Plane

Control Plane은 클러스터의 중앙 관리 구성 요소로, 클러스터의 상태를 관리하고 유지하는 역할을 합니다.

Control Plane은 다음과 같은 구성 요소로 이루어져 있습니다:

  • API Server (api):
    • 클러스터의 모든 구성 요소가 통신하는 중앙 허브입니다.
    • 외부 요청을 받아들이고, 클러스터 내부의 다른 컴포넌트와의 통신을 조정합니다.
  • etcd (etcd):
    • 클러스터의 모든 상태 데이터를 저장하는 고가용성 키-값 저장소입니다.
    • 모든 클러스터 데이터의 영구 저장소 역할을 합니다.
  • Controller Manager (c-m):
    • 여러 컨트롤러를 실행하여 클러스터 상태를 유지합니다.
    • 예를 들어, 복제된 컨테이너 수를 관리하는 레플리케이션 컨트롤러가 있습니다.
  • Cloud Controller Manager (c-c-m) (optional):
    • 클러스터를 클라우드 서비스와 통합하는 데 사용됩니다.
    • 클라우드 공급자 API와 통신하여 클라우드 리소스를 관리합니다.
  • Scheduler (sched):
    • 새로운 컨테이너(파드)가 생성될 때, 이를 적절한 노드에 할당하는 역할을 합니다.
    • 자원 사용량, 정책 등을 고려하여 최적의 노드를 선택합니다.

2. Nodes

노드는 실제 애플리케이션이 실행되는 워커 머신입니다. 각 노드는 다음과 같은 구성 요소를 포함합니다:

  • kubelet:
    • 각 노드에서 실행되는 에이전트로, API 서버와 통신하여 명령을 받고 실행합니다.
    • 컨테이너가 제대로 실행되고 있는지 확인하고, 필요 시 재시작합니다.
  • kube-proxy (k-proxy):
    • 네트워크 프록시로, 네트워크 트래픽을 적절한 컨테이너로 라우팅합니다.
    • 네트워크 규칙을 설정하고 유지하여 클러스터 내 통신을 관리합니다.

이미지 내 흐름 설명

  1. Control Plane:
    • Control Plane의 각 구성 요소(api, etcd, c-m, c-c-m, sched)는 클러스터의 상태를 유지하고 관리합니다.
    • API 서버는 클러스터의 중앙 허브로, 외부 요청을 받아들이고 내부 컴포넌트와의 통신을 조정합니다.
    • etcd는 클러스터의 모든 상태 데이터를 저장하며, Controller Manager는 여러 컨트롤러를 실행하여 클러스터 상태를 유지합니다.
    • Cloud Controller Manager는 클라우드 서비스와의 통합을 관리하며, Scheduler는 새로운 파드를 적절한 노드에 할당합니다.
  2. Nodes:
    • 각 노드에는 kubelet과 kube-proxy가 실행됩니다.
    • kubelet은 API 서버와 통신하여 명령을 받고 실행하며, 컨테이너가 제대로 실행되는지 확인합니다.
    • kube-proxy는 네트워크 트래픽을 적절한 컨테이너로 라우팅합니다.

 

요약

  • Control Plane: 클러스터 상태를 관리하고 유지하는 중앙 구성 요소들.
    • API Server, etcd, Controller Manager, Cloud Controller Manager, Scheduler.
  • Nodes: 실제 애플리케이션이 실행되는 워커 머신들.
    • kubelet, kube-proxy.

이 이미지를 통해 Kubernetes 클러스터의 구조와 각 구성 요소들의 역할을 이해할 수 있습니다.

Control Plane은 클러스터의 상태를 관리하고 유지하며, 각 노드는 실제 애플리케이션을 실행하고 관리하는 역할을 합니다.


이 이미지는 네트워크 환경에서 DevOps Spring 서비스가 어떻게 배포되고 연결되는지 시각적으로 설명하고 있습니다.

각 부분을 쉽게 이해할 수 있도록 설명하겠습니다.

네트워크 구성

1. 공유기 (Router)

  • 외부 IP 주소: 221.146.125.131:8080
    • 외부 네트워크에서 접근할 수 있는 IP 주소입니다.
    • 포트 8080을 통해 트래픽을 받아들입니다.

2. 사설 네트워크 (Private Network)

  • 내부 IP 주소들: 192.168.56.14, 192.168.56.15, 192.168.56.16
    • 이들은 로컬 네트워크 내에서만 접근 가능한 컴퓨터들입니다.
    • 포트 8080을 통해 트래픽을 받아들입니다.
    • 공유기로부터 전달된 트래픽을 받아들이는 역할을 합니다.

3. 가상 머신 네트워크 (Virtual Machine Network)

  • 내부 IP 주소들: 192.168.56.101, 192.168.56.10, 192.168.56.102
    • 각각의 가상 머신에 할당된 IP 주소들입니다.
    • 포트 30696을 통해 사설 네트워크로부터 트래픽을 받아들입니다.

4. 쿠버네티스 (Kubernetes)

  • DevOps Spring Service
    • Service: 포트 80을 통해 트래픽을 받아들여 DevOps Spring Deployment Pod로 전달합니다.
    • Pod: DevOps Spring Deployment Pod에서 애플리케이션이 실행됩니다. 포트 8080을 통해 서비스에 접근할 수 있습니다.

전체 데이터 흐름

  1. 외부에서의 접근:
    • 외부 사용자가 221.146.125.131:8080으로 요청을 보냅니다.
    • 요청은 공유기에서 받아들여집니다.
  2. 사설 네트워크:
    • 공유기는 요청을 사설 네트워크의 IP 주소들(192.168.56.14, 192.168.56.15, 192.168.56.16)로 전달합니다.
    • 이들 컴퓨터는 포트 8080에서 요청을 받아들입니다.
  3. 가상 머신 네트워크:
    • 사설 네트워크의 컴퓨터들은 요청을 가상 머신 네트워크의 IP 주소들(192.168.56.101, 192.168.56.10, 192.168.56.102)로 전달합니다.
    • 가상 머신 네트워크는 포트 30696에서 요청을 받아들입니다.
  4. 쿠버네티스:
    • 가상 머신 네트워크는 요청을 쿠버네티스의 DevOps Spring Service로 전달합니다.
    • DevOps Spring Service는 포트 80에서 요청을 받아들여 DevOps Spring Deployment Pod로 전달합니다.
    • DevOps Spring Deployment Pod는 포트 8080에서 애플리케이션을 실행하며, 요청을 처리하여 응답을 반환합니다.

요약

이 이미지는 외부 네트워크에서 시작된 요청이 공유기를 통해 사설 네트워크, 가상 머신 네트워크를 거쳐 쿠버네티스 클러스터 내의 DevOps Spring 서비스에 도달하는 과정을 설명합니다.

각각의 네트워크 계층에서 포트 번호를 통해 트래픽이 어떻게 전달되고 처리되는지 보여줍니다.


이미지 1: DevOps Pipeline 및 Podman

 

1. dev-infra라는 이름의 Pod를 생성하고, 호스트의 포트 80과 5000을 각각 컨테이너의 포트 3000과 5000에 매핑합니다.

2.

  • gogs 컨테이너는 Git 저장소를 제공하며, 데이터와 백업을 위한 볼륨을 마운트합니다.
  • docker-registry 컨테이너는 Docker 이미지를 저장할 레지스트리를 제공합니다.

이미지 2: Gogs 설정 및 Git 저장소 마이그레이션

Gogs 설정

  • Gogs의 설정 페이지에서 애플리케이션 이름, 저장소 위치, 도메인, 포트 등을 설정합니다.

저장소 마이그레이션

  • GitHub 등의 원격 저장소에서 Gogs로 저장소를 마이그레이션합니다.

이미지 3: DNS 설정 및 Maven 빌드

이 이미지는 DNS 설정과 Git 저장소를 클론하여 Maven으로 빌드하는 과정을 설명합니다.

DNS 설정

  • DNS 서버에서 Git 저장소 주소를 설정합니다.
  • 해당 저장소를 클론하여 Maven으로 빌드합니다.

 

 

  • 명령어 설명:
    • container-tools와 maven-openjdk11.noarch를 설치하여 Maven 빌드 환경을 준비합니다.
    • mvn clean package 명령어로 프로젝트를 빌드합니다.

이미지 4: 컨테이너 이미지 빌드 및 레지스트리에 푸시

이 이미지는 Dockerfile을 사용하여 컨테이너 이미지를 빌드하고 레지스트리에 푸시하는 과정을 설명합니다.

 

Buildah를 사용한 이미지 빌드

buildah bud -f Dockerfile -t dev.example.com:5000/tang/spring-petclinic:v1
  • 명령어 설명: Dockerfile을 기반으로 이미지를 빌드하고 dev.example.com:5000 레지스트리에 태그를 지정합니다.

 

이미지 푸시

buildah push --tls-verify=false dev.example.com:5000/tang/spring-petclinic:v1
  • 명령어 설명: 빌드한 이미지를 레지스트리에 푸시합니다.

이미지 5: Petclinic 컨테이너 실행 및 YAML 파일 생성

이 이미지는 Petclinic 컨테이너를 실행하고 Kubernetes YAML 파일을 생성하는 과정을 설명합니다.

 

컨테이너 실행

podman run -d -p 8088:8080 --rm --name petclinic dev.example.com:5000/tang/spring-petclinic:v1
  • 명령어 설명: petclinic 컨테이너를 실행하고 호스트의 포트 8088을 컨테이너의 포트 8080에 매핑합니다.

 

YAML 파일 생성

podman kube generate petclinic --filename petclinic-v1.yaml
  • 명령어 설명: Podman 컨테이너 설정을 기반으로 Kubernetes YAML 파일을 생성합니다.

이미지 6: WordPress + MariaDB 실습

이 이미지는 WordPress와 MariaDB를 Podman을 사용하여 설정하는 실습 과정을 설명합니다.

 

Pod 생성 및 컨테이너 실행

 

Pod 생성 및 컨테이너 실행

podman pod create --name wordpress-service --publish 18080:80
podman run -d --pod wordpress-service --name wordpress quay.io/redhattraining/wordpress:5.3.0
podman run -d --pod wordpress-service --name mariadb -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=wordpress -e MYSQL_DATABASE=wordpress quay.io/fedora/mariadb-105:latest

명령어 설명:

  • wordpress-service라는 Pod를 생성하고 포트를 매핑합니다.
  • wordpress와 mariadb 컨테이너를 Pod에 추가합니다.

이미지 7: WordPress 서비스 설정

이 이미지는 WordPress 서비스를 설정하고 Kubernetes YAML 파일을 생성하는 과정을 설명합니다.

WordPress 서비스 YAML 생성

podman kube generate wordpress-service --filename wordpress-service-v1.yaml
  • 명령어 설명: WordPress 서비스를 Kubernetes YAML 파일로 생성합니다.

이미지 8: 전체 시스템 구조

이 이미지는 전체 시스템 구조를 설명합니다. 여기에는 다양한 컨테이너와 Pod가 포함되어 있습니다.

  • dev-infra (POD): Gogs와 Docker Registry 컨테이너를 포함하는 Pod입니다.
  • wordpress-service (POD): WordPress와 MariaDB 컨테이너를 포함하는 Pod입니다.
  • 기타 컨테이너: 로컬 Podman 이미지, 외부 레지스트리 등과의 상호작용을 설명합니다..

 


이 이미지는 Podman을 사용하여 gogs와 registry 컨테이너를 포함하는 dev-infra라는 이름의 Pod를 생성하고 실행하는 과정을 설명하고 있습니다.

아래 단계별로 자세히 설명하겠습니다.

1. Pod 생성

podman pod create --name dev-infra --publish 80:3000 --publish 5000:5000
  • 명령어 설명:
    • podman pod create: 새로운 Pod를 생성하는 명령어입니다.
    • --name dev-infra: 생성할 Pod의 이름을 dev-infra로 지정합니다.
    • --publish 80:3000: 호스트의 포트 80을 Pod 내부의 포트 3000에 매핑합니다. 이는 나중에 gogs 컨테이너가 이 포트를 사용하게 됩니다.
    • --publish 5000:5000: 호스트의 포트 5000을 Pod 내부의 포트 5000에 매핑합니다. 이는 나중에 registry 컨테이너가 이 포트를 사용하게 됩니다.

2. Gogs 및 Docker Registry 컨테이너 실행

Gogs 컨테이너 실행

podman run -d --pod dev-infra --name gogs -p 80:3000 -v gogs-backup:/backup -v gogs-data:/data docker.io/gogs/gogs
  • 명령어 설명:
    • podman run -d: 새로운 컨테이너를 백그라운드에서 실행하는 명령어입니다.
    • --pod dev-infra: dev-infra Pod 내에서 컨테이너를 실행하도록 지정합니다.
    • --name gogs: 컨테이너의 이름을 gogs로 지정합니다.
    • -p 80:3000: 호스트의 포트 80을 컨테이너의 포트 3000에 매핑합니다. (Pod 생성 시 이미 지정했으므로 중복됩니다)
    • -v gogs-backup:/backup: 호스트의 gogs-backup 볼륨을 컨테이너의 /backup 디렉토리에 마운트합니다.
    • -v gogs-data:/data: 호스트의 gogs-data 볼륨을 컨테이너의 /data 디렉토리에 마운트합니다.
    • docker.io/gogs/gogs: 사용할 이미지로 docker.io/gogs/gogs를 지정합니다.

Docker Registry 컨테이너 실행

podman run -d --pod dev-infra --name docker-registry -v registry-data:/var/lib/registry registry
  • 명령어 설명:
    • podman run -d: 새로운 컨테이너를 백그라운드에서 실행하는 명령어입니다.
    • --pod dev-infra: dev-infra Pod 내에서 컨테이너를 실행하도록 지정합니다.
    • --name docker-registry: 컨테이너의 이름을 docker-registry로 지정합니다.
    • -v registry-data:/var/lib/registry: 호스트의 registry-data 볼륨을 컨테이너의 /var/lib/registry 디렉토리에 마운트합니다.
    • registry: 사용할 이미지로 registry를 지정합니다.

주의 사항

  • 컨테이너를 생성할 때 --pod 태그와 -p 태그를 함께 사용하면 오류가 발생합니다. 따라서 위 명령어에서 -p 옵션은 중복된 것이며, 실제로는 사용되지 않습니다.

전체 과정 요약

  1. Pod 생성: dev-infra라는 이름의 Pod를 생성하고, 포트 80과 5000을 각각 Pod 내부의 포트 3000과 5000에 매핑합니다.
  2. Gogs 컨테이너 실행: Git 서비스인 Gogs를 Pod 내에서 실행하고, 백업 및 데이터 디렉토리를 호스트의 볼륨에 마운트합니다.
  3. Docker Registry 컨테이너 실행: Docker 이미지를 저장할 registry를 Pod 내에서 실행하고, 레지스트리 데이터를 호스트의 볼륨에 마운트합니다.

이 이미지는 Podman을 사용하여 여러 컨테이너를 하나의 Pod 내에서 실행하는 방법을 보여주며, 특히 Gogs와 Docker Registry와 같은 서비스 설정을 설명합니다.


이 가이드는 블로그 프로젝트를 설정하고 Podman을 사용하여 데이터베이스와 웹 서버를 포함하는 컨테이너를 빌드하고 실행하는 과정을 설명합니다.

다음은 단계별로 설명한 내용입니다.

1. context.xml 파일에서 데이터베이스 정보 수정

먼저, 블로그 프로젝트의 데이터베이스 연결 설정을 업데이트합니다.

vi src/main/webapp/META-INF/context.xml
  • vi 편집기로 context.xml 파일을 엽니다.
  • 파일 내에서 데이터베이스 연결 정보를 수정합니다.
  • PostgreSQL 데이터베이스에 연결하기 위해 필요한 정보를 설정합니다.
    • url="jdbc:postgresql://blog-db:5432/blog"
    • username="blog"
    • password="blog"

이는 PostgreSQL 데이터베이스가 blog-db라는 이름의 호스트에서 실행되고 있으며, 데이터베이스 이름은 blog임을 의미합니다.

 

2. 프로젝트 컴파일

Maven을 사용하여 프로젝트를 빌드합니다.

mvn clean package
  • mvn clean package 명령어는 Maven을 사용하여 프로젝트를 클린 빌드하고 패키징합니다.
  • 이 과정에서 모든 소스 파일이 컴파일되고, 필요한 의존성이 해결되며, 최종적으로 실행 가능한 JAR/WAR 파일이 생성됩니다.

 

3. 이미지 빌드 (데이터베이스, 웹 각각)

Podman을 사용하여 Docker 이미지를 빌드합니다.

buildah bud -f Dockerfile.web -t registry.example.com:5000/app/blog:w3v1
buildah bud -f Dockerfile.db -t registry.example.com:5000/app/blog:dbv1
  • buildah bud -f Dockerfile.web -t registry.example.com:5000/app/blog:w3v1
    • Dockerfile.web을 기반으로 이미지를 빌드합니다.
    • 생성된 이미지를 registry.example.com:5000/app/blog:w3v1 레지스트리에 태그합니다.
  • buildah bud -f Dockerfile.db -t registry.example.com:5000/app/blog:dbv1
    • Dockerfile.db을 기반으로 이미지를 빌드합니다.
    • 생성된 이미지를 registry.example.com:5000/app/blog:dbv1 레지스트리에 태그합니다.

 

4. Pod 및 컨테이너 생성

Podman을 사용하여 Pod와 컨테이너를 생성합니다.

podman pod create --name blog --publish 8080:8080
podman run -d --pod blog --name blog-db registry.example.com:5000/app/blog:dbv1
podman run -d --pod blog --name blog-web registry.example.com:5000/app/blog:w3v1
  • podman pod create --name blog --publish 8080:8080
    • blog라는 이름의 Pod를 생성합니다.
    • 호스트의 포트 8080을 Pod의 포트 8080에 매핑합니다.
  • podman run -d --pod blog --name blog-db registry.example.com:5000/app/blog:dbv1
    • blog Pod 내에서 blog-db라는 이름의 데이터베이스 컨테이너를 백그라운드에서 실행합니다.
    • 사용되는 이미지는 registry.example.com:5000/app/blog:dbv1입니다.
  • podman run -d --pod blog --name blog-web registry.example.com:5000/app/blog:w3v1
    • blog Pod 내에서 blog-web이라는 이름의 웹 서버 컨테이너를 백그라운드에서 실행합니다.
    • 사용되는 이미지는 registry.example.com:5000/app/blog:w3v1입니다.

 

[코드 정리]

모든 명령어를 한 번에 정리한 것입니다.

vi src/main/webapp/META-INF/context.xml
mvn clean package
buildah bud -f Dockerfile.web -t registry.example.com:5000/app/blog:w3v1
buildah bud -f Dockerfile.db -t registry.example.com:5000/app/blog:dbv1
podman pod create --name blog --publish 8080:8080
podman run -d --pod blog --name blog-db registry.example.com:5000/app/blog:dbv1
podman run -d --pod blog --name blog-web registry.example.com:5000/app/blog:w3v1

 

요약

  • 데이터베이스 설정: context.xml 파일을 편집하여 PostgreSQL 데이터베이스 정보를 입력합니다.
  • 프로젝트 컴파일: Maven을 사용하여 프로젝트를 빌드하고 패키징합니다.
  • 이미지 빌드: Buildah를 사용하여 Docker 이미지를 빌드하고 레지스트리에 태그합니다.
  • Pod 및 컨테이너 생성: Podman을 사용하여 Pod와 컨테이너를 생성하고 실행합니다.

이 과정을 통해 블로그 애플리케이션을 설정하고, 컨테이너화하여 실행할 수 있습니다.

 

이 가이드는 블로그 프로젝트를 설정하고 Podman을 사용하여 데이터베이스와 웹 서버를 포함하는 컨테이너를 빌드하고 실행하는 과정을 설명합니다.

다음은 단계별로 설명한 내용입니다.

1. context.xml 파일에서 데이터베이스 정보 수정

먼저, 블로그 프로젝트의 데이터베이스 연결 설정을 업데이트합니다.

vi src/main/webapp/META-INF/context.xml
  • vi 편집기로 context.xml 파일을 엽니다.
  • 파일 내에서 데이터베이스 연결 정보를 수정합니다.
  • PostgreSQL 데이터베이스에 연결하기 위해 필요한 정보를 설정합니다.
    • url="jdbc:postgresql://blog-db:5432/blog"
    • username="blog"
    • password="blog"

이는 PostgreSQL 데이터베이스가 blog-db라는 이름의 호스트에서 실행되고 있으며, 데이터베이스 이름은 blog임을 의미합니다.

 

2. 프로젝트 컴파일

Maven을 사용하여 프로젝트를 빌드합니다.

mvn clean package
  • mvn clean package 명령어는 Maven을 사용하여 프로젝트를 클린 빌드하고 패키징합니다.
  • 이 과정에서 모든 소스 파일이 컴파일되고, 필요한 의존성이 해결되며, 최종적으로 실행 가능한 JAR/WAR 파일이 생성됩니다.

 

3. 이미지 빌드 (데이터베이스, 웹 각각)

Podman을 사용하여 Docker 이미지를 빌드합니다.

buildah bud -f Dockerfile.web -t registry.example.com:5000/app/blog:w3v1
buildah bud -f Dockerfile.db -t registry.example.com:5000/app/blog:dbv1
  • buildah bud -f Dockerfile.web -t registry.example.com:5000/app/blog:w3v1
    • Dockerfile.web을 기반으로 이미지를 빌드합니다.
    • 생성된 이미지를 registry.example.com:5000/app/blog:w3v1 레지스트리에 태그합니다.
  • buildah bud -f Dockerfile.db -t registry.example.com:5000/app/blog:dbv1
    • Dockerfile.db을 기반으로 이미지를 빌드합니다.
    • 생성된 이미지를 registry.example.com:5000/app/blog:dbv1 레지스트리에 태그합니다.

 

4. Pod 및 컨테이너 생성

Podman을 사용하여 Pod와 컨테이너를 생성합니다.

podman pod create --name blog --publish 8080:8080
podman run -d --pod blog --name blog-db registry.example.com:5000/app/blog:dbv1
podman run -d --pod blog --name blog-web registry.example.com:5000/app/blog:w3v1
  • podman pod create --name blog --publish 8080:8080
    • blog라는 이름의 Pod를 생성합니다.
    • 호스트의 포트 8080을 Pod의 포트 8080에 매핑합니다.
  • podman run -d --pod blog --name blog-db registry.example.com:5000/app/blog:dbv1
    • blog Pod 내에서 blog-db라는 이름의 데이터베이스 컨테이너를 백그라운드에서 실행합니다.
    • 사용되는 이미지는 registry.example.com:5000/app/blog:dbv1입니다.
  • podman run -d --pod blog --name blog-web registry.example.com:5000/app/blog:w3v1
    • blog Pod 내에서 blog-web이라는 이름의 웹 서버 컨테이너를 백그라운드에서 실행합니다.
    • 사용되는 이미지는 registry.example.com:5000/app/blog:w3v1입니다.

 

[코드 정리]

모든 명령어를 한 번에 정리한 것입니다.

vi src/main/webapp/META-INF/context.xml
mvn clean package
buildah bud -f Dockerfile.web -t registry.example.com:5000/app/blog:w3v1
buildah bud -f Dockerfile.db -t registry.example.com:5000/app/blog:dbv1
podman pod create --name blog --publish 8080:8080
podman run -d --pod blog --name blog-db registry.example.com:5000/app/blog:dbv1
podman run -d --pod blog --name blog-web registry.example.com:5000/app/blog:w3v1

요약

  • 데이터베이스 설정: context.xml 파일을 편집하여 PostgreSQL 데이터베이스 정보를 입력합니다.
  • 프로젝트 컴파일: Maven을 사용하여 프로젝트를 빌드하고 패키징합니다.
  • 이미지 빌드: Buildah를 사용하여 Docker 이미지를 빌드하고 레지스트리에 태그합니다.
  • Pod 및 컨테이너 생성: Podman을 사용하여 Pod와 컨테이너를 생성하고 실행합니다.

이 과정을 통해 블로그 애플리케이션을 설정하고, 컨테이너화하여 실행할 수 있습니다.

이 이미지는 블로그 애플리케이션의 트러블슈팅 과정을 단계별로 설명하고 있습니다. 각 단계에 대해 자세히 설명드리겠습니다.

 

단계 1: WAR/JAR 파일 생성

  • 작업 내용: Java 프로젝트를 컴파일하고 패키징하여 WAR 또는 JAR 파일을 생성합니다.
  • 명령어:
    mvn clean package
  • 결과: 이 단계에서는 소스 코드가 컴파일되고, 모든 의존성이 해결되며, 최종적으로 실행 가능한 패키지(WAR 또는 JAR 파일)가 생성됩니다.

 

단계 2: 컨테이너 이미지 생성

  • 작업 내용: Buildah를 사용하여 컨테이너 이미지를 빌드합니다.
  • 명령어:
    • Dockerfile.web: 웹 애플리케이션 컨테이너 이미지를 빌드하는 데 사용됩니다.
    • Dockerfile.db: 데이터베이스 컨테이너 이미지를 빌드하는 데 사용됩니다.
  • buildah bud -f Dockerfile.web -t registry.example.com:5000/app/blog:w3v1 buildah bud -f Dockerfile.db -t registry.example.com:5000/app/blog:dbv1
  • 추가 환경 변수:
  • POSTGRES_USER=blog POSTGRES_PASSWORD=blog POSTGRES_DB=blog
  • 결과: 이 단계에서는 웹 애플리케이션과 데이터베이스를 실행할 수 있는 두 개의 컨테이너 이미지가 생성됩니다. 이미지는 로컬 또는 원격 레지스트리에 푸시됩니다.

 

단계 3: Pod 생성

  • 작업 내용: Podman을 사용하여 Pod를 생성합니다.
  • 명령어:
    podman pod create --publish 8080:8080 --name blog
  • 설명:
    • Pod를 생성하고, 호스트의 포트 8080을 Pod의 포트 8080에 매핑합니다.
  • 결과: 이 단계에서는 blog라는 이름의 Pod가 생성됩니다.

 

단계 4: 컨테이너 실행

  • 작업 내용: Pod 내에 웹 애플리케이션과 데이터베이스 컨테이너를 실행합니다.
  • 명령어:
    podman run -d --pod blog --name blog-db registry.example.com:5000/app/blog:dbv1
    podman run -d --pod blog --name blog-web registry.example.com:5000/app/blog:w3v1
  • 설명:
    • blog-db: 데이터베이스 컨테이너, 포트 5432.
    • blog-web: 웹 애플리케이션 컨테이너, 포트 8080.
  • 결과: 이 단계에서는 blog Pod 내에 두 개의 컨테이너가 실행됩니다.

 

 

최종 결과: 애플리케이션 실행 확인

  • 작업 내용: 웹 브라우저에서 애플리케이션이 정상적으로 실행되는지 확인합니다.
  • URL:
    http://dev.example.com:8080
  • 결과: 브라우저에서 블로그 애플리케이션이 정상적으로 실행되고, 게시물 목록 페이지가 표시됩니다.

이 과정은 Java 프로젝트를 컨테이너화하고, Podman을 사용하여 로컬 환경에서 애플리케이션을 실행하는 데 필요한 주요 단계를 포함합니다. 각 단계에서는 필요한 명령어와 설정을 사용하여 애플리케이션을 설정하고 실행합니다.

반응형