on my way

CI/CD-05: Podman을 사용한 컨테이너 관리 및 포트 설정 3 본문

Computer Science/CICD

CI/CD-05: Podman을 사용한 컨테이너 관리 및 포트 설정 3

wingbeat 2024. 7. 25. 17:23
반응형

DAY 4: Podman을 이용한 컨테이너 관리 및 포트 설정

도메인 서버 구성

먼저, 도메인 서버를 구성하는 방법에 대해 설명한다. 테스트 도메인은 임시로 apple.com으로 설정한다.

1. 도메인 서버 설정

1.호스트네임을 설정한다:

   hostnamectl set-hostname dns1.example.com

 

2.BIND를 설치한다:

   dnf install bind -y

BIND(Berkeley Internet Name Domain)는 가장 널리 사용되는 DNS(Domain Name System) 소프트웨어입니다.

인터넷 도메인 이름을 IP 주소로 변환하거나 그 반대로 변환하는 역할을 합니다.

BIND는 도메인 이름을 관리하고, DNS 쿼리를 처리하며, 도메인 존 파일을 통해 다양한 DNS 설정을 구성할 수 있습니다.

 

3./etc/named.rfc1912.zones 파일을 열어 다음 내용을 추가한다:

named.rfc1912.zones 파일은 BIND 설정 파일 중 하나로, DNS 서버에서 관리하는 도메인 존(zone)을 정의합니다.

이 파일에는 도메인 존의 유형과 위치를 지정하는 정보가 포함됩니다.

이 파일에서 설정한 내용은 DNS 서버가 도메인 이름을 처리하는 데 사용됩니다.

   vi /etc/named.rfc1912.zones

   zone "apple.com" IN {
           type master;
           file "apple.com.zone";
           allow-update { none; };
   };

이 설정은 apple.com 도메인을 관리하기 위한 존(zone)을 정의합니다.

이 존은 마스터 존이며, apple.com.zone 파일에 해당 도메인의 상세한 설정이 저장됩니다.

이 존에 대한 업데이트는 허용되지 않습니다.

 

4./etc/named.conf 파일을 열어 다음 내용을 추가한다:

named.conf 파일은 BIND의 주요 설정 파일로, DNS 서버의 전반적인 동작을 제어합니다.

여기에는 서버가 리스닝할 포트, 허용된 쿼리, 그리고 기타 보안 및 성능 관련 설정이 포함됩니다.

   vi /etc/named.conf

   listen-on port 53 { any; };
   listen-on-v6 port 53 { any; };
   allow-query     { any; };

이 설정은 BIND 서버가 IPv4와 IPv6의 모든 네트워크 인터페이스에서 포트 53(DNS 기본 포트)을 통해 들어오는 요청을 수신하도록 합니다.

또한, 모든 클라이언트가 DNS 서버에 쿼리를 보낼 수 있도록 허용합니다.

 

5.도메인 존 파일을 생성한다:

도메인 존 파일은 특정 도메인에 대한 DNS 설정 정보를 포함하는 파일입니다.

이 파일에는 도메인의 이름 서버(NS), 메일 교환기(MX) 기록, 호스트 이름(A) 기록, 그리고 기타 DNS 레코드가 포함됩니다.

존 파일은 DNS 서버가 도메인에 대한 요청을 처리할 때 참조하는 중요한 파일입니다.

   vi /var/named/apple.com.zone

   $TTL    7200
   apple.com.              IN      SOA     dns1.example.com. admin.apple.com. (
                                           2024071901      ; Serial
                                           7200            ; Refresh
                                           3600            ; Retry
                                           604800          ; Expire
                                           7200)           ; NegativeCacheTTL
                           IN      NS      dns1.example.com.
   apple.com.              IN      A       10.10.0.10
   www                     IN      CNAME   apple.com.

이 파일은 apple.com 도메인에 대한 SOA(Start of Authority) 레코드, 네임 서버(NS) 레코드, A 레코드, 그리고 CNAME 레코드를 정의합니다.

각 레코드는 도메인 이름에 대한 특정 정보를 제공합니다.

 

6. named 서비스를 시작하고 부팅 시 자동으로 시작되도록 설정한다:

named 서비스는 BIND의 DNS 서버 데몬입니다.

이 서비스는 BIND 소프트웨어의 주요 실행 파일이며, DNS 쿼리를 수신하고 응답하는 역할을 합니다.

이 서비스는 시스템 부팅 시 자동으로 시작되도록 설정할 수 있으며, 필요한 경우 수동으로 시작, 중지, 재시작할 수 있습니다.

   systemctl enable --now named

 

 

서비스 명령어 예시:

  • systemctl enable --now named: 시스템 부팅 시 named 서비스를 자동으로 시작하고, 즉시 서비스를 시작합니다.
  • systemctl restart named: named 서비스를 재시작하여 변경된 설정을 적용합니다.
  • systemctl status named: named 서비스의 현재 상태를 확인합니다.

