Como usar uma janela de encaixe no seu Raspberry Pi

O Raspberry Pi é ideal para instalar todos os tipos de programas que sempre devem ser executados. A maneira mais confiável de fazer isso é com o Docker: dessa forma, cada programa é executado isolado em um contêiner, para que não possam interferir um no outro. Mostraremos como usar o Docker em um Raspberry Pi e no que você deve prestar atenção.

Se você já tem um Raspberry Pi há algum tempo, é provável que continue instalando mais e mais softwares nele. Home Assistant, Zwave2Mqtt, Node-RED, Rhasspy ... Tudo está indo bem, até que você atualize todo o seu software para uma nova versão e, de repente, um dos seus programas pare de funcionar e dê uma vaga mensagem de erro.

O que aconteceu? Um cenário comum é o seguinte. Os softwares A e B usam a versão 1.0 da biblioteca C. Enquanto isso, a versão 2.0 da biblioteca C é lançada, que é incompatível com C 1.0. O software A está sendo reescrito para usar a biblioteca C 2.0, enquanto os desenvolvedores do software B não são tão rápidos e ficarão com a biblioteca C 1.0 por um tempo. Você atualiza o software A e instala a biblioteca C 2.0. Mas o Raspbian só pode instalar uma versão da biblioteca. Como resultado, o software B de repente não funciona mais, porque não é compatível com a biblioteca C 2.0.

Na prática, as distribuições Linux fazem todo o possível para evitar esse tipo de situação, mas acontece. Às vezes, de maneiras muito mais sutis, então nem sempre é imediatamente óbvio o que está causando o problema.

01 O que é Docker?

O Docker torna mais fácil para os desenvolvedores distribuir aplicativos para que você possa executá-los em qualquer sistema Linux. Esses aplicativos podem ser encontrados na forma de uma imagem no Docker Hub. Essa imagem é basicamente um modelo para um sistema Linux mínimo, que pode ser executado no Raspbian na forma de um contêiner.

Cada contêiner é completamente isolado de outros contêineres. Portanto, o aplicativo em um contêiner não vê os aplicativos em outros contêineres. E instalar e atualizar um contêiner garante que a nova versão não entre em conflito com aplicativos em outros contêineres. Portanto, se você deseja executar mais do que um punhado de aplicativos em seu Raspberry Pi, o Docker o ajudará a fazer isso de forma confiável. Graças ao Docker, você também pode experimentar com segurança um novo software: se não gostar, apenas apague o contêiner depois.

02 Instale o Docker

Presumimos que você tenha o Raspbian instalado, a versão Lite será suficiente. Em seguida, efetue login via ssh para executar os comandos neste curso básico. Primeiro, instale o Docker com o comando:

curl -sSL //get.docker.com | sh

Em seguida, dê ao usuário pi (com o qual você está conectado) acesso ao Docker, para que você não execute todos os comandos do Docker com o comando sudo deve realizar:

sudo usermod pi -aG docker

Efetue logout com exit e, em seguida, efetue login novamente. Agora o usuário pertence pi para o grupo docker.

03 olá mundo

Agora você deve conseguir inicializar um primeiro contêiner do Docker:

docker run --rm hello-world

Este comando executará o contêiner do Docker hello-world. Este contêiner mostra em sua saída o que exatamente acontece: a imagem não é encontrada em seu Raspberry Pi e é então baixada pelo Docker do Docker Hub. Em seguida, o Docker cria um contêiner com base nessa imagem e executa o programa nele. Por opção -rm o contêiner é limpo depois que o programa é fechado. Agora você sabe que o Docker está instalado e funcionando corretamente.

Hypriot

Vamos simplesmente instalar o Docker no Raspbian neste tutorial básico, mas outros sistemas operacionais também são possíveis se você estiver interessado no Docker no Raspberry Pi. Por exemplo, existe Hypriot: um sistema operacional para o Raspberry Pi que é otimizado para usar o Docker. Você só precisa instalar esta imagem no cartão micro-SD do seu Raspberry Pi para começar a usar o Docker imediatamente. Hypriot é especialmente interessante se você estiver apenas executando contêineres Docker em seu Raspberry Pi e nada mais.

