웹사이트 검색

Podman을 설치하고 사용하여 Rocky Linux 8에서 컨테이너를 실행하는 방법


이 튜토리얼은 다음 OS 버전에 대해 존재합니다.

  • 록키 리눅스 8.4
  • 록키 리눅스 8.4

이 페이지에서

  1. 전제 조건
  2. Podman 설치
  3. 컨테이너 이미지 검색 및 다운로드
  4. 컨테이너 실행\n
  5. 컨테이너 나열 및 중지
  6. 중지된 컨테이너 시작
  7. 컨테이너 삭제
  8. 컨테이너 죽이기
  9. 이미지 삭제
  10. 컨테이너 로그 보기
  11. 컨테이너 검사
  12. 컨테이너 셸 액세스
  13. 포드
  14. 결론

Podman은 Linux 환경에서 컨테이너 및 포드를 개발, 관리 및 배포하도록 구축된 무료 오픈 소스 컨테이너 플랫폼입니다. Redhat은 2018년에 Podman을 개발했습니다. Docker와 다르게 작동하는 컨테이너화 엔진입니다. Podman은 Docker CLI 및 Docker 데몬을 사용하는 Docker와 달리 데몬에 의존하지 않습니다. 데몬에 의존하면 단일 실패 지점이 발생합니다.

Podman은 OCI(Open Container Initiative) 표준에 따라 설계되어 Podman이 커널, 컨테이너 및 이미지와 직접 상호 작용할 수 있습니다. 또한 루트 액세스가 필요하지 않기 때문에 Docker보다 더 안전합니다. Podman은 둘 다 OCI와 호환되므로 Docker의 드롭인 대체품으로 사용할 수 있습니다.

이 기사에서는 Podman을 설치하고 이를 사용하여 이미지와 컨테이너를 만들고 관리하는 방법을 보여줍니다.

전제 조건

  1. A Rocky Linux based server

  2. A non-sudo user with root privileges.

  3. Ensure that the server is updated.

    $ sudo dnf update
    

Podman 설치

Podman은 Buildah 및 Skopeo와 함께 container-tools 모듈에 포함되어 있습니다. Rocky Linux 8용 AppStream 리포지토리에서도 사용할 수 있습니다. 모듈 방법을 사용하겠습니다.

dnf module 명령을 사용하여 Podman을 설치합니다.

$ sudo dnf module install container-tools

Podman 버전을 확인하여 올바르게 설치되었는지 확인하십시오.

$ podman --version
podman version 3.2.3

컨테이너 이미지 검색 및 다운로드

Nginx의 이미지를 검색하려면 다음 명령어를 사용하세요.

$ podman search nginx

출력에서 이미지가 있는 레지스트리의 이름과 이미지에 대한 설명을 볼 수 있습니다.

이미지를 다운로드하려면 다음 명령 중 하나를 사용하십시오.

$ podman pull docker.io/library/nginx

OR

$ podman pull nginx

다운로드한 이미지는 다음 명령어를 통해 확인할 수 있습니다.

$ podman images
REPOSITORY               TAG         IMAGE ID      CREATED     SIZE
docker.io/library/nginx  latest      f8f4ffc8092c  3 days ago  138 MB

컨테이너 실행

다음 명령을 사용하여 Nginx 이미지를 사용하여 컨테이너를 실행합니다. 컨테이너 이름을 webserver로 지정했습니다.

$ podman run -d --name webserver nginx 

동일한 이미지를 사용하여 이름이 다른 다른 컨테이너를 시작할 수 있습니다.

$ podman run -d --name webserver2 nginx

동일한 이미지를 사용하여 무제한의 컨테이너를 시작할 수 있습니다.

컨테이너 나열 및 중지

실행 중인 모든 컨테이너를 나열하려면 다음 명령을 사용하십시오.

$ podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED         STATUS             PORTS       NAMES
19b6668bc627  docker.io/library/nginx:latest  nginx -g daemon o...  31 seconds ago  Up 31 seconds ago              webserver
35a286ba5a55  docker.io/library/nginx:latest  nginx -g daemon o...  2 seconds ago   Up 3 seconds ago               webserver2

실행 중인 컨테이너를 중지합니다.

$ podman stop webserver
webserver

중지되었는지 확인합니다.

$ podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED             STATUS                 PORTS       NAMES
35a286ba5a55  docker.io/library/nginx:latest  nginx -g daemon o...  About a minute ago  Up About a minute ago              webserver2

중지된 컨테이너를 포함하여 모든 컨테이너를 나열하려면 -a 플래그를 사용해야 합니다.

$ podman ps -a
CONTAINER ID  IMAGE                           COMMAND               CREATED             STATUS                     PORTS       NAMES
19b6668bc627  docker.io/library/nginx:latest  nginx -g daemon o...  2 minutes ago       Exited (0) 35 seconds ago              webserver
35a286ba5a55  docker.io/library/nginx:latest  nginx -g daemon o...  About a minute ago  Up About a minute ago                  webserver2

중지된 컨테이너 시작

중지된 컨테이너를 시작하려면 다음 명령을 사용하십시오.

$ podman start webserver
webserver

시작되었는지 확인합니다.

$ podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED        STATUS             PORTS       NAMES
19b6668bc627  docker.io/library/nginx:latest  nginx -g daemon o...  3 minutes ago  Up 16 seconds ago              webserver
35a286ba5a55  docker.io/library/nginx:latest  nginx -g daemon o...  2 minutes ago  Up 2 minutes ago               webserver2

컨테이너 삭제

삭제하기 전에 컨테이너를 중지해야 합니다.

$ podman stop webserver2

컨테이너를 삭제합니다.

$ podman rm webserver2

--force 플래그를 사용하여 실행 중인 컨테이너를 삭제할 수 있습니다.

$ podman rm webserver2 --force
35a286ba5a553d5f88e3d9795780f893cfb58bf4a126c4912d1ec56b9d0e5a27

컨테이너 죽이기

컨테이너 중지 및 종료는 결국 동일한 결과를 얻는 서로 다른 두 가지 작업입니다. 차이점은 컨테이너를 중지하면 정상적으로 종료되지만 컨테이너를 강제로 종료하면 데이터가 손실된다는 것입니다.

다음 명령을 사용하여 컨테이너를 종료합니다.

$ podman kill -s 9 webserver2

위의 명령은 SIGNAL 9 (SIGKILL) 옵션을 사용하여 컨테이너를 종료합니다.

모든 컨테이너를 종료하려면 --all 또는 -a 플래그를 사용하고 최신 컨테이너만 종료하려면 --latest 또는 -l 플래그.

이미지 삭제

rmi 명령을 사용하여 이미지를 삭제할 수 있습니다.

$ podman rmi registry.redhat.io/rhel8/rsyslog

여러 이미지를 쉼표로 구분하여 삭제할 수 있습니다.

$ podman rmi registry.redhat.io/rhel8/rsyslog registry.redhat.io/ubi8/ubi

시스템에서 모든 이미지를 제거하려면 -a 플래그를 사용하십시오.

$ podman rmi -a

컨테이너 로그 보기

컨테이너 로그를 보려면 다음 명령을 사용하십시오.

$ podman logs webserver
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
......

--tail 옵션을 사용하여 로그를 마지막 5줄로 제한할 수 있습니다.

$ podman logs --tail=5 webserver
2021/10/05 10:13:52 [notice] 1#1: built by gcc 8.3.0 (Debian 8.3.0-6)
2021/10/05 10:13:52 [notice] 1#1: OS: Linux 4.18.0-305.19.1.el8_4.x86_64
2021/10/05 10:13:52 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 262144:262144
2021/10/05 10:13:52 [notice] 1#1: start worker processes
2021/10/05 10:13:52 [notice] 1#1: start worker process 23

기본적으로 로그에는 타임스탬프가 표시되지 않습니다. 로그에 타임스탬프를 추가하려면 -t 플래그를 사용하세요.

$ podman logs -t webserver
2021-10-05T09:25:02.026967459Z /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
2021-10-05T09:25:02.026967459Z /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
2021-10-05T09:25:02.033956297Z /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
2021-10-05T09:25:02.043751152Z 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
2021-10-05T09:25:02.064561317Z 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
.....

컨테이너 검사

컨테이너를 검사하면 컨테이너에 대한 정보가 인쇄됩니다.

$ podman inspect webserver
[
    {
        "Id": "19b6668bc6278a66b3ffc98ae1515af25f5bebcd20bf26de803cae41c4485f59",
        "Created": "2021-10-05T09:25:01.784949744Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
        ],
        "State": {
            "OciVersion": "1.0.2-dev",
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 4423,
....

기본 명령은 긴 출력을 JSON 형식으로 출력합니다. 출력을 필터링하려면 --format 옵션을 사용해야 합니다. 컨테이너가 언제 시작되었는지 확인하려면 다음 명령을 실행합니다.

$ podman inspect webserver --format '{{.State.StartedAt}}'
2021-10-05 10:13:52.794806322 +0000 UTC

컨테이너 셸에 액세스

exec 옵션을 사용하여 모든 컨테이너의 셸 프롬프트에 액세스할 수 있습니다.

$ podman exec -it webserver2 /bin/bash

포드

Podman에는 Docker에 없는 고유한 기능이 있습니다. Podman은 함께 작동하는 컨테이너에서 Pod를 만들 수 있습니다. 이를 통해 여러 컨테이너를 전체적으로 관리할 수 있습니다.

포드를 생성하려면 다음 명령어를 사용합니다.

$ podman pod create --name mypod

새로 생성된 포드에 컨테이너를 추가합니다.

$ podman run --pod mypod --name myimage1 image:latest
$ podman run --pod mypod --name myimage2 diff-image:latest

이제 간단한 한 줄 명령을 사용하여 컨테이너를 관리할 수 있습니다.

$ podman kill mypod      # Kill all containers
$ podman restart mypod   # Restart all containers
$ podman stop mypod      # Stop all containers
$ podman pod ps			# List all pods
$ podman pod top mypod   # Display running processes in a pod
$ podman pod inspect mypod # Inspect a Pod
$ podman pod rm mypod    # Remove the pod

결론

이것으로 Podman을 설치하고 사용하여 컨테이너를 실행하는 방법에 대한 자습서를 마칩니다. 우리가 다루지 않은 Podman으로 할 수 있는 일이 많이 있습니다. 질문이 있으시면 아래 의견에 게시하십시오.