Con la nueva versión del Fedora Workstation 32 nos encontramos con algunos cambios importantes para el uso de contenedores, y uno de ellos que para mi fue un problema fue que por defecto utiliza Podman para los contenedores. En esta guía vamos a ver los pasos necesarios para instalar el Docker CE en nuestro Fedora 32.

¿Porqué no Podman?

Imagino que está es la primera pregunta que muchos van a tener, es por esto que voy a responderla desde el inicio.

IMPORTANTE

Quisiera aclarar que me baso completamente en mi experiencia y en mi flujo de desarrollo, puede que para otros programadores no sea un problema el utilizar Podman.

¿Qué es Podman?

Podman is a daemonless container engine for developing, managing, and running OCI Containers on your Linux System. Containers can either be run as root or in rootless mode. Simply put: alias docker=podman. – podman.io

El principal problema que tuve, se presentó justamente con una de las principales características del Podman, por seguridad no corre con un daemon entonces respeta los permisos de cada proceso que se ejecuta en el sistema operativo del host, entre otras mejoras de seguridad.

Esto quiere decir, que por seguridad, cada usuario tiene su propio ambiente y este tiene sus propios archivos, entonces si yo genero un nuevo docker image, solo lo puedo ver con el usuario que lo generó. Por defecto el generar un nuevo docker image está restringido al usuario root, para poder hacerlo con mi usuario me obliga a ver si puedo modificar los permisos de alguna manera, o buscando en internet la solución recomendada normalmente es deshabilitar SELinux o ejecute todo con el usuario root. Claramente cualquiera de las dos soluciones no tiene sentido ya que entonces ¿para qué estamos usando Podman?.

Entiendo que hay otras formas de generar los docker image, por ejemplo con Buildah que es una herramienta que se relaciona con el Podman. También usando alternativas como los Maven Plugin de Fabric8, Spotify o Google Jib. Pero este no es mi flujo actual de desarrollo, y no tenía tiempo de cambiarlo.

Además los servidores de producción donde se va a ejecutar finalmente los contenedores no utilizan Podman y quise evitarme un posible dolor de cabeza luego con todo este tema de los permisos.

Instalación Docker CE

Entonces sin más preámbulos, vamos a ver los pasos a realizar para instalar el Docker CE en Fedora 32.

TIP

Normalmente antes de hacer este tipo de cambios en el sistema operativo me gusta actualizar primero todos los paquetes y reiniciar para ver que todo funcione, y así no llevarnos sorpresas más adelante si algo falla por no tener las últimas versiones de algún paquete o del Kernel.

1
2
sudo dnf update -y
sudo reboot

Desinstalar Podman

El primer paso es desinstalar todos los paquetes que está utilizando el Podman para que no vaya a tener conflictos con el Docker CE.

1
2
sudo dnf remove docker-*
sudo dnf config-manager --disable docker-*

CGroups y NFTables

Con la primera actualización del Fedora 32 tuve problemas únicamente con el CGroups pero más adelante sacaron otra actualización cuando ya tenía todo Docker CE funcionando que me afectó, y fue por el NFTables. El Docker CE no soporta la última versión del CGroups ni tiene soporte para NFTables por lo que es necesario ejecutar unos comandos para habilitar el modo de compatibilidad con el CGroups viejo y otros comandos en el Firewalld para que nos permita trabajar bien con la red desde los contenedores.

Para solucionar el CGroups debemos configurar un argumento en el Kernel para que al arrancar deshabilite systemd.unified_cgroup_hierarchy, esto sería con el comando grubby:

1
sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"

Y en el Firewalld hay que colocar las siguientes reglas como permanentes:

1
2
3
sudo firewall-cmd --permanent --zone=trusted --add-interface=docker0
sudo firewall-cmd --permanent --zone=FedoraWorkstation --add-masquerade
sudo firewall-cmd --reload

Instalar Docker CE

