Created: 2017-05-04 11:23 Updated: 2017-05-04 11:23

Introdução

Neste artigo vou descrever minha aventura na instalação do Docker no Debian Jessie.

Pré-requisitos

Remova as possíveis instalações antigas:

sudo apt-get purge lxc-docker*
sudo apt-get purge docker.io*

Instale os pacotes adicionais necessários ao Docker:

sudo apt-get install apt-transport-https ca-certificates \
        curl software-properties-common

Adicione a chave pública do repositório ao chaveiro do APT:

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

Adicione o repositório do Docker. Neste caso, há duas opções: criar um arquivo específico para o repositório do Docker ou adicionar o repositório diretamente no arquivo sources.list do sistema. Em qualquer das opções, o resultado é o mesmo, mas eu acho que manter os repositórios extras em arquivos separados parece ser mais "gerenciável", mas isto vai do gosto de cada um. Seguem os dois modos de adição do repositório:

Observe que esta configuração assume que o Debian utilizado é o Jessie (8.x).

Os comandos a seguir independem da opção escolhida para adicionar o repositório do Docker no sistema.

Atualize a lista de pacotes:

sudo apt-get update

Por fim, cerifique-se de que o APT está pronto para obter o Docker do repositório correto (aquele configurado no arquivo /etc/apt/sources.list.d/docker.list/)::

apt-cache policy docker-ce

A saída deste comando deve ser similar à seguinte:

docker-ce:
  Installed: (none)
  Candidate: 17.03.1~ce-0~debian-jessie
  Version table:
     17.03.1~ce-0~debian-jessie 0
        500 https://download.docker.com/linux/debian/ jessie/stable
                amd64 Packages
     17.03.0~ce-0~debian-jessie 0
        500 https://download.docker.com/linux/debian/ jessie/stable
                amd64 Packages

Instalando o Docker

Feitos os preparativos iniciais, atualize a lista de pacotes (se ainda não o fez):

sudo apt-get update

Instale o Docker::

sudo apt-get install docker-ce

Observação: o manual do Docker solicita a criação do grupo de usuários docker, passo que não foi executado aqui porque o pacote Docker-CE para Debian já faz isso automaticamente como parte do processo de instalação.

Habilite o serviço:

sudo systemctl enable docker.service

Inicie o serviço:

sudo systemctl start docker.service

Vamos verificar algumas informações do Docker:

sudo docker info

Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 17.03.1-ce
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 0
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 4ab9917febca54791c5f071a9d1f404867857fcc
runc version: 54296cf40ad8143b62dbcaa1d90e520a2136ddfe
init version: 949e6fa
Kernel Version: 3.16.0-4-amd64
Operating System: Debian GNU/Linux 8 (jessie)
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 3.769 GiB
Name: vctsrv007
ID: STI3:MULG:URZO:TYD6:F3DQ:2VKE:YOMY:3M5L:IECP:WU26:YAUF:F6NT
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
WARNING: No memory limit support
WARNING: No swap limit support
WARNING: No kernel memory limit support
WARNING: No oom kill disable support
WARNING: No cpu cfs quota support
WARNING: No cpu cfs period support
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false

Observe as mensagens de warning. Isto ocorre porque o kernel padrão do Debian no fechamento deste documento (3.16.0-4-amd64) não foi compilado com as opções necessárias. Há, basicamente, duas soluções para este problema: testar o kernel-4.9, obtido no repositório Debian Backports; ou baixar, configurar, compilar e instalar um kernel à partir do código fonte, disponível em http://kernel.org.

Usar um kernel do repositório no Debian Backports facilita o trabalho e é mais rápido, no entanto, pode ser que a versão existente neste repositório não seja a mais atual, mas, mesmo assim, considero a opção mais prática, até porque o Debian costuma aplicar os patches de segurança nos kernels disponíveis em seus repositórios. Além disso, a configuração de um kernel para a compilação não é uma tarefa simples, exigindo conhecimento avançado de hardware e das opções de configuração para compilação. Vamos partir para a instalação do kernel disponível no Debian Backports.

Para instalar o kernel (ou qualquer outro pacote) do repositório Debian Backports, deve-se incluir o repositório backports na lista de repositórios do APT, caso este repositório não tenha sido configurado na instalação. Edite o arquivo /etc/apt/sources.list e adicione as seguintes linha:

# jessie-backports, previously on backports.debian.org
deb http://ftp.br.debian.org/debian/ jessie-backports main contrib non-free
deb-src http://ftp.br.debian.org/debian/ jessie-backports main contrib non-free

Atualize a lista de pacotes:

sudo apt-get update

Consulte as versões de kernel disponíveis agora:

apt-get search linux-image
linux-headers-3.16.0-4-amd64 - Header files for Linux 3.16.0-4-amd64
linux-image-3.16.0-4-amd64 - Linux 3.16 for 64-bit PCs
linux-image-3.16.0-4-amd64-dbg - Debugging symbols for Linux \
            3.16.0-4-amd64
linux-image-amd64 - Linux for 64-bit PCs (meta-package)
linux-image-amd64-dbg - Debugging symbols for Linux amd64 \
            configuration (meta-package)
nvidia-kernel-3.16.0-4-amd64 - NVIDIA binary kernel module for \
            Linux 3.16.0-4-amd64