요약

BIND는 DNS 서버 소프트웨어로, named.rfc1912.zones와 named.conf 파일을 통해 도메인 존과 DNS 서버 설정을 구성합니다.

도메인 존 파일은 특정 도메인에 대한 DNS 레코드를 정의하며, named 서비스는 BIND의 DNS 서버 데몬으로, DNS 요청을 처리하고 응답합니다.

이 모든 요소들이 결합되어 DNS 서버의 기능을 수행하며, 도메인 이름과 IP 주소 간의 변환을 가능하게 합니다.


IP 고정

Hyper-V에서 네트워크 스위치를 설정하고 고정 IP를 할당한다.

1. 관리자 권한으로 파워쉘을 실행하여 다음 명령어를 입력한다:

   New-VMSwitch -SwitchName "MySwitch" -SwitchType Internal
   Get-VMSwitch
   Get-NetAdapter
   New-NetIPAddress -IPAddress 10.10.0.1 -PrefixLength 16 -InterfaceAlias "vEthernet (MySwitch)"
   Get-NetIPAddress
   New-NetNat -Name "NATNetwork" -InternalIPInterfaceAddressPrefix "10.10.0.0/16"

 

2. 이후, 네트워크 변경 및 아이피 정보를 고정으로 수정하기 위해 다음 명령어를 실행한다:

   dnf install hyperv-* -y && reboot
   hostnamectl set-hostname dns.example.com
   nmtui

Podman 설정 및 컨테이너 실행

1. Podman Pod 생성 및 컨테이너 추가

1.Pod를 생성한다:

   podman pod create --publish 18080:80 --publish 28080:8080 --name pod-web-service
  • --publish 18080:80: 호스트의 포트 18080을 Pod 내 컨테이너의 포트 80으로 매핑한다.
  • --publish 28080:8080: 호스트의 포트 28080을 Pod 내 컨테이너의 포트 8080으로 매핑한다.

 

2.MariaDB 컨테이너를 추가한다:

   podman run -d --rm --pod pod-web-service --name mariadb -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=wordpress -e MYSQL_DATABASE=wordpress quay.io/fedora/mariadb-105:latest
  • -d: 컨테이너를 백그라운드에서 실행한다.
  • --rm: 컨테이너 종료 시 자동으로 제거한다.
  • --pod pod-web-service: 지정된 Pod (pod-web-service) 내에서 컨테이너를 실행한다.
  • --name mariadb: 컨테이너 이름을 mariadb로 설정한다.
  • -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=wordpress -e MYSQL_DATABASE=wordpress: 환경 변수를 설정하여 MariaDB 데이터베이스 초기 설정을 구성한다.

 

3. WordPress 컨테이너를 추가한다:

   podman run -d --rm --pod pod-web-service --name wordpress quay.io/redhattraining/wordpress:5.3.0

 

4. HTTPD 컨테이너를 추가한다:

   podman run -d --rm --pod pod-web-service --name httpd quay.io/fedora/httpd-24

 

5. CentOS 컨테이너를 추가하고 실행한다:

   podman run -d --rm --pod pod-web-service --name test-centos quay.io/centos/centos:stream9 sleep 10000
   podman exec -it test-centos bash
   cat /etc/hosts

2. Git 서버 설정

1.Gogs 이미지를 가져온다:

   podman pull docker.io/gogs/gogs

 

2.Gogs 서버를 실행한다:

   podman run -d -P --rm --name git-server gogs

 

3.웹 브라우저를 통해 Gogs에 접속한다:

   http://<서버 IP>:3000

도메인을 서버 IP 주소로 설정하고, 데이터베이스를 SQLite로 설정한다.

새 계정을 생성한 후 Spring Petclinic 프로젝트를 클론한다:

 