El YUM repo de Docker CE no tiene soporte para Fedora 32, este llega hasta el Fedora 31. Hay una alternativa de instalar Moby Engine que viene a ser como una versión Open Source del Docker CE pero yo quería instalar el Docker CE para evitar tener sorpresas. Más adelante es posible que pruebe el Moby Engine, cuando tenga más tiempo.

La solución fue utilizar el repo para Fedora 31, mantener quemada la versión del Fedora en la configuración del repo.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
sudo dnf -y install dnf-plugins-core

sudo tee /etc/yum.repos.d/docker-ce.repo<<EOF
[docker-ce-stable]
name=Docker CE Stable - \$basearch
baseurl=https://download.docker.com/linux/fedora/31/\$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://download.docker.com/linux/fedora/gpg

[docker-ce-stable-debuginfo]
name=Docker CE Stable - Debuginfo \$basearch
baseurl=https://download.docker.com/linux/fedora/31/debug-\$basearch/stable
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/fedora/gpg

[docker-ce-stable-source]
name=Docker CE Stable - Sources
baseurl=https://download.docker.com/linux/fedora/31/source/stable
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/fedora/gpg

[docker-ce-edge]
name=Docker CE Edge - \$basearch
baseurl=https://download.docker.com/linux/fedora/31/\$basearch/edge
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/fedora/gpg

[docker-ce-edge-debuginfo]
name=Docker CE Edge - Debuginfo \$basearch
baseurl=https://download.docker.com/linux/fedora/31/debug-\$basearch/edge
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/fedora/gpg

[docker-ce-edge-source]
name=Docker CE Edge - Sources
baseurl=https://download.docker.com/linux/fedora/31/source/edge
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/fedora/gpg

[docker-ce-test]
name=Docker CE Test - \$basearch
baseurl=https://download.docker.com/linux/fedora/31/\$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/fedora/gpg

[docker-ce-test-debuginfo]
name=Docker CE Test - Debuginfo \$basearch
baseurl=https://download.docker.com/linux/fedora/31/debug-\$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/fedora/gpg

[docker-ce-test-source]
name=Docker CE Test - Sources
baseurl=https://download.docker.com/linux/fedora/31/source/test
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/fedora/gpg

[docker-ce-nightly]
name=Docker CE Nightly - \$basearch
baseurl=https://download.docker.com/linux/fedora/31/\$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/fedora/gpg

[docker-ce-nightly-debuginfo]
name=Docker CE Nightly - Debuginfo \$basearch
baseurl=https://download.docker.com/linux/fedora/31/debug-\$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/fedora/gpg

[docker-ce-nightly-source]
name=Docker CE Nightly - Sources
baseurl=https://download.docker.com/linux/fedora/31/source/nightly
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/fedora/gpg

EOF

TIP

En el archivo /etc/yum.repos.d/docker-ce.repo, solo tengo habilitado el [docker-ce-stable], esto lo pueden observar por la propiedad enabled=1. Pero pongo todos por si alguien necesita usar otro de los repositorios, no tenga que ir a buscarlo.

Después de agregar el repo ejecutamos el makecache, para que cree el caché del DNF con el repo de Docker CE e instalamos los paquetes nuevos:

1
2
sudo dnf makecache
sudo dnf install docker-ce docker-ce-cli containerd.io

Y por último se habilita el servicio de Docker:

1
sudo systemctl enable --now docker.service

Para validar que el servicio inició se puede ejecutar:

1
sudo systemctl status docker.service
Status del docker.service

Status del docker.service

Con la instalación del Docker CE se creó un grupo llamado docker pero no contiene ningún usuario, para poder ejecutar comandos directamente con nuestro usuario sin necesidad de hacerlo como usuario root, se requiere agregar nuestro usuario al grupo.

1
sudo usermod -aG docker $(whoami)

Recuerde salir de la sesión y volver a entrar para que se aplique el nuevo grupo. Luego podemos ejecutar el siguiente comando para ver que tengamos comunicación con el Docker CE.

1
docker version
Docker version

Docker version