04 Criar contêineres

O básico de trabalhar com contêineres Docker é feito com o comando docker, como mostramos na etapa anterior. Normalmente, com o Docker, você não deseja executar um contêiner e encerrá-lo imediatamente, mas deixe-o em execução. Portanto, não usamos a opção --rm. Além disso, você deseja que o contêiner seja executado em segundo plano, sem ver a saída na tela o tempo todo. A opção -d.

Se você iniciar um contêiner dessa maneira, o Docker dará a ele um nome aleatório, o que não é útil se você tiver mais do que um punhado de contêineres. Com a opção --nome nome você, portanto, dá ao contêiner um nome fixo.

Em seguida, você também deve olhar para as conexões de rede. Uma vez que cada contêiner Docker é isolado, você não pode simplesmente acessar, por exemplo, um servidor web rodando na porta 80 em um contêiner. Portanto, você deve instruir o Docker a encaminhar todas as solicitações na porta 8888 no Raspberry Pi, por exemplo, para a porta 80 em um contêiner específico. Você faz isso com a opção -p 8888: 80. Colocando todas essas opções juntas para o recipiente de amostra containous / whoami, execute o seguinte comando:

docker run -d --name whoami -p 8888: 80 containous / whoami

Se tudo correr bem, depois de um tempo, você verá uma longa sequência de números hexadecimais (como 5122c935ce5178751a59699d2c5605c607700bd04e5f57a6c18de434ae53956e) Este é o ID do contêiner. Se agora você navega em seu navegador da web para // IP: 8888 com em vez de IP o endereço IP do seu Raspberry Pi, você verá uma página da web que é gerada pelo servidor da web no contêiner.

05 Visualize seus contêineres

Depois de inicializar alguns contêineres como este, o gerenciamento começa a se tornar importante. Em primeiro lugar, é útil ver quais contêineres estão em execução:

docker ps

Você verá então informações sobre todos os contêineres que estão ativos (com a opção -uma incluindo os contêineres que pararam). A primeira coluna contém um ID exclusivo para cada contêiner, ao lado dela a imagem a partir da qual o contêiner foi criado. A coluna STATUS melhor se você tiver problemas. Por exemplo, se o seu contêiner continua reiniciando devido a um problema, você o verá aqui.

Na coluna PORTOS você vê as portas usadas. Por exemplo, na frente de nosso contêiner, whoami está 0.0.0.0:8888->80/tcp. Isso significa que a porta tcp 8888 no Raspberry Pi será redirecionada para a porta tcp 80 no contêiner. Na última coluna, você vê o nome do contêiner, que pode ser usado em outros comandos do Docker.

Se você quiser mais informações, vem o comando docker stats útil. Em seguida, você verá estatísticas para cada contêiner, como o consumo do processador, memória e rede. Se você quiser todas as informações que o Docker sabe sobre um contêiner específico, execute este comando com o ID ou nome do contêiner:

docker inspect CONTAINER

E, finalmente, se você deseja visualizar os registros de um contêiner, execute um destes dois comandos:

registros do docker CONTAINER

docker logs -f CONTAINER

Com a opção -f siga os logs em tempo real à medida que o contêiner os gera.

06 Gerenciar seus contêineres e imagens

Se quiser parar, iniciar ou reiniciar um contêiner em execução, você pode fazer isso facilmente com estes comandos, respectivamente:

docker stop CONTAINER

docker lançar CONTAINER

docker reiniciar CONTAINER

Se você quiser pausar temporariamente um contêiner (todos os programas nele serão temporariamente 'congelados'), execute este comando:

pausa do docker CONTAINER

Após este comando, todos os programas no contêiner serão executados novamente:

docker retomar CONTAINER