git clone https://github.com/tangt64/spring-petclinic
cd spring-petclinic
./mvnw clean package
java -jar target/*.jar

 


3. 이미지 보안 설정

1./etc/containers/registries.conf 파일을 열어 다음 내용을 추가한다:

registries.conf 파일은 컨테이너 이미지 레지스트리를 구성하는 설정 파일입니다.

이 파일은 Podman, Skopeo, Buildah 등과 같은 도구들이 컨테이너 이미지를 가져오거나(push), 가져올(pull) 때 어떤 레지스트리를 사용할지 정의합니다.

또한, 어떤 레지스트리를 신뢰할지(보안 설정)와 기본적으로 사용할 레지스트리를 설정할 수 있습니다.

   nano /etc/containers/registries.conf

   unqualified-search-registries = ["quay.io", "docker.io", "localhost:5000"]
   [[registry]]
   insecure = true
   location="localhost:5000"

 

이 예시에서:

  • unqualified-search-registries는 이미지 이름에 레지스트리를 명시하지 않았을 때 기본적으로 검색할 레지스트리 목록을 정의합니다.
  • [[registry]] 블록은 특정 레지스트리에 대한 설정을 정의합니다. insecure = true는 해당 레지스트리에 대해 TLS 인증을 무시하고, location = "localhost:5000"은 레지스트리의 위치를 나타냅니다.

 

수정하는 이유:

  • 특정 레지스트리를 신뢰할 수 없는(보안 인증서가 없는) 상황에서 사용하기 위해 insecure 옵션을 설정합니다.
  • 기본적으로 검색할 레지스트리를 정의하여, 이미지 이름에 레지스트리를 명시하지 않아도 이미지 검색이 가능하게 합니다.
  • 사설 레지스트리를 설정하여 로컬에서 이미지를 저장하고 관리할 수 있게 합니다.

4. Docker Registry 설정

Docker Registry란?

Docker Registry는 Docker 이미지의 저장소 역할을 하는 서비스입니다.

Docker 이미지를 저장하고 관리하며, 필요할 때 이미지를 가져올 수 있는 저장소입니다.

Docker Hub는 공개 Docker 레지스트리의 대표적인 예시입니다.

사용자는 자신만의 사설 Docker 레지스트리를 설정하여 조직 내에서 이미지를 공유할 수 있습니다.

Docker Registry의 역할:

  • 이미지 저장: 빌드된 Docker 이미지를 저장합니다.
  • 이미지 배포: 저장된 Docker 이미지를 필요할 때 가져와서 사용할 수 있도록 배포합니다.
  • 버전 관리: 동일한 애플리케이션의 여러 버전 이미지를 관리합니다.

1.Docker Registry 컨테이너를 실행한다:

   podman run -d --name docker-registry --rm -p 5000:5000 docker.io/library/registry:latest

이 명령어는 Docker Registry 컨테이너를 실행하며, 로컬 포트 5000을 컨테이너의 포트 5000에 매핑합니다.

 

2.불필요한 이미지를 제거하고 레지스트리에 태그를 추가한다:

   podman rmi quay.io/redhattraining/wordpress:latest
   podman tag docker.io/library/registry:latest localhost:5000/tang/docker-registry:v1
   podman push --tls-verify=false localhost:5000/tang/docker-registry:v1

두번째 줄 명령어는 docker.io/library/registry:latest 이미지를 localhost:5000/tang/docker-registry:v1로 태그를 변경합니다.

 

3.레지스트리에 저장된 이미지의 태그를 확인한다:

   skopeo list-tags --tls-verify=false docker://localhost:5000/tang/docker-registry

이 명령어는 localhost:5000/tang/docker-registry 레지스트리에 저장된 이미지의 모든 태그 목록을 보여줍니다.

 

태그란?

태그(tag)는 컨테이너 이미지의 특정 버전을 식별하는 라벨입니다.

하나의 이미지에 여러 개의 태그를 부여하여 버전을 관리할 수 있습니다.

예를 들어, nginx:latest와 nginx:1.19.6은 Nginx 이미지의 서로 다른 버전을 가리킵니다.

 

태그의 역할:

  • 버전 관리: 동일한 애플리케이션의 여러 버전을 식별하고 관리할 수 있습니다.
  • 이미지 업데이트: 특정 태그를 통해 최신 버전의 이미지를 가져올 수 있습니다.
  • 배포 전략: 특정 버전의 이미지를 배포하고 관리할 수 있습니다.

 

요약

  • registries.conf 파일은 컨테이너 이미지 레지스트리를 구성하는 설정 파일로, 신뢰할 레지스트리와 기본 레지스트리를 정의합니다.
  • Docker Registry는 컨테이너 이미지를 저장하고 관리하는 서비스입니다.
  • 태그는 컨테이너 이미지의 특정 버전을 식별하는 라벨로, 이미지의 버전 관리와 배포에 사용됩니다.

이러한 요소들은 모두 컨테이너 이미지를 효율적으로 관리하고 배포하는 데 중요한 역할을 합니다.


Maven 프로젝트 빌드 및 배포

Spring Petclinic 애플리케이션을 설정하고 빌드하는 과정이다.

1.프로젝트를 클론하고 패키징한다:

   git clone https://github.com/tangt64/spring-petclinic
   cd spring-petclinic
   ./mvnw clean package
   java -jar target/*.jar

컨테이너 이미지 빌드 및 배포

Podman을 사용한 이미지 빌드

1.프로젝트 디렉터리로 이동하여 Dockerfile을 작성한다:

   FROM openjdk:11-jre-slim
   COPY target/*.jar /app.jar
   ENTRYPOINT ["java", "-jar", "/app.jar"]

 

2.Podman을 사용하여 이미지를 빌드한다:

   podman build -t localhost:5000/tang/spring-petclinic:v1 .
  • build -t localhost:5000/tang/spring-petclinic:v1 .: 현재 디렉터리(.)에 있는 Dockerfile을 사용하여 이미지를 빌드하고, localhost:5000/tang/spring-petclinic:v1이라는 태그를 붙인다.

 

3.빌드한 이미지를 로컬 Docker 레지스트리로 푸시한다:

   podman push localhost:5000/tang/spring-petclinic:v1

 

4.레지스트리에 저장된 이미지의 태그를 확인한다:

   skopeo list-tags --tls-verify=false docker://localhost:5000/tang/spring-petclinic

 

5.빌드한 이미지를 기반으로 컨테이너를 실행한다:

   podman run -d -p 8088:8080 --rm --name petclinic localhost:5000/tang/spring-petclinic:v1
  • -d: 백그라운드에서 실행
  • -p 8088:8080: 호스트의 포트 8088을 컨테이너의 포트 8080에 매핑
  • --rm: 컨테이너 종료 시 자동으로 제거
  • --name petclinic: 컨테이너 이름을 petclinic으로 설정

이제 웹 브라우저에서 http://<서버 IP>:8088로 접속하여 Spring Petclinic 애플리케이션에 접근할 수 있다.


컨테이너와 볼륨 관리

볼륨 생성 및 사용

컨테이너에서 데이터를 영구적으로 저장하기 위해 볼륨을 사용한다.

 

1.볼륨을 생성한다:

   podman volume create gogs-data
   podman volume create gogs-backup

 

2.컨테이너 실행 시 볼륨을 마운트한다:

   podman run -d --rm --name test-gogs -v gogs-backup:/backup -v gogs-data:/data gogs/gogs

 

3.볼륨 데이터를 확인한다:

   ls -l /var/lib/containers/storage/volumes/gogs-backup/_data

 


YAML 파일을 통한 Kubernetes 설정

Podman 컨테이너를 Kubernetes YAML 파일로 생성하고 이를 사용하여 Kubernetes 클러스터에서 컨테이너를 실행할 수 있다.

 

1.Kube YAML 파일을 생성한다:

   podman generate kube petclinic --filename petclinic-v1.yaml

 

2.YAML 파일을 사용하여 Podman Kube를 실행한다:

   podman kube play petclinic-v1.yaml

 

3.실행 중인 Kube를 중단한다:

   podman kube down petclinic-v1.yaml

 

요약

Podman을 사용하여 컨테이너를 관리하고, 네트워크와 포트 설정을 통해 효율적인 환경을 구성할 수 있다.

이 과정에서 Gogs와 Docker Registry를 활용하여 소스 코드 관리와 이미지 배포를 수행하며, 볼륨을 통해 데이터를 영구적으로 저장할 수 있다.

YAML 파일을 통해 Kubernetes 설정을 생성하고 실행하여 복잡한 컨테이너 환경을 쉽게 관리할 수 있다.


YAML 파일이란?

YAML (YAML Ain't Markup Language)은 인간이 읽기 쉬운 데이터 직렬화 형식으로, 주로 설정 파일과 데이터 저장에 사용된다.

YAML 파일은 들여쓰기와 간단한 문법을 사용하여 데이터 구조를 표현하며, JSON, XML과 같은 다른 형식들보다 가독성이 뛰어나다.

YAML은 특히 구성 파일을 작성할 때 유용하다.

 

YAML 파일의 주요 특징

  • 가독성: YAML은 사람이 읽기 쉽고 쓰기 쉽게 설계되어 있어 구성 파일을 이해하고 수정하기가 용이하다.
  • 들여쓰기 기반 구조: YAML 파일은 들여쓰기를 통해 계층적 구조를 나타낸다. 들여쓰기는 공백이나 탭 문자를 사용할 수 있지만, 같은 문서를 작성할 때는 일관성을 유지해야 한다.
  • 키-값 쌍: YAML 파일은 키-값 쌍으로 데이터를 표현하며, 키와 값은 콜론(:)으로 구분된다.
  • 배열: 배열은 대시(-)를 사용하여 표현된다.

 

YAML 파일의 예시

간단한 YAML 파일 예시를 통해 구조를 이해해보자:

# YAML 파일 예시
application:
  name: "example-app"
  version: "1.0.0"
  environment: "production"
  components:
    database:
      type: "mysql"
      host: "localhost"
      port: 3306
    web:
      image: "nginx:latest"
      replicas: 3

위의 예시는 'example-app'이라는 애플리케이션의 구성을 나타낸다.

이 애플리케이션은 데이터베이스와 웹 서버로 구성되어 있으며, 각각의 구성 요소에 대한 설정이 포함되어 있다.

 

Kubernetes와 Podman에서의 YAML 파일 사용

YAML 파일은 Kubernetes와 Podman 같은 컨테이너 오케스트레이션 도구에서 자주 사용된다.

Kubernetes에서는 포드(Pod), 서비스(Service), 디플로이먼트(Deployment) 등의 리소스를 정의하기 위해 YAML 파일을 사용한다.

Podman에서도 유사하게 컨테이너 및 Pod 구성을 YAML 파일로 정의할 수 있다.

 

예를 들어, Kubernetes에서 포드(Pod)를 정의하는 YAML 파일은 다음과 같다:

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
    - name: nginx-container
      image: nginx:latest
      ports:
        - containerPort: 80

위의 YAML 파일은 'example-pod'라는 이름의 포드를 정의하며, 이 포드는 'nginx' 이미지를 사용하는 컨테이너를 포함하고 있다.

Podman에서도 컨테이너 구성을 YAML 파일로 정의하여 관리할 수 있다.

예를 들어, podman generate kube 명령을 사용하여 기존 컨테이너 구성을 YAML 파일로 내보낼 수 있다.

 

YAML 파일을 사용하는 이유

  1. 구조적 데이터 표현: YAML은 데이터의 계층적 구조를 명확하게 나타내며, 복잡한 데이터를 구조적으로 표현하기에 적합하다.
  2. 가독성: YAML은 인간이 읽기 쉬운 형태로 데이터를 표현하여, 구성 파일을 쉽게 이해하고 수정할 수 있게 한다.
  3. 범용성: YAML은 다양한 프로그래밍 언어와 도구에서 지원되며, JSON과 상호 변환이 가능하다.
  4. 확장성: YAML은 단순한 키-값 쌍에서부터 복잡한 배열 및 객체 구조까지 다양한 데이터 구조를 표현할 수 있다.

 

결론

YAML 파일은 구성 파일을 작성하고 데이터를 직렬화하는 데 있어 매우 유용한 형식이다.

특히 Kubernetes와 Podman 같은 컨테이너 오케스트레이션 도구에서는 리소스를 정의하고 관리하는 데 필수적으로 사용된다.

YAML의 가독성과 간결한 문법 덕분에 시스템 관리자와 개발자가 복잡한 구성 파일을 쉽게 작성하고 관리할 수 있다


Podman과 Kubernetes를 이용한 컨테이너 관리 및 CI/CD 환경 구축

이 다이어그램은 Podman을 사용하여 여러 컨테이너를 관리하고, Kubernetes 환경에서의 배포 및 CI/CD 인터페이스를 통해 개발과 운영을 효율화하는 과정을 설명합니다.

각 구성 요소와 연결 관계를 이해하기 쉽게 설명하겠습니다.


1. 기본 구성 요소

1.VM (Virtual Machine):

  • 사용자는 VM을 통해 개발 환경에 접속합니다.
  • VM은 사용자가 애플리케이션을 개발하고 테스트하는 데 사용됩니다.

2.Actor (사용자):

  • 개발자와 일반 사용자가 구분되어 있으며, 각각의 역할에 따라 시스템에 접근합니다.

2. Podman 환경

1. Podman:

  • Podman을 이용하여 여러 컨테이너를 하나의 그룹으로 묶어 관리합니다.
  • POD: 여러 컨테이너를 그룹으로 묶어주는 단위.
    • gogs: Git 저장소 관리 툴.
    • docker-registry: Docker 이미지 저장소.

2. Podman Pod:

  • 다양한 애플리케이션 컨테이너가 하나의 Pod 내에서 실행됩니다.
  • Pod 내의 컨테이너들은 네트워크와 스토리지를 공유합니다.
  • 각각의 컨테이너는 특정 역할을 수행합니다.

3. 도메인 구성

1.도메인 서버:

  • example.com, test.com, demo.io 등의 도메인 관리.
  • DNS 설정: 도메인 이름을 IP 주소에 매핑하여 네트워크 상의 자원을 식별합니다.

2.Podman 환경 내 도메인 설정:

  • gogs.example.com: Git 저장소 관리 툴에 접근하기 위한 도메인.
  • registry.example.com: Docker 이미지 저장소에 접근하기 위한 도메인.

4. Kubernetes 환경

1.Kubernetes:

  • Kubernetes를 통해 컨테이너 오케스트레이션을 관리합니다.
  • Control Node: 클러스터 관리 및 API 서버 역할.
  • Compute Node: 애플리케이션이 실제로 실행되는 노드.

2.CI/CD 인터페이스:

  • CI/CD 파이프라인: 지속적 통합 및 배포 과정을 자동화.
  • 개발 워크스테이션: CI/CD 인터페이스와 연결되어 있으며, Kubernetes 클러스터에서 빌드와 테스트를 수행합니다.

5. 네트워크 및 포트 설정

1. 포트 매핑:

  • 80: 웹 서버(HTTP) 포트.
  • 5000: Docker 레지스트리 포트.
  • 8100: Gogs 서버 포트.
  • 8200: Spring Petclinic 애플리케이션 포트.
  • 8300: PHP 애플리케이션 포트.

2. 네트워크 설정:

  • 내부 네트워크를 통해 컨테이너들 간의 통신이 이루어지며, 외부 네트워크를 통해 사용자가 접근합니다.

6. CI/CD 파이프라인

1.컨테이너 빌드 및 테스트:

  • 개발 워크스테이션에서 컨테이너 이미지를 빌드하고 테스트합니다.
  • 성공적으로 빌드된 이미지는 Docker 레지스트리로 푸시됩니다.

2. 배포:

  • Kubernetes 클러스터에 애플리케이션이 배포됩니다.
  • CI/CD 인터페이스를 통해 자동으로 배포 및 관리가 이루어집니다.

요약

이 다이어그램은 Podman을 이용한 컨테이너 관리, 도메인 설정, 그리고 Kubernetes 환경에서의 CI/CD 구축 과정을 시각적으로 설명합니다.

각 구성 요소는 네트워크와 포트 설정을 통해 서로 연결되며, 개발과 배포 과정이 효율적으로 이루어지도록 구성되었습니다.

개발자는 VM을 통해 환경에 접근하여 애플리케이션을 개발하고, 테스트 및 배포 과정은 자동화된 CI/CD 파이프라인을 통해 관리됩니다.


 

Podman을 사용한 서비스 구성과 관리

이번 포스팅에서는 Podman을 사용하여 컨테이너 기반의 서비스를 구성하고 관리하는 방법을 다룬다.

주요 작업으로는 볼륨과 컨테이너 관리, 로컬 레지스트리 설정, 여러 애플리케이션을 포함한 Pod 생성 및 실행, 그리고 도메인 네임 시스템(DNS) 설정이 포함된다.

1. 서비스 구성 준비

1.1 볼륨과 컨테이너 목록 확인

먼저, 현재 시스템에 설정된 볼륨과 모든 컨테이너를 확인했다.

podman volume ls
podman container ls --all

 

1.2 기존 Gogs 컨테이너 시작

기존에 설정된 Gogs 컨테이너를 시작했다.

podman start test-gogs

 

1.3 Docker Registry와 Gogs 컨테이너 실행

새로운 Docker Registry와 Gogs 컨테이너를 실행했다.

podman run -d --name docker-registry -p 5000:5000 -v registry-data:/var/lib/registry registry
podman run -d --rm --name gogs -v gogs-backup:/backup -v gogs-data:/data gogs

 

1.4 Gogs 컨테이너 이름 변경

기존 Gogs 컨테이너의 이름을 변경했다.

podman container rename test-gogs gogs

 

2. 이미지 로컬 레지스트리 업로드

여러 이미지를 로컬 레지스트리에 업로드했다. 각 이미지는 지정된 포트와 Pod에 연결되었다.

  • gogs (8100 -> 80, pod-gogs, pod-infra)
  • docker-registry (5000 -> 5000, pod-infra)
  • spring-petclinic (8200 -> 8080, pod-infra)
  • php-ip (8300 -> 80, pod-php-ip)
  • wordpress+mariadb (80 -> 80, 3306 -> 3306, pod-wordpress)

 

3. Pod 생성 및 컨테이너 실행

3.1 pod-infra 생성 및 컨테이너 추가

pod-infra라는 이름으로 새로운 Pod를 생성하고, Docker Registry, Spring Petclinic, Gogs 컨테이너를 추가했다.

podman pod create --name pod-infra --publish 8100:3000 --publish 5000:5000 --publish 8200:8080
podman run -d --name registry --pod pod-infra docker.io/library/registry
podman run -d --name petclinic --pod pod-infra 10.10.0.20:5000/tang/spring-petclinic:v1
podman run -d --name gogs --pod pod-infra docker.io/gogs/gogs

 

3.2 pod-php-ip 생성 및 컨테이너 추가

pod-php-ip라는 이름으로 새로운 Pod를 생성하고, php-ip 컨테이너를 추가했다.

podman pod create --name pod-php-ip --publish 8300:80
podman run -d --name php-ip --pod pod-php-ip localhost:5000/tang/php-app:v1

 

3.3 pod-wordpress 생성 및 컨테이너 추가

pod-wordpress라는 이름으로 새로운 Pod를 생성하고, WordPress와 MariaDB 컨테이너를 추가했다.

podman pod create --name pod-wordpress --publish 80:80
podman run -d --name wordpress --pod pod-wordpress quay.io/redhattraining/wordpress:5.3.0
podman run -d --name mariadb --pod pod-wordpress quay.io/fedora/mariadb-105

 

3.4 로컬 레지스트리 확인

로컬 레지스트리의 내용을 확인했다.

curl 10.10.0.20:5000/v2/_catalog

 

출력 결과:

{"repositories":["tang/pet-clinic","tang/php-app","tang/registry"]}

 

4. Spring Petclinic 이미지 빌드 및 푸시

Spring Petclinic 애플리케이션 이미지를 빌드하고 로컬 레지스트리에 푸시했다.

4.1 이미지 빌드

cd /root/spring-petclinic
buildah bud -t 10.10.0.20:5000/tang/spring-petclinic:v1 .

이미지 목록을 확인했다.

buildah images

출력 결과:

10.10.0.20:5000/tang/spring-petclinic

 

4.2 이미지 푸시

podman push 10.10.0.20:5000/tang/spring-petclinic:v1 docker://10.10.0.20:5000/tang/spring-petclinic:v1

로컬 레지스트리의 내용을 다시 확인했다.

curl 10.10.0.20:5000/v2/_catalog

출력 결과:

{"repositories":["tang/pet-clinic","tang/php-app","tang/registry","tang/spring-petclinic"]}

 

5. DNS 설정

5.1 도메인 존 파일 생성 및 설정

도메인 존 파일을 생성하고 example.com 도메인 정보를 설정했다.

cd /var/named
cp apple.com.zone example.com.zone

vi example.com.zone

 

example.com.zone 파일 내용:

$TTL    7200
example.com.              IN      SOA     dns1.example.com. admin.example.com. (
                                        2024071901      ; Serial
                                        7200            ; Refresh
                                        3600            ; Retry
                                        604800          ; Expire
                                        7200)           ; NegativeCacheTTL

                        IN      NS      dns1.example.com.

example.com.            IN      A       10.10.0.20
www                     IN      CNAME   example.com.
dns1                    IN      A       10.10.0.10

 

5.2 named.rfc1912.zones 파일 수정

새로운 존 정보를 추가했다.

vi /etc/named.rfc1912.zones

 

수정된 내용:

zone "example.com" IN {
        type master;
        file "example.com.zone";
        allow-update { none; };
};

 

5.3 named 서비스 재시작

변경 사항을 적용하기 위해 named 서비스를 재시작했다.

systemctl restart named

 

6. node1 설정

6.1 모든 컨테이너 중지 및 제거

node1에서 모든 컨테이너를 중지하고 제거했다.

podman stop container --all
podman rm --all

 

6.2 Apache HTTP 서버 설치 및 시작

Apache HTTP 서버를 설치하고 시작했다.

dnf install httpd -y
systemctl start httpd

 

6.3 웹 브라우저에서 확인

브라우저에서 http://example.com을 열어 설정이 올바르게 되었는지 확인했다.

 

이번 포스팅에서는 Podman을 사용하여 다양한 서비스를 설정하고 관리하는 방법을 다뤘다.

Pod와 컨테이너를 사용하여 애플리케이션을 효율적으로 배포하고 관리할 수 있으며, DNS 설정을 통해 도메인 네임을 관리하는 방법도 배웠다.


네트워크 설정 - DNS 및 노드 구성

DNS 및 노드 1과 2에 대한 네트워크 설정 과정을 자세히 설명하겠습니다. 아래 이미지들을 참조하여 단계별로 설명합니다.

1.1 네트워크 어댑터 추가

먼저, Hyper-V 관리자에서 네트워크 어댑터를 추가합니다.

  1. Hyper-V 관리 콘솔을 엽니다.
  2. 설정할 가상 머신을 선택하고, 오른쪽 클릭하여 설정을 선택합니다.
  3. 설정 메뉴에서 하드웨어 추가를 선택한 후 네트워크 어댑터를 선택하고 추가 버튼을 클릭합니다.
  1. 추가된 네트워크 어댑터를 internal 네트워크로 설정합니다.

1.2 네트워크 어댑터 설정

추가된 네트워크 어댑터의 설정을 변경합니다.

  1. 설정 메뉴에서 네트워크 어댑터를 선택합니다.
  2. 네트워크 섹션에서 MySwitch로 설정합니다.

2.1 nmtui 실행

네트워크 설정을 위해 nmtui 도구를 실행합니다.

nmtui

2.2 네트워크 프로필 편집

Edit Connection을 선택한 후, 편집할 네트워크 프로필(예: eth0)을 선택합니다.

여기서 IPv4 CONFIGURATION을 Manual로 설정하고 다음과 같이 설정합니다:

  • Address: 10.10.0.30/24
  • Gateway: 10.10.0.1
  • DNS servers: 10.10.0.10, 8.8.8.8

2.3 네트워크 설정 확인 및 적용

nmcli 명령어를 사용하여 설정을 적용하고 확인합니다.

nmcli con up eth1
ip a s eth1

 

3. IP 주소 변경 방법

이 과정은 로컬 IP 주소를 변경하고 설정을 적용하는 방법을 설명합니다.

3.1 nmtui를 통해 IP 설정 변경

먼저, nmtui를 사용하여 IP 주소를 설정합니다.

nmtui edit eth0

3.2 nmcli를 통해 설정 적용

IP 주소를 설정한 후 nmcli 명령어로 적용합니다.

nmcli con up eth0

 

3.3 네트워크 인터페이스 확인 및 테스트

설정이 올바르게 적용되었는지 확인합니다.

ip a s eth0
ping 8.8.8.8

 

4. Hyper-V 네트워크 스위치 설정

Windows 환경에서 Hyper-V 네트워크 스위치를 설정하는 방법입니다.

4.1 Hyper-V 스위치 생성

Hyper-V 관리자에서 MySwitch라는 이름의 가상 스위치를 생성합니다.

4.2 네트워크 어댑터 설정

Hyper-V에서 생성한 가상 스위치를 네트워크 어댑터에 연결합니다.

4.3 네트워크 어댑터 속성 설정

네트워크 어댑터의 속성을 설정하여 IP 주소와 DNS 서버를 지정합니다.

  • IP 주소: 10.10.0.1
  • 서브넷 마스크: 255.255.0.0
  • 기본 게이트웨이: 10.10.0.1
  • DNS 서버: 10.10.0.10, 8.8.8.8

5. 네트워크 연결 확인

설정된 네트워크 연결을 확인하고 테스트하는 단계입니다.

5.1 IP 주소 확인

설정된 IP 주소를 확인합니다.

ip a s eth0

5.2 DNS 서버 설정 확인

DNS 서버 설정을 확인합니다.

cat /etc/resolv.conf

5.3 네트워크 연결 테스트

외부 네트워크와의 연결을 테스트합니다.

ping 8.8.8.8

nmtui와 nmcli란?

nmtui

nmtui는 NetworkManager의 터미널 기반 사용자 인터페이스(TUI)입니다. 이 도구는 텍스트 기반의 인터페이스를 제공하여 사용자가 GUI 없이 네트워크 설정을 쉽게 구성할 수 있게 합니다.

  • 사용법:
    • nmtui 명령어를 입력하면 인터페이스가 열리며, 여기서 네트워크 연결을 편집, 추가, 삭제할 수 있습니다.
    • 메뉴를 통해 IPv4/IPv6 설정, DNS 설정 등을 쉽게 수정할 수 있습니다.

nmcli

nmcli는 NetworkManager의 명령줄 인터페이스(CLI)입니다. 이 도구를 사용하면 네트워크 연결을 관리하고, 구성하고, 문제를 해결할 수 있습니다.

  • 사용법:
    • nmcli 명령어는 다양한 옵션을 제공하여 네트워크 상태 확인, 연결 설정, 연결 활성화/비활성화 등을 수행할 수 있습니다.
    • 예를 들어, nmcli con up eth0은 eth0 인터페이스를 활성화하는 명령어입니다.

고정 IP를 할당하는 이유

고정 IP 주소(Static IP Address)는 네트워크 장치에 고정된 IP 주소를 수동으로 할당하는 방식입니다. 이를 사용하는 주요 이유는 다음과 같습니다:

  1. 네트워크 안정성:
    • 고정 IP를 사용하면 네트워크 장치의 IP 주소가 변경되지 않으므로 네트워크 연결의 안정성이 보장됩니다.
    • DHCP(Dynamic Host Configuration Protocol)를 사용할 경우, 장치가 재부팅될 때마다 다른 IP 주소를 받을 수 있습니다. 이는 네트워크 서비스에 영향을 미칠 수 있습니다.
  2. 서버 설정:
    • 서버, 프린터, NAS(Network Attached Storage) 등 항상 동일한 IP 주소를 필요로 하는 장치에 적합합니다.
    • 예를 들어, DNS 서버, 웹 서버, 파일 서버 등은 고정 IP 주소를 사용해야 클라이언트가 항상 동일한 주소로 접근할 수 있습니다.
  3. 포트 포워딩 및 방화벽 설정:
    • 고정 IP 주소를 사용하면 라우터나 방화벽에서 특정 장치로의 포트 포워딩 규칙을 설정할 때 유리합니다.
    • 예를 들어, 특정 서버로 들어오는 트래픽을 특정 포트로 포워딩할 때, 해당 서버의 IP 주소가 변하지 않아야 합니다.
  4. 네트워크 관리 용이성:
    • 네트워크 관리자는 고정 IP를 사용하여 네트워크 장치를 쉽게 식별하고 관리할 수 있습니다.
    • 장치의 IP 주소가 고정되어 있어 네트워크 모니터링 및 문제 해결이 용이합니다.

 

요약

이번 설치 진행 과정에서는 다양한 네트워크 설정 방법을 다루었습니다.

nmtui와 nmcli를 사용하여 네트워크 설정을 수정하고, Hyper-V 환경에서 가상 스위치를 설정하여 고정 IP를 할당하는 방법을 설명했습니다.

또한, 설정된 네트워크를 확인하고 테스트하는 과정도 포함되었습니다.

이러한 과정을 통해 네트워크 환경을 효율적으로 관리하고 설정할 수 있습니다.

반응형