웹사이트 검색

RHEL 8에서 Podman 및 Skopeo를 사용하여 컨테이너를 관리하는 방법


과거에 개발자가 직면했던 과제 중 하나는 애플리케이션이 여러 컴퓨팅 환경에서 안정적으로 실행되도록 하는 것이었습니다. 종종 응용 프로그램이 예상대로 실행되지 않거나 오류가 발생하여 완전히 실패했습니다. 그리고 여기서 컨테이너라는 개념이 탄생했습니다.

컨테이너 이미지란 무엇입니까?

컨테이너 이미지는 격리된 환경에서 실행되는 실행 코드와 함께 제공되는 정적 파일입니다. 컨테이너 이미지는 애플리케이션이 다양한 환경에서 실행되는 데 필요한 시스템 라이브러리, 종속성 및 기타 플랫폼 설정으로 구성됩니다.

Red Hat Linux는 필요한 docker 명령을 사용하여 Linux 컨테이너에서 직접 작업하는 데 활용할 수 있는 유용한 컨테이너 도구 세트를 제공합니다. 여기에는 다음이 포함됩니다.

  • Podman – 루트 또는 루트리스 모드에서 OCI 컨테이너를 실행하고 관리하기 위한 데몬이 없는 컨테이너 엔진입니다. PodmanDocker와 유사하며 Docker가 데몬이라는 점을 제외하면 동일한 명령 옵션이 있습니다. Docker와 거의 동일한 방식으로 podman을 사용하여 컨테이너 이미지를 가져오고 실행하고 관리할 수 있습니다. Podman은 다양한 고급 기능을 제공하고 시스템과 완벽하게 통합되며 루트 사용자가 필요 없이 컨테이너 실행을 포함하는 사용자 네임스페이스 지원을 제공합니다.
  • Skopeo: 한 레지스트리에서 다른 레지스트리로 컨테이너 이미지를 복사하는 데 사용되는 명령줄 도구입니다. Skopeo를 사용하면 특정 호스트 간에 이미지를 복사할 수 있을 뿐만 아니라 다른 컨테이너 레지스트리 또는 환경에 이미지를 복사할 수도 있습니다. 이미지 복사 외에도 다양한 레지스트리의 이미지를 검사하고 서명을 사용하여 이미지를 생성 및 확인할 수 있습니다.
  • Buildah: Docker 파일을 사용하여 컨테이너 OCI 이미지를 생성하고 관리하는 데 사용되는 명령줄 도구 세트입니다.

이 문서에서는 podmanSkopeo를 사용하여 컨테이너를 관리하는 방법에 중점을 둘 것입니다.

원격 레지스트리에서 컨테이너 이미지 검색

podman 검색 명령을 사용하면 선택한 원격 레지스트리에서 컨테이너 이미지를 검색할 수 있습니다. 레지스트리의 기본 목록은 /etc/containers/ 디렉토리에 있는 registries.conf 파일에 정의되어 있습니다.

레지스트리는 3개의 섹션으로 정의됩니다.

  • [registries.search] – 이 섹션에서는 podman이 컨테이너 이미지를 검색할 수 있는 기본 레지스트리를 지정합니다. registry.access.redhat.com, registry.redhat.io,docker.io 레지스트리에서 요청된 이미지를 검색합니다.

  • [registries.insecure] – 이 섹션에서는 TLS 암호화를 구현하지 않는 레지스트리, 즉 안전하지 않은 레지스트리를 지정합니다. 기본적으로 항목이 지정되지 않습니다.

  • [registries.block] – 로컬 시스템에서 지정된 레지스트리에 대한 액세스를 차단하거나 거부합니다. 기본적으로 항목이 지정되지 않습니다.

podman 명령을 실행하는 일반(루트가 아닌) 사용자로서 홈 디렉터리($HOME/.config)에 자신만의 registries.conf 파일을 정의할 수 있습니다. /containers/registries.conf) 시스템 전체 설정을 재정의합니다.

레지스트리 지정 시 규칙

