MacOS 환경에서 podman 설치하기 #1
지난 번 Docker 유료화 구독 모델 발표 이후 작성한 글에서 Docker Desktop 대신 사용할 podman이라는 것을 이야기 했었다.
그래서 podman을 설치해 보기로 하고 podman 홈페이지에 접속을 했다.
podman 자체 설치는 생각보다 간단하며 MacOS용도 제공한다길래 간단히 brew로 설치하고 실행했다.
https://podman.io/getting-started/installation
$ brew install podman
설치는 잘 되었는데 podman 명령을 실행했더니 이상한 에러 메시지를 뿜고 있다. 그렇다고 완전 실행이 안되는 것은 아닌데 에러를 내고 있었다.
$ podman images
Error: cannot connect to the Podman socket, please verify that Podman REST API service is running: Get "http://d/v3.3.0/libpod/_ping": dial unix ///var/folders/vc/shznbfb93294t2y1q4lv382w0000gn/T/podman-run--1/podman/podman.sock: connect: no such file or directory
뭔가 문제일까? podman 홈페이지를 살펴보니 MacOS용은 Remote Client 라고 되어 있다.
지난 글에서 잠깐 이야기했는데 podman은 Linux 용 프로그램이며 이를 위해서는 Linux Server가 필요하다. MacOS의 경우는 Linux가 아니므로 제공되는 Podman은 Remote Client 기능만 포함된다.
결국 서버가 없으니 연결이 안된다는 당연한(?) 메시지를 보여주고 있는 것이다. 그렇다면 Linux Server를 어디서 구해야 할까?
Podman용 Linux Server 구성하기
Podman과 Virtual Machine을 키워드로 찾아 보았더니, Podman Machine이라는 것이 있었다. 가상 머신 환경으로 Podman Server를 만들고 podman remote client로 연결하는 방식인데 자료를 찾아 들어갔더니 해당 프로젝트는 deprecated 되었고 Vagrant를 이용하라고 나와 있는게 아닌가?
https://github.com/boot2podman/machine
뭔가 산넘어 산 느낌이 좀 쎄했지만 일단 고! Vagrant가 필요하다고 하니 일단 설치! 이것도 brew로 설치한다!
$ brew install --cask vagrant
설치는 잘 된 것 같은데 Vagrant와 podman이 무슨 관계가 있는지 확인할 필요가 있었다.
Vagrant로 Podman용 Linux Server 구성하기
Vagrant는 쉽게 말하면 일종의 VM을 잘 관리해주는 도구라고 볼 수 있다. 사실 VM 환경이 상당히 보편화 되어 있기 때문에 해당 시스템을 구축하는 환경을 만들고 관리하는 도구로 볼 수 있다. 쉽게 생각하면 Dockerfile로 컨테이너 이미지를 만들어내는 것처럼 Vagrant를 이용해서 VM 시스템 환경과 VM 이미지를 구성하는 것으로 생각해 볼 수 있다.
podman을 Docker 대체로서 사용할 수 있도록 Vagrant를 이용한 방법이 아래 글에서 설명하고 있다. 이를 이용하면 손쉽게(?) podman linux server를 만들어 볼 수 있다.
https://www.redhat.com/sysadmin/replace-docker-podman-macos
이곳에서는 우선 VirtualBox를 먼저 설치하라고 안내하고 있다. 이것도 brew로 설치 할 수 있지만, VirtualBox만 설치하는게 아니라 Extension도 설치해야해서 아래 홈페이지에서 다운로드 받아 두 가지 다 설치했다.
https://www.virtualbox.org/wiki/Downloads
설치에 사용했던 버젼은 Version 6.1.26 r145957 (Qt5.6.3) 이다.
그 다음에는 다음과 같이 Vagrantfile을 이용해서 VM을 생성하도록 하고 있다.
Vagrant.configure("2") do |config|
config.vm.box = "fedora/32-cloud-base"
config.vm.provider "virtualbox" do |vb|
vb.memory = "1024"
end
config.vm.provision "shell", inline: <<-SHELL
yum install -y podman
groupadd -f -r podman
#systemctl edit podman.socket
mkdir -p /etc/systemd/system/podman.socket.d
cat >/etc/systemd/system/podman.socket.d/override.conf <<EOF
[Socket]
SocketMode=0660
SocketUser=root
SocketGroup=podman
EOF
systemctl daemon-reload
echo "d /run/podman 0770 root podman" > /etc/tmpfiles.d/podman.conf
sudo systemd-tmpfiles --create
systemctl enable podman.socket
systemctl start podman.socket
usermod -aG podman $SUDO_USER
SHELL
end
위의 파일을 podman을 위한 디렉토리에 저장하고 해당 디렉토리에서 다음과 같이 Vagrant CLI 명령을 실행하면 VirtualBox에 이미지가 생성되고 그에 맞춰 실행되는 것을 볼 수 있다.
$ vagrant up
근데, vagrant up 명령을 실행해도 VM이 VirtualBox NS_ERROR_FAILURE (0x80004005) 란 메시지가 나오면서 실행이 안되었었다. 뭐가 원인일까? 찾아보니 MacOS 보안으로 인해 별도 설치한 애플리케이션에 접근을 허용해야 정상적으로 실행된다고 한다.
https://stackoverflow.com/questions/52689672/virtualbox-ns-error-failure-0x80004005-macos
단, VirtualBox의 경우는 시스템 재시작 이후에 적용된다.
VM이 정상 실행되는 것을 확인했으니 이제 podman과 VM 연동을 해 주어야 한다. 이 정보가 없으면 VM이 정상 실행 중이라 하더라도 podman은 linux podman server를 찾을 수 없어 오류가 발생한다.
접속 정보는 podman 실행 시 argument를 전달하여 사용할 수 있지만 상당히 불편하므로 환경 변수를 이용하는 방법을 제안하고 있다. 다음과 같이 CONTAINER_HOST, CONTAINER_SSHKEY 환경 변수 값을 설정해 준다.
export CONTAINER_HOST=ssh://vagrant@127.0.0.1:2222/run/podman/podman.sock
export CONTAINER_SSHKEY=/Users/[username]/tools/podman/.vagrant/machines/default/virtualbox/private_key
CONTAINER_SSHKEY는 vagrant up 실행 시 지정되는 private_key 를 이용한다.
우여곡절 끝에 VM을 실행했고 이제 좀 podman이 실행되나 했더니 이번엔 버젼이 안맞는다고 한다.
$ podman images
Error: cannot connect to the Podman socket, please verify that Podman REST API service is running: server API version is too old. Client "3.1.0" server "2.0.0"
일단 Vagrant로 만든 Podman Server가 뭔가 정보가 안맞는 상황이므로 다음 명령으로 VM을 중지하고 Vagrantfile 내용을 수정해서 다시 실행해 보았다.
$ vagrant halt
Hashcorp의 Vagrant Cloud box 카탈로그에 fedora cloud base가 34로 업데이트 된것을 확인했기에 이를 활용해 보기로 했다.
Vagrantfile에서 변경된 부분은 다음과 같다.
Vagrant.configure("2") do |config|
config.vm.box = "fedora/34-cloud-base"
...
https://app.vagrantup.com/fedora/boxes/34-cloud-base
이전에 배포된 VM을 삭제하고 변경된 Vagrantfile을 이용해서 다시 VM을 생성한다.
$ vagrant destroy default
이제 podman 정보가 오류 없이 나오는 것을 확인 할 수 있다.
$ podman version
Client:
Version: 3.3.0
API Version: 3.3.0
Go Version: go1.16.6
Built: Sat Aug 21 02:47:23 2021
OS/Arch: darwin/amd64
Server:
Version: 3.3.0
API Version: 3.3.0
Go Version: go1.16.6
Built: Sat Aug 21 04:36:14 2021
OS/Arch: linux/amd64
podman으로 dockerhub의 image를 가져올 수 있는지 확인을 해보았는데 에러가 난다.
$ podman pull golang
Error: failed to parse "X-Registry-Auth" header for /v3.3.0/libpod/images/pull?alltags=false&arch=&authfile=&os=&password=&policy=always&quiet=false&reference=golang&username=&variant=: error storing credentials in temporary auth file (server: "https://index.docker.io/v1/", user: ""): key https://index.docker.io/v1/ contains http[s]:// prefix
X-Registry-Auth 에러 수정하기
음.. 뭔가 설정이 빠진듯한 느낌이 있어서 Hashcorp에서 우선 공식적으로 제공하는 podman provisioning에 대한 내용을 다시 확인해 보았다.
https://www.vagrantup.com/docs/provisioning/podman
내용을 다시 확인했더니 podman을 구성하고 pull Docker container를 할 수 있다는 내용이 있는데, 이건 Vagrant로 podman을 VM 내부에서 실행하는 것에 대한 내용이라 오류의 원인을 해결하는 목적은 아닌 것 같다.
좀 더 확인을 해서 podman pull image 오류를 해결했는데 관련 내용은 MacOS환경에서 podman 설치하기#2 를 참고 하기 바란다.