linux-headers-4.9.0-0.bpo.2-amd64 - Header files for Linux \
            4.9.0-0.bpo.2-amd64
linux-headers-4.9.0-0.bpo.2-rt-amd64 - Header files for \
            Linux 4.9.0-0.bpo.2-rt-amd64
linux-image-4.9.0-0.bpo.2-amd64-dbg - Debugging symbols for \
            Linux 4.9.0-0.bpo.2-amd64
linux-image-4.9.0-0.bpo.2-amd64-unsigned - Linux 4.9 for 64-bit \
            PCs
linux-image-4.9.0-0.bpo.2-rt-amd64-dbg - Debugging symbols for \
            Linux 4.9.0-0.bpo.2-rt-amd64
linux-image-4.9.0-0.bpo.2-rt-amd64-unsigned - Linux 4.9 for \
            64-bit PCs, PREEMPT_RT
linux-headers-4.9.0-2-grsec-amd64 - Header files for Linux \
            4.9.0-2-grsec-amd64
linux-image-4.9.0-2-grsec-amd64 - Linux 4.9 for 64-bit PCs, \
            Grsecurity protection
linux-image-grsec-amd64 - Linux image meta-package, grsec \
            featureset
linux-image-rt-amd64 - Linux for 64-bit PCs (meta-package), \
            PREEMPT_RT
linux-image-rt-amd64-dbg - Debugging symbols for Linux \
            rt-amd64 configuration (meta-package)
linux-image-4.9.0-0.bpo.2-amd64 - Linux 4.9 for \
            64-bit PCs (signed)
linux-image-4.9.0-0.bpo.2-rt-amd64 - Linux 4.9 for 64-bit PCs, \
            PREEMPT_RT (signed)

Instale a versão 4.9.0-0 do kernel e também os headers, para o caso de ser necessário compilar algum módulo futuramente (observe a flag -t jessie-backposts, que informa ao comando apt-get que o pacote deve ser instalado à partir do repositório Debian Backports):

sudo apt-get install -t jessie-backports \
                     linux-image-4.9.0-0.bpo.2-amd64 \
                     linux-headers-4.9.0-0.bpo.2-amd64

Reinicie o sistema. Depois de reiniciado, verifique a versão do kernel em execução:

uname -a
Linux vctsrv007 4.9.0-0.bpo.2-amd64 #1 SMP
        Debian 4.9.18-1~bpo8+1 (2017-04-10) x86_64 GNU/Linux

Tente iniciar o Docker, mas provavelmente ele irá falhar:

sudo systemctl start docker.service
Job for docker.service failed. See 'systemctl status docker.service' \
        and 'journalctl -xn' for details.

Isto ocorre porque trocamos o kernel. Neste caso, será necessário remover todo o conteúdo do diretório /var/lib/docker/, mas atenção, todas as imagens instaladas no Docker serão perdidas (não é um problema neste caso, porque ainda não instalamos nenhuma imagem, mas fica a dica):

rm -rf /var/lib/docker/*

Agora, inicie o Docker:

systemctl start docker.service

Consulte novamente as informações do Docker:

docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 17.03.1-ce
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 4ab9917febca54791c5f071a9d1f404867857fcc
runc version: 54296cf40ad8143b62dbcaa1d90e520a2136ddfe
init version: 949e6fa
Kernel Version: 4.9.0-0.bpo.2-amd64
Operating System: Debian GNU/Linux 8 (jessie)
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 3.761 GiB
Name: vctsrv007
ID: STI3:MULG:URZO:TYD6:F3DQ:2VKE:YOMY:3M5L:IECP:WU26:YAUF:F6NT
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
WARNING: No swap limit support
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false

Ainda há uma mensagem de warning: "No swap limit support". Esta mensagem indica que o Docker é incapaz de impor um limite na quantidade de swap que os processos em execução no container estão usando. Para habilitar este suporte, é preciso que o kernel seja compilado com as opções MEMCG_SWAP_ENABLED e CGROUP_FREEZER. O kernel do Debian Backports usado na instalação (4.9.0-0.bpo.2-amd64) não foi compilado com a opção MEMCG_SWAP_ENABLED.

Esta mensagem não tem nenhuma relação com a existência de espaço para swap no sistema operacional e, exceto para os casos onde houver containers concorrentes e que deva ser garantido swap isolado entre eles, esta mensagem pode ser ignorada com segurança.

Com a instalação finalizada, já podemos testar o Docker.

Teste do Docker

Para testar o Docker, pode-se utilizar uma imagem diretamente do repositório Docker Hub:

sudo docker run hello-world

Se corretamente instalado e operacional, uma mensagem similar à seguinte deve ser apresentada:

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
78445dd45222: Pull complete
Digest: sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

Liste as imagens do Docker:

docker images

REPOSITORY  TAG     IMAGE ID      CREATED        SIZE
hello-world latest  48b5124b2768  3 months ago   1.84 kB

Com isso, a instalação do Docker está finalizada e operando normalmente.

Se desejado, pode-se remover a imagem de teste:

docker rmi -f 48b5124b2768
Untagged: hello-world:latest
Untagged: hello-   world@sha256:
        c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7
Deleted: sha256:\
        48b5124b2768d2b917edcb640435044a97967015485e812545546cbed5cf0233

Agora não há nenhuma imagem instalada:

docker images
REPOSITORY  TAG      IMAGE ID   CREATED          SIZE