Docker Desktop이 유료화 되면서(250인 이상, 130억 이상 매출 회사라면 유료!) 대안으로 사용할 수 있는 테스크탑용 컨테이너 가상화 프로그램을 조금씩은 생각해둘 필요성이 생기게 되었다.
오픈소스 수익모델이 점점 기업을 대상으로 비용을 요구하는 방식으로 변해가고 있어 실업무 상황에서 사용자들에겐 곤란한 부분이 없지 않게 있다. (회사에서 안사줘요 ㅠㅠ 등등)
마침 도커 테스크탑의 대체제가 필요해진 이때를 놓치지 않고 Redhat에서 밀고있는 컨테이너 엔진인 podman을 기반으로 Podman Desktop이 공개되었는데, 설치 사용을 해보니 사용성 부분에서 충분히 Docker Desktop의 대체하고도 남을만한 수준으로 만들어져 있어 도커 데스크탑을 벗어나 Podman Desktop으로 갈아타는 것을 강력히 추천하고 싶다.
그래서! 맥에서 조용히 '고래도 물개도 모르게'(?) 당신의 Docker Desktop을 대체해 보자.
어플리케이션을 배포할때 컨테이너로 배포하는 장점은 한두가지가 아니다. 때문에 이제는 컨테이너로 배포를 하지 않는 것이 이상해 보일정도로 컨테이너로 개발하고 배포할 수 있는 환경이 보편화가 많이 되었다. 때문에 개발자들이 Docker로 개발을하고 배포를하는데 손에 익어버린 'docker' 명령어들을 'podman'으로 바꾸는데는 이미 시기적으로 늦어버린 것 같다.
이를 의식해서 podman, rancher 에서 제공되는 Desktop 프로그램들은 docker 커맨드와의 호환성을 어느정도 그대로 유지시켜 주고 있어 간단하게 사용하는데 있어는 이질감이 최소화 되도록 만들어져 있다.
그리고 Podman Desktop의 OS 부분에서는 Linux에서는 Native 리눅스커널을 사용하게 되고 Windows에서는 WSL, MacOS에서는 QEMU로 리눅스커널을 지원하고 있는 것을 알고 있으면 좋을 것 같다. (Rancher Desktop이나 Docker Desktop등 데스크탑용 컨테이너 엔진들은 각각의 OS플랫폼별로 리눅스커널을 사용 하는 방식에 조금씩 차이가 있다.)
1. Podman Desktop 설치
Podman Desktop 설치가 완료되면 Docker Desktop으로 그동안 관리하던 내용들에 접근하기 어렵다.
- 반드시 설치하기전에 사용하던 Docker Desktop의 내용은 백업후에 진행을 하자. (다시 돌아오기 싫어질 수 있다 ㅎㅎ)
- 다시 돌아오고 싶을 가능성이 있다면 현재 사용중인 docker, docker-compose의 위치와 /var/run/docker.sock의 상태를 잘 봐둬야한다.
## 도커데스크탑을 사용중인 환경
> ls -l /usr/local/bin/docker
lrwxr-xr-x 1 name staff 54 2 12 2023 /usr/local/bin/docker -> /Applications/Docker.app/Contents/Resources/bin/docker
> ls -l /usr/local/bin/docker-compose
lrwxr-xr-x 1 name staff 62 2 12 2023 /usr/local/bin/docker-compose -> /Applications/Docker.app/Contents/Resources/bin/docker-compose
> ls -l /var/run/docker.sock
srw------- 1 root staff 0 11 4 08:11 /var/run/docker.sock
Mac에서는 Homebrew를 통해 Podman Desktop과 podman을 간단하게 설치를 할 수 있다.
## Podman Desktop 을 설치하면 의존성에 의해 podman, qemu, go 등이 함께 설치된다.
> brew install --cask podman-desktop
...
==> Installing podman dependency: qemu
==> ./configure --cc=clang --host-cc=clang --disable-bsd-user --disable-guest-agent --enable-slirp --enable-capstone --enable-curses -
==> make V=1 install
🍺 /usr/local/Cellar/qemu/8.1.2: 162 files, 529.4MB, built in 18 minutes 33 seconds
==> Installing podman
==> Downloading https://formulae.brew.sh/api/formula.jws.json
############################################################################################################################### 100.0%
==> gmake podman-remote
==> gmake podman-mac-helper
==> gmake gvproxy
==> gmake podman-remote-darwin-docs
🍺 /usr/local/Cellar/podman/4.7.2: 191 files, 53.9MB, built in 1 minute 56 seconds
==> Installing Cask podman-desktop
==> Moving App 'Podman Desktop.app' to '/Applications/Podman Desktop.app'
🍺 podman-desktop was successfully installed!
docker-compose 와의 호환성을 위해 podman-compose도 설치해주자.
## Docker Desktop의 docker-compose는 v2.2 이다.
> brew install podman-compose
...
==> Fetching dependencies for podman-compose: python@3.11, cython, python@3.10 and pyyaml
==> Fetching python@3.11
==> Downloading https://raw.githubusercontent.com/Homebrew/homebrew-core/4655ac627661d4586d81ff62861a84c0af3c5e3c/Formula/p/python@3.11.rb
################################################################################################################################################## 100.0%
...
조금 심심했던 컴파일 과정들이 끝나고 나면 Podman Desktop 설치 완료창이 뜬다.
시작화면 내용에서 보이듯이 파드맨 데스크탑은 podman, docker, lima 등 추가적인 컨테이너 엔진을 지원하고 있다.
설치와 함께 같이 있는 컨테이너 엔진들을 위한 익스텐션들
1-1. Podman Desktop실행
설치가 완료 되었으면 어플리케이션 리스트에서 실행한다.
커맨드라인에서 open을 이용해 실행을 할 수도 있다.
## 커맨드라인에서 실행할땐 open!
> open /Application/Podman\ Desktop.app
기본값으로 Initialize를 하는 스펙이 작은편이어서 스펙을 살짝 올려 실행하기 위해 커맨드라인에서 다음과 같이 입력한다.
(테스트용 컨테이너에 1core, 2G 메모리는 빡빡하지 않을까)
## podman이 사용할 QEMU 가상머신의 스펙을 살짝 업글시켜서 시작 하자.
## Docker와의 호환성을 위해 rootful옵션을 넣었다.
> podman machine set --rootful --cpus 2 --memory 4096
> podman machine init
> podman machine start
1Core에 2G메모리가 괜잖다면 GUI에서 'Initalize and start' 를 눌러 시작해준다.
Init이 완료 된후 GUI에서 리눅스커널로 사용할 스펙을 변경하고 싶다면 Settings -> Resources 에서 변경할 수도 있지만, GUI에서 기존의 가상머신을 종료하고 새로운 머신을 생성하는 과정이 솔직히 좀 귀잖다. ^^;;;
그래서 커맨드라인을 통해 다음과 같은 순서로 가상머신(리눅스커널)의 스펙을 변경하길 바란다.
## 리눅스 커널을 정지 시킨다.
> podman machine stop
## 리눅스 커널의 스펙을 변경시킨다.
> podman machine set --rootful --cpus 2 --memory 4096
## 리눅스 커널을 시작 한다.
> podman machine start
실행이 완료 되면 Docker Desktop의 도커데몬이 사용중이던 소켓을 Podman의 리눅스커널로 연결 시킨것을 확인할 수 있다.
## 슬슬 도커 데스크탑을 잡아먹으려는게 야욕이 보인다 ㅎㅎ
> ls -l /var/run/docker.sock
lrwxr-xr-x 1 root daemon 63 11 4 07:16 /var/run/docker.sock -> /Users/name/.local/share/containers/podman/machine/podman.sock
1-2. Podman 실행 완료
Podman이 실행이되어 있는 상태를 상태표시줄과 Podman 대쉬보드에서 확인할 수 있다.
1-3. Alias docker, docker-compose
마지막으로 아직 손가락에 익숙하지 않은 podman 명령을 대신 입력될 docker와 docker-compose 를
쉘에서 alias 시켜주자. (alias로 docker-compose를 실행하면 podman이 알아서 원본이 될 docker-compose를 실행해준다.)
zsh를 사용한다면 ~/.zshrc 에 alias를 잡아주고. bash를 사용한다면 ~/.bashrc에 alias를 잡아줘야 한다.
## 심볼릭 링크를 교체하는 취향이 아니라서 쉘에서 alias로 처리 하자.
> cat<< EOF >>~/.zshrc
alias docker="podman"
alias docker-compose="podman-compose"
EOF
> source ~/.zshrc
## alias로 docker 실행시 podman이 실행된다.
> which docker
docker: aliased to podman
## alias로 docker-compose 실행시 podman-compose가 실행된다.
> which docker-compose
docker-compose: aliased to podman-compose
2. docker 커맨드 그대로 사용할 수 있다.
이제 도커 데스크탑에서 Podman Desktop으로 변경하는 작업이 완료 되었다.
커맨드들 실행되는 상태를 확인해보자.
## docker실행시 podmand이 실행된다 ....
> docker --version
podman version 4.7.2
## 이부분이 특이한데, 'podman compose' 를 실행하면 Docker Desktop의 docker-compose v2.2에 자동으로 연결해준다.
> docker compose --version
>>>> Executing external compose provider "/usr/local/bin/docker-compose". Please refer to the documentation for details. <<<<
Docker Compose version v2.21.0-desktop.1
## podman-compose 는 docker-compose v1방식으로 동작하게 된다.
> docker-compose --version
podman-compose --version
podman-compose version: 1.0.6
['podman', '--version', '']
using podman version: 4.7.2
podman-compose version 1.0.6
podman --version
podman version 4.7.2
exit code: 0
테스트를 위해 docker에서 처럼 컨테이너 하나를 띄워보고 잘 동작하는지 확인해보자.
## 자꾸 뿅망치를 찾게되는 테스트다... 분명 물개라고 했는데...
##
> docker run quay.io/podman/hello
Trying to pull quay.io/podman/hello:latest...
Getting image source signatures
Copying blob sha256:d08b40be68780d583e8c127f10228743e3e1beb520f987c0e32f4ef0c0ce8020
Copying config sha256:e2b3db5d4fdf670b56dd7138d53b5974f2893a965f7d37486fbb9fcbf5e91d9d
Writing manifest to image destination
!... Hello Podman World ...!
.--"--.
/ - - \
/ (O) (O) \
~~~| -=(,Y,)=- |
.---. /` \ |~~
~/ o o \~~~~.----. ~~
| =(X)= |~ / (O (O) \
~~~~~~~ ~| =(Y_)=- |
~~~~ ~~~| U |~~
Project: https://github.com/containers/podman
Website: https://podman.io
Documents: https://docs.podman.io
Twitter: @Podman_io
> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
quay.io/podman/hello latest e2b3db5d4fdf 2 months ago 82.3 kB
Docker의 명령들은 그대로 사용 가능하다. 차이점이 느껴진다면 지원하는 자세한 커맨드를 아래 사이트에서 참고 바란다.
https://docs.podman.io/en/latest/Commands.html
3. Podman은 좀 특이한 컨테이너 엔진이다
Podman은 User권한 수준에서 사용 가능한 rootless 컨테이너 엔진이지만 docker의 소켓방식을 동시에 지원하면서 docker와의 공존이 가능하기 때문에 Root 권한으로도 활용이 가능하다. 때문에 마음만 먹으면 docker나 container-d 와 같이 root권한으로 동작하는 컨테이너 데몬이 일으킬수 있는 위험들을 피할 준비가 되어 있다는 의미다.
그리고 Podman Dekstop의 활용성을 보자면 쿠버네티스와 매니페스트를 주고 받으며 동작할 수 있는 Kubefly 기능이 변경작업이 많은 개발계에서 특히 쓸모가 많다. (정말 휙휙이다, 킬포다 휙휙!)
Podman Desktop 컨테이너 속성에서 매니페스트와 컨테이너 이미지를 연결가능한 쿠버네티스 클러스터 바로 때려 넣어버릴 수 있다.
반대로 쿠버네티스 yaml을 가져와 Podman 컨테이너로 만들수도 있다.
Podman Desktop Plugin API를 제공 하고 있어 Docker Desktop에서 사용했던 플러그인들을(Grafana, trivy 등등) Podman Desktop에서 그대로 사용할 수도 있다.
플러그인 부분에서 조금 다른점이라면 Podman Desktop의 플러그인은 Golang을 사용해야 하다는 정도가 될 것 같다.
4. 마치며
튜토리얼을 살짝 경험해보면 유료화된 도커 데스크탑을 굳이 고집할 이유가 없다는 사실을 느낄 수 있을듯 하다.
이전에 Rancher Desktop으로 대체를 하려고 시도 해봤었는데 랜처 테스크탑의 경우 Lima VM을 리눅스 커널용으로 사용하면서 UDP통신을 지원하지 않아 도커데스크탑을 대체하려던 시도가 좌절되어 버렸었다.
Podman을 지원하고 있는 Redhat재단에서 엔터프라이즈 리눅스에 대해 유료 지원을 하고 있어 엔터프라이즈 리눅스에 배포되는 podman에 대한 지원까지 함께 받을 수 있다면 컨테이너엔진으로 podman을 안쓸이유가 더더욱 없을 것 같다는 생각이다.
참고자료
https://podman-desktop.io/extend
https://docs.podman.io/en/latest/Commands.html
https://github.com/containers/podman/tree/main/docs/tutorials