Com o comando imagens docker você verá a lista de imagens que o Docker baixou. Para o nosso contêiner whoami, veja na coluna REPOSITÓRIO o texto contencioso / whoami em pé e na coluna MARCAÇÃO arquibancadas Mais recentes. O nome completo da imagem seria contencioso / whoami: mais recente são, mas aqueles Mais recentes é o valor padrão da tag, portanto, pode ser omitido. É por isso que, em nossa tarefa na seção 4, nós docker run somente contencioso / whoami como uma imagem.

Na coluna CRIADA veja há quanto tempo esta imagem foi baixada. Para atualizar esta imagem, execute o seguinte comando:

docker pull containous / whoami: mais recente

O Docker então baixa a versão mais recente da imagem ou informa que a imagem está atualizada. Se você fizer de novo depois imagens docker você verá que uma imagem foi adicionada.

Mas o contêiner de whoami atual ainda usa a imagem antiga. Para atualizar isso, pare (docker pare whoami) e excluir (docker rm wohami) você cria o contêiner e o recria usando o comando docker run da seção 4.

Limpar

Se você atualizar regularmente suas imagens do Docker para executar a versão mais recente em um contêiner, as imagens antigas permanecerão. O cartão micro-SD do seu Raspberry Pi com capacidade de no máximo algumas dezenas de gigabytes pode encher rapidamente, especialmente se você usar contêineres grandes. Por exemplo, contêineres como os do Home Assistant e Rhasspy têm mais de um gigabyte de tamanho. Agora, o Docker funciona com um sistema de forma que, com uma atualização, nem aquele gigabyte completo seja baixado e armazenado novamente, mas depois de muitas atualizações, o armazenamento necessário continua a aumentar. Com o comando docker rmi IMAGE_ID exclua uma imagem com base no ID que você especificar na saída do comando imagens docker encontra. Docker também conhece o comando podar imagem docker que remove todas as imagens que não são usadas por um contêiner. Do podar sistema docker também remova contêineres parados, redes não usadas por pelo menos um contêiner e arquivos de cache.

07 Volume

Nosso contêiner de exemplo whoami não usou nenhum dado ou dado de configuração. Mas você pode compartilhar um diretório em seu Raspberry Pi com um contêiner do Docker para que ele possa acessar seus dados. O Docker chama esse diretório compartilhado de volume.

Se você for trabalhar com vários contêineres em seu Raspberry Pi, é recomendável que você coloque seus diretórios todos juntos. Crie um diretório para isso, por exemplo com:

mkdir -p / home / pi / containers / nginx / data

Em seguida, coloque na pasta containers / nginx / data um arquivo index.html com uma página html.

Agora você pode iniciar um contêiner com nginx (um servidor da web) com o qual você compartilha este diretório:

docker run -d --name nginx -p 8080: 80 -v / home / pi / containers / nginx / data: / usr / share / nginx / html: ro nginx

Em seguida, o contêiner é iniciado com o servidor da web e monta o diretório / home / pi / containers / nging / data no seu Raspberry Pi no recipiente no local / usr / share / nginx / html, com permissões somente leitura (ro significa somente leitura). Se você surfar agora para IP: 8080 você pega o arquivo html index.html ver.

08 Docker Compose

Até agora, iniciamos manualmente os contêineres do Docker com o comando docker run. Mas se você estiver executando mais alguns contêineres do Docker e quiser alterar sua configuração regularmente, uma abordagem diferente é melhor: colocar tudo em um arquivo de configuração. Isso acontece com o Docker Compose.

Para fazer isso, primeiro instale o gerenciador de pacotes pip do Python e, em seguida, o Docker Compose (que é um programa Python) com estes comandos:

sudo apt install python3-pip

sudo pip3 install docker-compose

Agora você pode configurar vários contêineres Docker em um arquivo docker-compose.yml fazer. Para fazer isso, crie um arquivo Docker Compose com:

nano docker-compose.yml

