Mac에서 Podman 설치하고 실행하기

오늘은 맥에서 Podman 설치하고 도커에서 빌드한 컨테이너 이미지를 실행해보려 합니다.

Podman

Podman은 Linux에서 OCI 컨테이너를 빌드하고 실행하기 위한 컨테이너 엔진입니다.

도커는 도커 데몬에서 관리하지만, Podman은 기본적으로 이미지와 컨테이너 그리고 저장소가 서로 분리된 구조로 되어있습니다.

자세한 내용은 podman 문서를 참고하시면 도움이 됩니다.

https://docs.podman.io/en/latest/#what-is-podman

추가로 Podman 3.3부터 OSX와 Windows 지원이 강화되어서 클라이언트로 설정하기 편해졌습니다.

Homebrew 준비

우선 설치하기 위해서 Homebrew를 준비합니다.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

공식 페이지에 존재하는 Homebrew 설치 스크립트로 준비합니다.

설치

Homebrew로 podman을 mac에 설치합니다.

brew install podman

아래와 같이 Homebrew가 업데이트되면서 관련된 의존 패키지를 내려받게 됩니다.

Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> Updated Formulae
Updated 10 formulae.
...
==> Installing dependencies for podman: gettext, libffi, pcre, gdbm, mpdecimal, openssl@1.1, readline, sqlite, xz, python@3.9, glib, gmp, bdw-gc, m4, libtool, libunistring, pkg-config, guile, libidn2, libtasn1, nettle, p11-kit, libevent, c-ares, jemalloc, libev, nghttp2, unbound, gnutls, jpeg, libpng, libslirp, libssh, libusb, lzo, ncurses, pixman, snappy, vde and qemu
...
zsh completions have been installed to:
  /usr/local/share/zsh/site-functions
==> Summary
🍺  /usr/local/Cellar/podman/3.3.1: 170 files, 39MB
==> Caveats
==> podman
zsh completions have been installed to:
  /usr/local/share/zsh/site-functions

해당 포스트 업로드 시각 기준으로 podman 3.3.1 버전이 설치됩니다.

초기 설정

Podman에서 관리하는 qemu로 Podman 클라이언트를 연결합니다.

podman machine init

아래처럼 fedora 가상머신 이미지를 내려받게 됩니다.

Downloading VM image: fedora-coreos-34.20210821.1.1-qemu.x86_64.qcow2.xz: done  
Extracting compressed file

준비가 되었으면 클라이언트와 연결합니다.

podman machine start

아래처럼 짧은 시간에 소켓을 연결하게 됩니다.

INFO[0000] waiting for clients...                       
INFO[0000] listening tcp://0.0.0.0:7777                 
...
Waiting for VM ...

podman 명령을 수행했을 때 아래처럼 출력되면 podman machine start 다시 수행합니다.

Error: failed to create sshClient: Connection to bastion host (ssh://core@localhost:50235/run/user/1000/podman/podman.sock) failed.: dial tcp [::1]:50235: connect: connection refused

설치 확인

podman이 정상적으로 설치되었는지 확인하려면 정보를 봅니다.

podman info

이미지 PULL

지금까지 podman 설정이 끝났으며, 공식 httpd 이미지를 검색해봅니다.

podman search httpd --filter=is-official

아래처럼 docker.io에 호스팅되는 httpd 이미지가 나옵니다.

INDEX       NAME                     DESCRIPTION                     STARS       OFFICIAL    AUTOMATED
docker.io   docker.io/library/httpd  The Apache HTTP Server Project  3660        [OK]    

docker hub와 fedoraproject.org 등 다양한 registry를 지원하므로 명시하는 게 좋습니다.

podman pull docker.io/library/httpd

아래와 같이 httpd 이미지를 로컬에 내려받습니다.

Trying to pull docker.io/library/httpd:latest...
Getting image source signatures
...
Writing manifest to image destination
Storing signatures

이미지 확인 및 실행

내려받은 이미지들을 확인합니다.

podman images

아래와 같이 이미지 정보가 있습니다.

REPOSITORY               TAG         IMAGE ID      CREATED     SIZE
docker.io/library/httpd  latest      f34528d8e714  4 days ago  142 MB

해당 httpd 이미지를 특정 포트로 백그라운드 실행힙니다.

podman run -dt -p 8080:80 docker.io/library/httpd 

mac 환경에서 네트워크 이슈가 생길 때

여기서 만약 특정 포트에 접근이 안되는 경우에는 containers.conf 설정 파일을 건드려야 합니다.

vi ~/.config/containers/containers.conf 

[containers] 색션에서 rootless_networking = "cni" 구문을 넣어줍니다.

해당 임시 해결법은 다음 릴리즈에서 해결된다고 관련 깃허브 이슈에서 언급되었으므로, 시간이 지나고 자연스럽게 해결될 수 있습니다.

이제 다시 8080 포트로 접근해봅니다.

http://0.0.0.0:8080

컨테이너 확인

컨테이너 목록을 확인합니다.

podman ps -a

httpd 이미지로 컨테이너가 실행 중이라는 사실을 알 수 있습니다.

CONTAINER ID  IMAGE                           COMMAND           CREATED        STATUS            PORTS                 NAMES
571b00c14af2  docker.io/library/httpd:latest  httpd-foreground  2 minutes ago  Up 2 minutes ago  0.0.0.0:8080->80/tcp  suspicious_greider

로그 확인

로그를 확인합니다.

podman logs 571b00c14af2

컨테이너 (httpd)를 확인해보면, 이전에 접속했던 엑세스 로그를 볼 수 있습니다.

[07/Sep/2021:12:51:01 +0000] "GET / HTTP/1.1" 200 45

정리

지금까지 테스트한 다음, 열린 컨테이너를 중단하고 지웁니다.

podman stop 571b00c14af2

실행 중인 컨테이너 (httpd)를 중단합니다.

podman rm 571b00c14af2

컨테이너 (httpd)를 제거합니다.

podman rmi docker.io/library/httpd

마지막으로 내려받은 이미지도 지웁니다.

아래와 같이 httpd 이미지가 삭제됩니다.

Untagged: docker.io/library/httpd:latest
Deleted: f34528d8e714f1b877711deafec0d957394a86987cbba54d924bc0a6e517a7ac

마치며

alias docker=podman

공식 페이지에서 위 명령어를 언급할 정도로 도커와 매우 호환성이 높으며, 최근 REST API로 docker-compose도 같이 사용할 수 있습니다.

비록 윈도우와 맥에서는 클라이언트를 지원하므로 직접적인 REST API 지원은 제한되어 있지만, SSH로 리눅스의 podman과 통신해서 사용할 수 있습니다.

오픈소스 프로젝트로서 점차 발전되기를 기대합니다.

Written on September 11, 2021