그냥저냥

FreeBSD Podman 설치 본문

인프라/FreeBSD

FreeBSD Podman 설치

sync86 2024. 10. 19. 07:00
728x90
반응형

이전에 "[FreeBSD] 초기 설정"에서 Podman 설치에 대해서는 다소 간단히 언급만 하였다. Podman 분량이 많을 것 같아 별도의 글로 작성하는 것이 좋을것 같다고 생각 했었다.


[!WARNING] The FreeBSD port of the Podman container engine is experimental and should be used for evaluation and testing purposes only.

 

Podman을 설치 가이드 문서의 FreeBSD 설치 항목에 위와 같은 경고 문구가 있다. FreeBSD port가 의미하는 것이 무엇일까? pkg 명령을 사용하여 설치한 Podman을 의미하는 것인지, FreeBSD ports에서 빌드하여 설치한 Podman을 의미하는지 확실하지 않다. 그건 그렇고 기능 평가나 테스트 목적으로 사용하고 실 서비스가 운영되는데는 사용하지 말라는 의미인 것 같다.

 

이 블로그에 글을 작성하기 위해 설치한 FreeBSD는 뻘짓 용도이기 때문에 사라져도 아무 문제가 없어서 이 경고는 무시하겠다고 다짐했다.


 

FreeBSD에 Podman을 설치 가이드는 "Installing on FreeBSD 14.0"에서 확인할 수 있고, 예전 글에서도 언급하였지만, 순서를 조금 바꿔 설치를 하였다.

 

설치 가이드의 Storage 항목 중 아래의 명령어를 먼저 실행하였다.

# zfs create -o mountpoint=/var/db/containers zroot/containers

 

위 명령어를 실행한 후 df 명령을 실행하면 아래와 같이 /var/db/containers가 추가된 것을 확인할 수 있다. 이 글에서는 명령어를 실행한 이후 결과를 보여주지만, 위의 명령어를 실행하기 전에 df 명령을 실행하여 확인하면 차이를 볼 수 있다.

# df
Filesystem         1K-blocks    Used    Avail Capacity  Mounted on
zroot/ROOT/default  27529612 1823824 25705788     7%    /
devfs                      1       0        1     0%    /dev
zroot/tmp           25705884      96 25705788     0%    /tmp
zroot/usr/ports     25705884      96 25705788     0%    /usr/ports
zroot/var/tmp       25705884      96 25705788     0%    /var/tmp
zroot/var/crash     25705884      96 25705788     0%    /var/crash
zroot/var/audit     25705884      96 25705788     0%    /var/audit
zroot/usr/src       25705884      96 25705788     0%    /usr/src
zroot/var/log       25705944     156 25705788     0%    /var/log
zroot               25705884      96 25705788     0%    /zroot
zroot/var/mail      25705888     100 25705788     0%    /var/mail
zroot/home          25705884      96 25705788     0%    /home
zroot/home/terry    25705928     140 25705788     0%    /home/terry
zroot/containers    25705884      96 25705788     0%    /var/db/containers

 

Podman 패키지 설치

# pkg install podman

Initial Configuration

설치가 완료되면 아래의 명령어를 실행해야 한다. 아마 FreeBSD에서 Podman 기능상의 이유 때문에 fdescfs를 마운트가 필요한 것 같다. (자세한 내용은 아직 살펴보지 않았다. ㅠㅠ)

# mount -t fdescfs fdesc /dev/fd

 

아마 위 명령을 실행하면 특이사항 없으면 마운트가 되었을 것이다.

# df
Filesystem         1K-blocks    Used    Avail Capacity  Mounted on
zroot/ROOT/default  27529652 2004700 25524952     7%    /
devfs                      1       0        1     0%    /dev
zroot/tmp           25525048      96 25524952     0%    /tmp
zroot/usr/ports     25525048      96 25524952     0%    /usr/ports
zroot/var/tmp       25525048      96 25524952     0%    /var/tmp
zroot/var/crash     25525048      96 25524952     0%    /var/crash
zroot/var/audit     25525048      96 25524952     0%    /var/audit
zroot/usr/src       25525048      96 25524952     0%    /usr/src
zroot/var/log       25525108     156 25524952     0%    /var/log
zroot               25525048      96 25524952     0%    /zroot
zroot/var/mail      25525052     100 25524952     0%    /var/mail
zroot/home          25525048      96 25524952     0%    /home
zroot/home/terry    25525092     140 25524952     0%    /home/terry
zroot/containers    25525048      96 25524952     0%    /var/db/containers
fdescfs                    1       0        1     0%    /dev/fd

 

