Docker em plataformas ARM
Com a parceria estratégica entre a Docker e Arm, para levar a tecnologia de contêineres para dispositivos de IoT, a Docker realizou a simplificação na forma de desenvolvimento de aplicativos em plataformas com arquiteturas ARM, aumentando a portabilidade e a implantação de softwares embarcados [1]. Para criar uma image para plataforma ARM é necessário está em um sistema com essa arquitetura, entretanto com a ferramenta buildx pode-se criar várias imagens com arquiteturas diferentes a partir de único host.
Em um ambiente Linux, realize a instalação do buildx, o repositório da ferramenta está disponível na plataforma de versionamento distribuído GitHub, pode-se baixar a ferramenta de acordo com a versão do Sistema Operacional. Será utilizado para criar as imagens uma máquina com arquitetura amd64 e Sistema Operacional Xubuntu 18.04, mas os procedimentos podem ser realizados em um Raspberry PI.
Realize o download da ferramenta com o comando abaixo:
curl -OL https://github.com/docker/buildx/releases/download/v0.3.1/buildx-v0.3.1.linux-amd64
Após o download da ferramenta buildx, crie o diretório cli-plugins
e copie o binário:
mkdir ~/.docker/cli-plugins/ &&
chmod +x buildx-v0.3.1.linux-amd64 &&
cp buildx-v0.3.1.linux-amd64 ~/.docker/cli-plugins/docker-buildx
Visualize se a instalação foi realizada com sucesso:
docker buildx --help
Instale o pacote qemu-user-static
que é um emulador de processador muito eficiente, que suporta vários tipos de processadores [2].
sudo apt-get install qemu-user-static
Crie uma instância de construção de arquitetura múltipla:
docker buildx create --name frbuilder &&
docker buildx use frbuilder &&
docker buildx inspect --bootstrap
Para verificar quais arquiteturas a imagem Docker permitir execução:
docker buildx imagetools inspect nginx:alpine
Utilize os arquivos Dockerfile
e index.html
para gera as imagens:
FROM nginx:alpine
LABEL "author"="Francisco Chaves"
COPY ./index.html /usr/share/nginx/html/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>My site</title>
<link href="https://fonts.googleapis.com/css?family=Roboto&display=swap" rel="stylesheet">
<style>
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.container {
background-color: rgb(101, 47, 252);
height: 100vh;
width: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.item {
font-size: 2rem;
font-family: 'Roboto', sans-serif;
}
.animation-target {
animation: animation 1000ms linear infinite both;
}
/* Generated with Bounce.js. Edit at http://bouncejs.com#%7Bl%3A1%2Cs%3A%5B%7BT%3A%22c%22%2Ce%3A%22s%22%2Cd%3A1000%2CD%3A0%2Cf%3A%7Bx%3A1%2Cy%3A1%7D%2Ct%3A%7Bx%3A3%2Cy%3A3%7D%2Cs%3A3%2Cb%3A4%7D%5D%7D */
@keyframes animation {
0% {
transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
}
3.2% {
transform: matrix3d(1.53, 0, 0, 0, 0, 1.53, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
}
6.41% {
transform: matrix3d(1.661, 0, 0, 0, 0, 1.661, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
}
12.71% {
transform: matrix3d(1.425, 0, 0, 0, 0, 1.425, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
}
18.92% {
transform: matrix3d(1.138, 0, 0, 0, 0, 1.138, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
}
25.23% {
transform: matrix3d(0.997, 0, 0, 0, 0, 0.997, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
}
31.43% {
transform: matrix3d(0.969, 0, 0, 0, 0, 0.969, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
}
56.46% {
transform: matrix3d(1.001, 0, 0, 0, 0, 1.001, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
}
81.48% {
transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
}
100% {
transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
}
}
</style>
</head>
<body>
<div class="container">
<div class="item">
<h1 class="animation-target">My site</h1>
</div>
</div>
</body>
</html>
Construa as imagens e envie para o Docker Hub (necessário login):
docker buildx build --platform linux/arm,linux/arm64,linux/amd64 -t franciscojsc/my-site . --push
As images criadas no Docker Hub:
Execute o container:
docker run --name my-site -it --rm -p 8080:80 franciscojsc/my-site
Acesse a URL localhost:8080
e visualize o resultado:
Valeu pessoal
Referências
-
TSAI, Tim. Getting started with Docker for Arm on Linux. DOCKER INC. 7 jun. 2019. Disponível em: https://engineering.docker.com/2019/06/getting-started-with-docker-for-arm-on-linux/. Acesso em: 27 nov. 2019.
-
Pacote: qemu-user-static (1: 4.1-2 e outros). DEBIAN. Disponível em: https://packages.debian.org/pt-br/sid/qemu-user-static. Acesso em: 28 nov. 2019.