Blog Linux Avante

Como instalar o Docker no Fedora 32 ou 31 (e alternativas)

9 de dezembro de 2020

Logotipo Fedora

[Editado]: Docker 20.10 adicionou suporte para cgroups v2 e firewalld, portanto, este artigo está obsoleto. Para saber como instalar o Docker no Fedora, consulte a documentação oficial. O Fedora 31 mudou para cgroup v2, sendo a primeira grande distribuição Linux a fazer isso. No entanto, o Docker não oferece suporte ao cgroup v2, portanto, ele não funciona na versão mais recente do Fedora. Este artigo explica suas opções e como instalar o Docker no Fedora 31 se você não gostar das alternativas. Originalmente, era para o Fedora 31, mas tudo neste artigo também se aplica ao Fedora 32; não há repositório Docker CE para Fedora 32, mas usaremos o repositório Fedora 31.

cgroup (grupo de controle) é um recurso do kernel Linux que organiza os processos hierarquicamente e distribui os recursos do sistema ao longo da hierarquia de maneira controlada e configurável. cgroup v2 apareceu pela primeira vez no kernel Linux 4.5 e, ao contrário da v1, possui apenas uma única hierarquia de processo e discrimina processos, não threads. Eu recomendo ler este artigo no Fedora 31 e no grupo de controle v2.

Desde que o Fedora 31 (e o Fedora 32) mudou para cgroups v2, o Docker não funciona mais. Por exemplo, este erro aparece em meu sistema Fedora 31 ao tentar executar um contêiner usando o Docker:

docker: Error response from daemon: OCI runtime create failed: container_linux.go:346: starting container process caused "process_linux.go:297: applying cgroup configuration for process caused \"open /sys/fs/cgroup/docker/cpuset.cpus.effective: no such file or directory\"": unknown.

No Fedora 32, recebo este erro:

docker: Error response from daemon: cgroups: cgroup mountpoint does not exist: unknown.

Então, o que você pode fazer agora que o Fedora 32 e 31 usam cgroups v2 e o Docker não funciona mais? Você encontrará algumas opções abaixo, incluindo uma solução alternativa para instalar o Docker CE. Como de costume, todas as instruções foram testadas antes de postá-las no LinuxAvante.

Opção nº 1: use o Podman em vez do Docker no Fedora 32 ou 31

Ferramenta Pod Manager (podman) é um mecanismo de contêiner compatível com cgroup v2 apoiado pela RedHat que implementa quase todos os comandos Docker CLI e não requer um daemon para executar contêineres e pods. Esta é a opção recomendada pelo Fedora.

O Podman é instalado por padrão no Fedora 32 e 31, então não há nada que você precise fazer para usá-lo. Basta executar podman em vez de docker, por exemplo:

Comandos para usar no terminal

podman run --rm hello-world:latest

Opção 2: Mude para cgroup v1, instale e use Moby Engine ou Docker CE no Fedora 32 ou 31

Mude para cgroup v1.

Além de usar o Podman (opção #1), você tem a opção de mudar seu sistema Fedora 32 ou 31 para cgroup v1, passando o parâmetro de kernel systemd.unified_cgroup_hierarchy=0.

Isso pode ser feito (permanentemente) a partir da linha de comando da seguinte maneira:

Comandos para usar no terminal

sudo dnf install grubby

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

Depois disso, reinicie o sistema e agora você terá a opção de usar moby-engine (inclui Docker CLI e o Docker Engine) ou Docker CE.

Caso queira desfazer esta alteração posteriormente, passe o parâmetro do kernel systemd.unified_cgroup_hierarchy sem argumento ou com true como argumento. Isso reativa o uso da hierarquia unificada do cgroup (cgroup v2), por exemplo:

Comandos para usar no terminal

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

Use moby-engine em vez de Docker

O Docker foi removido do Fedora 32 e 31, sendo substituído pelo moby-engine (ambos ainda não suportam cgroups v2). Caso você não esteja familiarizado com o Moby e sua relação com o Docker, recomendo a leitura deste artigo.

Para instalar moby-engine (inclui Docker CLI e o Docker Engine) no Fedora 32 ou 31, habilite e inicie seu daemon, use:

Comandos para usar no terminal

sudo dnf install moby-engine

sudo systemctl enable --now docker

Você também pode adicionar seu usuário ao grupo docker para não ter que executá-lo com privilégios de superusuário:

Comandos para usar no terminal

sudo usermod -aG docker $(whoami)

Depois disso, você precisará reiniciar seu sistema para usar moby-engine sem privilégios de superusuário (por exemplo, sudo).

Agora você pode usar moby-engine como Docker, por exemplo:

Comandos para usar no terminal

docker run --rm hello-world:latest

Apenas me mostre como instalar o Docker CE no Fedora 32 ou 31!

Como moby-engine, Docker Engine - Community não suporta cgroup v2, então mude para cgroup v1 conforme explicado acima antes de prosseguir.

Se você deseja instalar, use Docker CE, remova moby-engine caso você tenha instalado anteriormente:

Comandos para usar no terminal

sudo dnf remove moby-engine

Agora você pode adicionar o repositório Docker CE Fedora:

  • Para Fedora 31:

Comandos para usar no terminal

sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo

  • Para Fedora 32 (não há repositório Docker CE para Fedora 32, então usaremos o repositório Fedora 31):

Comandos para usar no terminal

sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo

sudo sed -i 's/$releasever/31/g' /etc/yum.repos.d/docker-ce.repo

Agora você pode instalar o Docker CE no Fedora 32 e no 31 (isso também instalará docker-ce-cli e containerd.io), habilite e inicie seu daemon:

Comandos para usar no terminal

sudo dnf install docker-ce

sudo systemctl enable --now docker

Você também pode querer adicionar seu usuário ao grupo docker para que não precise executar o Docker com privilégios de superusuário:

Comandos para usar no terminal

sudo usermod -aG docker $(whoami)

Depois disso, você precisará reiniciar o sistema para usar o Docker sem privilégios de superusuário (por exemplo, sudo).

Etapa extra para Fedora 32: consertar rede dentro de contêineres Docker (daqui - isso menciona que no Fedora 32, executar ping em qualquer destino funciona de dentro de um contêiner Docker, mas as conexões tcp/udp não funcionaram, mas para mim o ping não funcionou antes disso):

Comandos para usar no terminal

firewall-cmd --permanent --zone=trusted --add-interface=docker0

firewall-cmd --reload

Fontes extras (além das já vinculadas no artigo):

Confira a versão original desse post em inglês
Propaganda
Blog Comments powered by Disqus.
Propaganda