레지스트리를 지정할 때 다음 사항에 유의하세요.

  • 모든 레지스트리는 작은따옴표로 묶어야 합니다.
  • 호스트 이름이나 IP 주소를 사용하여 레지스트리를 지정할 수 있습니다.
  • 여러 레지스트리를 지정하는 경우 쉼표로 구분해야 합니다.
  • 레지스트리가 비표준 포트(보안의 경우 TCP 포트 443, 비보안의 경우 80)를 사용하는 경우 포트 번호를 레지스트리 이름과 함께 지정해야 합니다. registry.example.com:5566.

구문을 사용하여 레지스트리에서 컨테이너 이미지를 검색하려면 다음 안내를 따르세요.

podman search registry/container_image

예를 들어 registry.redhat.io 레지스트리에서 Redis 이미지를 검색하려면 다음 명령을 호출합니다.

podman search registry.redhat.io/redis

MariaDB 컨테이너 이미지를 검색하려면 실행하세요.

podman search registry.redhat.io/mariadb

컨테이너 이미지에 대한 자세한 설명을 얻으려면 얻은 결과에서 컨테이너 이미지 이름 앞에 --no-trunc 옵션을 사용하십시오. 예를 들어 다음과 같이 MariaDB 컨테이너 이미지에 대한 자세한 설명을 얻으려고 노력할 것입니다.

podman search --no-trunc registry.redhat.io/rhel8/mariadb-103

컨테이너 이미지 가져오기

원격 레지스트리에서 컨테이너 이미지를 가져오거나 검색하려면 다른 것보다 먼저 인증해야 합니다. 예를 들어 MariaDB 컨테이너 이미지를 검색하려면 먼저 Redhat 레지스트리에 로그인합니다.

podman login

사용자 이름과 비밀번호를 입력하고 키보드에서 'ENTER'를 누르세요. 모든 과정이 순조롭게 진행되면 레지스트리 로그인에 성공했다는 확인 메시지가 표시됩니다.

Login Succeeded!

이제 표시된 구문을 사용하여 이미지를 가져올 수 있습니다.

podman pull <registry>[:<port>]/[<namespace>/]<name>:<tag>

<registry>는 TCP <port>에서 컨테이너 이미지 저장소를 제공하는 원격 호스트 또는 레지스트리를 나타냅니다. <namespace><name>는 레지스트리의 <namespace>를 기반으로 컨테이너 이미지를 집합적으로 지정합니다. 마지막으로 <tag> 옵션은 컨테이너 이미지의 버전을 지정합니다. 아무것도 지정하지 않으면 기본 태그인 최신 태그가 사용됩니다.

암호화를 제공하고 익명 사용자가 임의의 이름으로 계정을 생성하는 것을 허용하지 않는 신뢰할 수 있는 레지스트리를 추가하는 것이 항상 권장됩니다.

MariaDB 이미지를 가져오려면 다음 명령을 실행합니다.

podman pull registry.redhat.io/rhel8/mariadb-103
  • <registry> – Registry.redhat.io
  • <네임스페이스> – rhel8
  • <코드><이름> – MariaDB
  • <코드><태그> – 103

후속 컨테이너 이미지 가져오기의 경우 이미 인증되었으므로 추가 로그인이 필요하지 않습니다. Redis 컨테이너 이미지를 가져오려면 다음을 실행하면 됩니다.

podman pull registry.redhat.io/rhscl/redis-5-rhel7

컨테이너 이미지 나열

이미지 가져오기가 완료되면 podman Images 명령을 실행하여 호스트에 현재 존재하는 이미지를 볼 수 있습니다.

podman images

컨테이너 이미지 검사

컨테이너를 실행하기 전에 항상 이미지를 조사하고 그 기능을 이해하는 것이 좋습니다. podmanspect 명령은 OS 및 아키텍처와 같은 컨테이너에 대한 메타데이터의 바다를 인쇄합니다.

이미지를 검사하려면 podmanspect 명령과 이미지 ID 또는 저장소를 차례로 실행하세요.

podman inspect IMAGE ID
OR
podman inspect REPOSITORY

아래 예에서는 MariaDB 컨테이너를 검사하고 있습니다.