df 명령을 실행하여 확인하면 맨 마지막에 fdescfs가 마운트된 것을 볼 수 있다.

 

단, FreeBSD가 어떤 재시작하면 fdescfs가 마운트되지 않는다. 아래의 내용을 /etc/fstab 파일에 추가하여 재시작되더라도 fdescfs를 마운트가 자동으로 될 수 있게 설정한다.

fdesc   /dev/fd         fdescfs         rw      0       0

 

이후 Podman 서비스를 활성화 한다.

# service podman enable
podman enabled in /etc/rc.conf

 

활성화 하면 서비스가 실행되는 것은 아니지만 부팅할 때 서비스를 시작할 수 있게 설정을 추가한다. 이전에 open-vm-tools 패키지를 설치한 후 sysrc vmware_guestd_enable="YES" 명령의 결과와 같다. 

# cat /etc/rc.conf
clear_tmp_enable="YES"
hostname="freebsd"
ifconfig_em0="DHCP"
sshd_enable="YES"
ntpd_enable="YES"
ntpd_sync_on_start="YES"
moused_nondefault_enable="NO"
# Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable
dumpdev="AUTO"
zfs_enable="YES"
vmware_guestd_enable="YES"
podman_enable="YES"

 

cat으로 /etc/rc.conf 파일의 내용을 확인해보면 아래의 내용을 확인할 수 있다.

  • podman_enable="YES"

Network

네트워크 설정은 방화벽 설정이다. 호스트에서 컨테이너에 포트 포워딩을 제공하기 위해 필요한 설정이다.

# cp /usr/local/etc/containers/pf.conf.sample /etc/pf.conf

 

위 명령을 실행하여 pf 설정 파일을 /etc 경로에 복사한다. 

# vi /etc/pf.conf

 

위에서 복사한 /etc/pf.conf 파일을 vi 에디터로 오픈한다.

# Change these to the interface(s) with the default route
v4egress_if = "ix0"
v6egress_if = "ix0"

nat on $v4egress_if inet from <cni-nat> to any -> ($v4egress_if)
nat on $v6egress_if inet6 from <cni-nat> to !ff00::/8 -> ($v6egress_if)

rdr-anchor "cni-rdr/*"
nat-anchor "cni-rdr/*"
table <cni-nat>

 

위 내용 중에 v4egress_if, v6egress_if 항목이 보인다. 여기서 ix0이 있는 부분을 실제 사용할 인터페이스 이름으로 수정하면 된다. 이 인터페이스 이름을 확인하기 위해서는 ifconfig 명령을 통해 확인할 수 있다.

# ifconfig
em0: flags=1008843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
	options=4e504bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,LRO,VLAN_HWFILTER,VLAN_HWTSO,RXCSUM_IPV6,TXCSUM_IPV6,HWSTATS,MEXTPG>
	ether 00:0c:29:ed:d7:d2
	inet 192.168.0.36 netmask 0xffffff00 broadcast 192.168.0.255
	media: Ethernet autoselect (1000baseT <full-duplex>)
	status: active
	nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
lo0: flags=1008049<UP,LOOPBACK,RUNNING,MULTICAST,LOWER_UP> metric 0 mtu 16384
	options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
	inet 127.0.0.1 netmask 0xff000000
	inet6 ::1 prefixlen 128
	inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
	groups: lo
	nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>

 

여기서 주로 사용되는 인터페이스는 "em0"이다. 따라서 아래와 같이 수정하면 된다.

# Change these to the interface(s) with the default route
v4egress_if = "em0"
v6egress_if = "em0"

nat on $v4egress_if inet from <cni-nat> to any -> ($v4egress_if)
nat on $v6egress_if inet6 from <cni-nat> to !ff00::/8 -> ($v6egress_if)

rdr-anchor "cni-rdr/*"
nat-anchor "cni-rdr/*"
table <cni-nat>

 

이후 pf 서비스를 활성화하고, 시작한다.

# service pf enable
# service pf start

 

커널 설정 및 모듈관련 설정을 추가로 진행한다.

# echo 'pf_load="YES"' >> /boot/loader.conf
# kldload pf
# sysctl net.pf.filter_local=1
# echo 'net.pf.filter_local=1' >> /etc/sysctl.conf.local

 

