Podman es un motor de contenedores que es compatible con la especificación OCI de contenedores. Este software forma parte del ecosistema de Red Hat, pero se puede instalar también en distribuciones como Gentoo. Como cumple las especificaciones OCI, se puede reemplazar directamente por Docker, ya que mucho de los comandos de Docker se han traducido directamente a Podman y así evitar tener que aprender más comandos nuevos.
Las principales diferencias que existen entre Docker y Podman es que Podman no necesita de un servicio, con lo que se incrementa la seguridad en el sistema, y si se tiene systemd, los contenedores pueden ejecutarse como servicios del sistema. Más info sobre esto.
Configurando el kernel
Hay que tener una serie de caracterísitcas habilitadas en el kernel para poder continuar:
General setup --->
-*- Control Group support --->
[*] Memory controller
[*] IO controller
[*] CPU controller --->
[*] Group scheduling for SCHED_OTHER
[*] CPU bandwidth provisioning for FAIR_GROUP_SCHED
[*] Group scheduling for SCHED_RR/FIFO
[*] PIDs controller
[*] RDMA controller
[*] Freezer controller
[*] HugeTLB controller
[*] Cpuset controller
[*] Include legacy /proc/<pid>/cpuset file
[*] Device controller
[*] Simple CPU accounting controller
[*] Perf controller
[*] Misc resource controller
[*] Configure standard kernel features (expert users) --->
[*] Enable 16-bit UID system calls
[*] Multiple users, groups and capabilities support
[*] sgetmask/ssetmask syscalls support
[*] Sysfs syscall support
[*] open by fhandle syscalls
[*] Posix Clocks & timers
[*] Enable support for printk
[*] BUG() support
[*] Enable ELF core dumps
[*] Enable PC-Speaker support
[*] Enable full-sized data structures for core
[*] Enable futex support
-*- Enable eventpoll support
-*- Enable signalfd() system call
-*- Enable timerfd() system call
-*- Enable eventfd() system call
-*- Use full shmem filesystem
[*] Enable AIO support
[*] Enable IO uring support
[*] Enable madvise/fadvise syscalls
-*- Namespaces support --->
-*- UTS namespace
[*] TIME namespace
-*- IPC namespace
-*- User namespace
-*- PID Namespaces
-*- Network namespace
[*] Networking support --->
Networking options --->
<M> 802.1d Ethernet Bridging
[*] IGMP/MLD snooping
<M> 802.1Q/802.1ad VLAN Support
Device Drivers --->
[*] Network device support --->
<M> MAC-VLAN support
<M> MAC-VLAN based tap driver
<M> Universal TUN/TAP device driver support
<M> Virtio network driver
Character devices --->
[*] Unix98 PTY support
File systems --->
<*> FUSE (Filesystem in Userspace) support
<*> Overlay filesystem support
Creamos este archivo /etc/modules-load.d/networking.conf
y añadimos tun
.
Configuramos los subuid y subgid al usuario que lo usará
Podman lo utilizará para mapear rangos de UID en los contenedores mediante espacios de nombres de usuario.
# usermod --add-subuids 200000-201000 --add-subgids 200000-201000 sincorchetes
Añadimos soporte CGroups V2 en el arranque
Editamos el archivo /etc/rc.conf
y añadimos:
rc_controller_cgroups="YES"
Configuramos las USE flags
Usaremos estas USE flags:
app-containers/podman rootless fuse
Instalamos
# emerge --ask app-containers/crun app-containers/podman
Exponiendo los contenedores a la red local
Habilitamos el servicio:
# rc-update add cni-dhcp default
# rc-service cni-dhcp start
Añadimos la configuración de red /etc/cni/net.d/88-macvlan.conflist
:
{
"cniVersion": "0.4.0",
"name": "macvlan",
"plugins": [
{
"type": "macvlan",
"master": "br0",
"isGateway": true,
"ipam": {
"type": "dhcp"
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
},
{
"type": "firewall"
},
{
"type": "tuning"
}
]
}
Creamos la interfaz br0 con NetworkManager
Para saber qué tarjetas tenemos y podemos utilizar:
nmcli dev
Haciendo bridging
br0-slave0: Añado la interfaz Ethernet cableada br0-slave1: Vinculo con la de Wireless.
nmcli con add type bridge con-name br0 ifname br0 ip4 10.0.0.3/24 gw4 10.0.0.1
nmcli con add type bridge-slave con-name br0-slave0 ifname enp3s0f1 master br0
nmcli con add type bridge-slave con-name br0-slave1 ifname wlp4s0 master br0
nmcli con up br0
Creamos la red
# podman pod create --name homeserver --network macvlan
Probamos
$ podman run -ti centos bash
[root@f0f1e1bb8d1b /]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="8"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="CentOS Linux 8"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:8"
HOME_URL="https://centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-8"
CENTOS_MANTISBT_PROJECT_VERSION="8"