podman inspect registry.redhat.io/rhel8/mariadb-103

컨테이너에 대한 특정 메타데이터를 가져오려면 --format 옵션 뒤에 메타데이터와 컨테이너 ID( 이미지 ID 또는 이름)를 전달합니다.

아래 예에서는 '라벨' 섹션에 속하는 RHEL 8 기본 컨테이너의 아키텍처 및 설명에 대한 정보를 검색합니다.

podman inspect --format=’{{.Labels.architecture}}’ image ID
podman inspect --format=’{{.Labels.description}}’ image ID

다른 레지스트리에서 원격 이미지를 검사하려면 skopeo Inspection 명령을 사용하세요. 아래 예에서는 Docker에 호스팅된 RHEL 8 초기화 이미지를 검사하고 있습니다.

skopeo inspect docker://registry.redhat.io/rhel8-beta/rhel-init

컨테이너 이미지에 태그 지정

이미 언급했듯이 이미지 이름은 일반적으로 본질적으로 일반적입니다. 예를 들어 redis 이미지에는 다음 라벨이 지정됩니다.

registry.redhat.io/rhscl/redis-5-rhel7

이미지에 태그를 지정하면 이미지에 포함된 내용을 더 잘 이해할 수 있도록 보다 직관적인 이름이 제공됩니다. podman 태그 명령을 사용하면 기본적으로 여러 부분으로 구성된 이미지 이름에 대한 별칭인 이미지 태그를 생성할 수 있습니다.

이것들은:

registry/username/NAME:tag

예를 들어, ID가 646f2730318c인 Redis 이미지의 일반 이름을 변경하려면 다음 명령을 실행합니다.

podman tag 646f2730318c myredis

끝에 태그를 추가하려면 전체 콜론과 태그 번호를 추가하세요.

podman tag 646f2730318c myredis:5.0

태그 번호를 추가하지 않으면 최신 속성만 할당됩니다.

컨테이너 이미지 실행

컨테이너를 실행하려면 podman run 명령을 사용하세요. 예를 들어:

podman run image_id

백그라운드에서 컨테이너를 데몬 서비스로 자동 실행하려면 표시된 대로 -d 옵션을 사용하세요.

podman run -d image_id

예를 들어, ID가 646f2730318credis 이미지를 실행하려면 다음 명령을 호출합니다.

podman run -d 646f2730318c

RHEL 8 기본 이미지와 같은 운영 체제 기반 컨테이너를 실행하는 경우 -it 지시어를 사용하여 셸에 액세스할 수 있습니다. -i 옵션은 대화형 세션을 생성하고 -t는 터미널 세션을 생성합니다. --name 옵션은 컨테이너 이름을 mybash로 설정하고 는 기본 이미지의 ecbc6f53bba0 이미지 ID를 설정합니다.

podman run -it --name=mybash ecbc6f53bba0

그런 다음에는 모든 셸 명령을 실행할 수 있습니다. 아래 예에서는 컨테이너 이미지의 OS 버전을 확인하고 있습니다.

cat /etc/os-release

컨테이너를 종료하려면 간단히 종료 명령을 호출하면 됩니다.

exit

컨테이너가 종료되면 자동으로 중지됩니다. 컨테이너를 다시 시작하려면 표시된 대로 -ai 플래그와 함께 podman start 명령을 사용하세요.

podman start -ai mybash

다시 한 번, 이를 통해 쉘에 액세스할 수 있습니다.

실행 중인 컨테이너 이미지 나열

현재 실행 중인 컨테이너를 나열하려면 표시된 대로 podman ps 명령을 사용합니다.

podman ps

실행 후 종료된 컨테이너를 포함하여 모든 컨테이너를 보려면 다음 명령을 사용하십시오.

podman ps -a

Systemd 서비스에서 자동 시작되도록 컨테이너 이미지 구성

이 섹션에서는 RHEL 시스템에서 systemd 서비스로 직접 실행되도록 컨테이너를 구성하는 방법에 중점을 둡니다.

먼저, 원하는 이미지를 얻으세요. 이 경우 Docker 허브에서 Redis 이미지를 가져왔습니다.