커널 설정 및 모듈관련 설정이 끝나면 pf 서비스를 재시작한다.

# service pf restart

 

호스트에서 컨테이너로 포트 포워딩이 잘되는지 확인을 해야 한다. 그런데 이를 테스트하려면 컨테이너를 만들어서 테스트 해야한다. 아직 설정해야 할 것이 남아 있기 때문에 나머지 설정을 마무리 하고 컨테이너를 실행하여 테스트 해볼 예정이다.


혹시 pf 서비스를 재시작하는 명령에서 위와 같은 메시지가 출력될 수 있다.

# service pf restart
Cannot 'restart' pf. Set pf_enable to YES in /etc/rc.conf or use 'onerestart' instead of 'restart'.

 

 아래와 같이  restart 대신에 onerestart로 변경하여 서비스를 재시작 하는 명령을 실행하거나, 재부팅하면 된다.

# service pf onerestart
Enabling pf.

Storage

지금 작업하고 있는 FreeBSD는 ZFS 파일 시스템으로 구성되어 있다. 이 경우에는 특별히 진행할 작업은 없다. 원문에서는 ZFS 파일 시스템을 사용할 수 없다면이라고 적혀 있었던 것 같다. ZFS 파일 시스템을 사용하지 못하는 경우는 UFS 파일 시스템으로 구성했을 경우라고 생각된다. 그래서 UFS 파일 시스템으로 설치했을 경우 /etc/local/etc/containers/storage.conf 파일에 driver 설정을 zfs에서 vfs로 변경하면 될 것 같다.

# sed -I .bak -e 's/driver = "zfs"/driver = "vfs"/' /usr/local/etc/containers/storage.conf

 

지금까지 ZFS 파일 시스템으로만 설치를 해보았다. 그래서 설정을 변경해야 하는 경우를 확인하기 위해서는 FreeBSD를 UFS 파일 시스템으로 다시 설치하여 테스트가 필요할 것 같다.


Linux Emulation

마지막으로 리눅스 에뮬레이션 서비스도 활성화 한다.

# sysrc linux_enable=YES
# service linux start

Conclusion

설치 가이드에서는 Storage 설정 이후 Linux Emulation 설정 이후 podman을 실행하는 과정이 포함되어 있다. 이 글에서는 한꺼번에 테스트 하는 것이 좋을 것 같아 그 과정은 생략하였다. 

 

구성은 마무리 된 것 같다. 이후 재시작을 권장한다.

 

그 이유는 구성은 마무리 하였지만, 이후 언제든지 시스템이 재부팅되는 경우가 있다. 혹시 누락된 설정이 있을 수 있다. 이를 사전에 확인하여 이후 일어날 불상사를 방지하기 위해서이다. 하지만 뻘짓 용도인데 이렇게까지 해야하나 싶긴 하지만, 테스트를 할지 안할지 여부는 선택이다.

 

간단히 컨테이너를 실행해본다. 아래와 같이 출력 된다면 FreeBSD에서 컨테이너는 실행된다는 것을 확인할 수 있다.

# podman run --rm docker.io/dougrabson/hello
!... 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

 

Linux Emulation 항목에서 나온 테스트 명령이다. 아래와 같이 맨 아래 라인에 NAME="Alpine Linux"이 출력된다면 리눅스 컨테이너도 실행된다는 것을 확인할 수 있다.

# podman run --rm --os=linux docker.io/alpine cat /etc/os-release | head -1
Trying to pull docker.io/library/alpine:latest...
Getting image source signatures
Copying blob 43c4264eed91 done   | 
Copying config 91ef0af61f done   | 
Writing manifest to image destination
NAME="Alpine Linux"

 

구성을 완료하고 nginx 컨테이너를 실행하였다. 이후 http 접속하니 접속되지 않는다. 아마 pf 설정 문제로 보이는데 원인 및 해결 방법을 찾아보고 있다. 조금 시간이 걸릴 수 있으나 해결하면 이 글에다 추가로 작성하거나 원인 및 해결 방법에 대해 새로운 글을 작성하겠다.

728x90
반응형

'인프라 > FreeBSD' 카테고리의 다른 글

FreeBSD Podman 테스트 보류!  (0) 2024.10.29
FreeBSD Podman 설치 중에 문제가...  (0) 2024.10.20
FreeBSD 초기 설정  (0) 2024.10.18
FreeBSD 설치 (배경)  (0) 2024.10.02