Coloque lá a seguinte configuração para nossos contêineres de exemplo whoami e nginx:

versão: '3.7'

Serviços:

Quem sou eu:

imagem: containous / whoami

container_name: whoami

reiniciar: sempre

porta:

- 8888:80

nginx:

imagem: nginx

container_name: nginx

reiniciar: sempre

porta:

- 8080:80

volume:

- / home / pi / containers / nginx / data: / usr / share / nginx / html: ro

09 YAML

Salve o arquivo com Ctrl + O e saia do nano com Ctrl + X. Este é um arquivo YAML (com a extensão .yml). YAML (significa a abreviação recursiva "YAML Ain't Markup Language") é um formato de arquivo para definir os dados de configuração de forma legível. Mais informações podem ser encontradas no site oficial.

Você pode ver neste arquivo que definimos dois containers como serviços. Para cada container, definimos a imagem usada, o nome que o container deve receber e se o container deve reiniciar automaticamente em caso de problemas. Além disso, também definimos as portas redirecionadas e os volumes.

Você também pode encontrar todas essas informações nas linhas de comando com docker run, mas neste arquivo Docker Compose é um pouco mais organizado.

10 Trabalhando com Docker Compose

Depois de ter um arquivo docker-compose.yml você pode criar e executar facilmente os contêineres definidos nele:

docker-compose up -d

Depois disso, você pode gerenciar esses contêineres com o comando docker, mas o próprio docker-compose também tem muitas opções específicas para gerenciar contêineres que você criou com o Docker Compose. É assim que você limpa tudo com o seguinte comando, todos os contêineres definidos serão interrompidos e excluídos:

docker compor down

Você também pode acompanhar os registros de todos os contêineres com:

docker-compose logs -f

Cada contêiner exibe suas mensagens de log em uma cor diferente. O Docker Compose também tem uma melodia familiar para interromper, iniciar e reiniciar todos os contêineres:

docker compose stop

docker compose start

docker compose restart

Atualize todos os contêineres em seu arquivo Docker Compose com os dois comandos a seguir:

docker compose pull

docker compose restart

O primeiro comando baixará novas imagens para todos os contêineres que você definiu e o segundo comando reinicializará todos esses contêineres para que usem a nova imagem. Depois disso, você pode excluir as imagens antigas se desejar com:

podar imagem docker

11 e além

Você pode encontrar imagens Docker de muitos aplicativos no Docker Hub. Em LinuxServer.io, você também encontrará dezenas de imagens Docker mantidas por voluntários. Essas imagens são bem mantidas e documentadas e todas usam uma abordagem e infraestrutura básica semelhantes.

Tente se limitar a imagens 'oficiais' do Docker, que são fornecidas pelo próprio projeto, ou imagens de partes confiáveis, como LinuxServer.io. Porque, em princípio, qualquer pessoa pode publicar imagens do Docker no Docker Hub, mas elas nem sempre são atualizadas.

A arquitetura de processador certa

É importante que você baixe as imagens do Docker para a arquitetura de processador correta. O Raspberry Pi tem um processador ARM, que não é compatível com os processadores Intel ou AMD encontrados nos PCs. Muitas imagens do Docker são publicadas para baixar automaticamente a versão correta para a arquitetura do seu processador. No Docker Hub, você encontrará quais arquiteturas são suportadas na página de imagem do Docker desejada. Para Raspbian, é arm32v7, arm / v7 ou armhf. Se você receber a mensagem de erro ao iniciar um contêiner do Docker: erro de formato exec você provavelmente baixou uma imagem da arquitetura de processador errada. Se isso acontecer, você precisará baixar uma imagem com uma tag diferente. Por exemplo, o projeto motionEye distribui sua imagem oficial do Docker com duas tags possíveis: você executa ccrisan / motioneye: master-amd64 em processadores compatíveis com Intel e ccrisan / motioneye: master-armhf em um Raspberry Pi.

Postagens recentes