podman pull docker.io/redis

시스템에서 SELinux를 실행 중인 경우 systemd로 컨테이너를 실행하려면 container_manage_cgroup 부울을 활성화해야 합니다.

setsebool -p container_manage_cgroup on

그런 다음 백그라운드에서 컨테이너 이미지를 실행하고 원하는 이미지 이름에 할당합니다. 이 예에서는 이미지 이름을 redis_server로 지정하고 컨테이너의 포트 6379RHEL 8 호스트에 매핑했습니다.

podman run -d --name redis_server -p 6379:6379 redis

다음으로 /etc/systemd/system/ 디렉토리에 Redis용 systemd 장치 구성 파일을 생성하겠습니다.

vim /etc/systemd/system/redis-container.service

아래 내용을 파일에 붙여넣으세요.

[Unit]
Description=Redis container

[Service]
Restart=always
ExecStart=/usr/bin/podman start -a redis_server
ExecStop=/usr/bin/podman stop -t 2 redis_server

[Install]
WantedBy=local.target

파일을 저장하고 종료합니다.

다음으로, 부팅 시 자동으로 시작되도록 컨테이너를 구성합니다.

systemctl enable redis-container.service

다음으로 컨테이너를 시작하고 실행 상태를 확인합니다.

systemctl start redis-container.service
systemctl status redis-container.service

컨테이너 이미지에 대한 영구 스토리지 구성

컨테이너를 실행할 때 호스트에 영구 외부 스토리지를 구성하는 것이 좋습니다. 이는 컨테이너가 충돌하거나 실수로 제거되는 경우를 대비하여 백업을 제공합니다.

데이터를 유지하기 위해 호스트에 있는 디렉터리를 컨테이너 내부 디렉터리에 매핑하겠습니다.

podman run --privileged -it -v /var/lib/containers/backup_storage:/mnt registry.redhat.io/ubi8/ubi /bin/bash

SELinux가 적용으로 설정된 경우 --privileged 옵션이 전달됩니다. -v 옵션은 호스트에 있는 외부 볼륨을 지정합니다. 여기서 컨테이너 볼륨은 /mnt 디렉터리입니다.

셸에 액세스한 후에는 표시된 대로 /mnt 디렉터리에 샘플 파일 testing.txt를 생성하겠습니다.

echo "This tests persistent external storage" > /mnt/testing.txt

그런 다음 컨테이너를 종료하고 파일이 호스트에 있는 외부 저장소에 있는지 확인합니다.

exit
cat /var/lib/containers/backup_storage/testing.txt

출력영구 외부 저장소를 테스트합니다.

컨테이너 중지 및 제거

컨테이너 실행이 완료되면 podman stop 명령과 podman ps<에서 얻을 수 있는 container-id를 사용하여 컨테이너를 중지할 수 있습니다. /강하게> 명령.

podman stop container-id

더 이상 필요하지 않은 컨테이너를 제거하려면 먼저 컨테이너를 중지한 다음 podman rm 명령과 컨테이너 ID 또는 이름을 옵션으로 호출하십시오.

podman rm container-id

하나의 명령으로 여러 컨테이너를 한 번에 제거하려면 컨테이너 id를 공백으로 구분하여 지정하세요.

podman rm container-id-1 container-id-2 container-id-3

모든 컨테이너를 지우려면 다음 명령을 실행하십시오.

podman rm -a

이미지 제거

이미지를 제거하려면 먼저 이전 하위 주제에서 설명한 대로 이미지에서 생성된 모든 컨테이너가 중지되고 제거되었는지 확인하십시오.

다음으로, 표시된 대로 podman -rmi 명령과 이미지 ID를 차례로 실행합니다.

podman -rmi image-id

결론

이것으로 RHEL 8의 컨테이너 관리 및 작업에 관한 이 장을 마무리합니다. 이 가이드가 컨테이너에 대한 적절한 이해와 podmanSkopeo를 사용하여 RHEL 시스템에서 컨테이너를 상호 작용하고 관리하는 방법을 제공했기를 바랍니다.