Imagem de Valdas Miskinis por Pixabay |
Introdução
Docker é um sistema de conteinerização que permite aos desenvolvedores e equipes lidar com a implantação e dimensionamento de aplicativos de uma maneira muito mais fácil.
Assim como o nome sugere, podemos pensar em um contêiner como um sistema isolado que contém tudo o que é necessário para executar um determinado aplicativo em uma determinada configuração.
As imagens podem ser pré-construídas, recuperadas de registros, criadas a partir de registros já existentes, combinadas, iniciadas por meio de uma rede comum, etc.
Veremos a diferença entre uma imagem e um contêiner, como eles se relacionam e como esses dois conceitos nos permitem tornar um aplicativo independente e pronto para ser implantado.
Imagens e recipientes
Podemos pensar em imagens e contêineres como dois estados diferentes do mesmo conceito subjacente. Basicamente, podemos dizer que um container é uma instância em execução de uma imagem que empacota e representa um determinado aplicativo. Para fins de analogia, vamos voltar às classes e objetos Java. Um contêiner pode ser visto como um objeto e uma imagem pode ser vista como a classe.
As imagens são usadas para iniciar os contêineres. A partir de contêineres em execução, podemos obter imagens, e tudo isso pode ser composto em conjunto para formar uma maneira muito poderosa e independente do sistema de empacotar e implantar aplicativos. Gosto de pensar nisso quase como "enviar seu host local". Por quê? Como o Docker requer que todas as configurações necessárias para executar um aplicativo estejam contidas e instaladas em uma imagem, criar uma imagem é essencialmente replicar o estado de execução atual do ambiente e do aplicativo, agrupando-o e disponibilizando-o na nuvem.
Então, para recapitular:
- As imagens podem ser recuperadas de registros que contêm várias imagens pré-construídas para serem usadas pelos desenvolvedores para construir imagens mais complexas.
- Os contêineres podem ser vistos como instâncias em execução de imagens. É possível orquestrar vários contêineres para serem iniciados e interrompidos como um "serviço agrupado", o que permite efetivamente que aplicativos inteiros sejam estruturados como um cluster de contêineres Docker relacionados.
Dockerfile - A maneira de encaixar um aplicativo
Para encaixar um aplicativo, o fluxo que seguimos é criar uma imagem Docker que é construída sobre uma já existente e contém, por exemplo, nosso aplicativo JAR ou o script de inicialização de um aplicativo Python como seu comando de inicialização.
Um comando de inicialização para um contêiner é o comando que será executado quando o contêiner for iniciado. Portanto, essencialmente, a instância em execução de nossa imagem se torna o contêiner que executa nosso aplicativo.
Um Dockerfile é uma especificação que usamos para construir um novo contêiner a partir de uma imagem pré-construída e adicionar nossa lógica customizada para iniciar nosso aplicativo. Em um Dockerfile, usamos o comando docker build para construir uma imagem.
Um Dockerfile funciona em camadas. A primeira camada começa com a palavra-chave FROM e define qual imagem pré-construída usar para construir nossa própria imagem. Posteriormente, podemos definir mais coisas como permissões de usuário, quais arquivos copiar para o contêiner do sistema local (pense, por exemplo, o requirements.txt de um aplicativo da web Python) e quais scripts de inicialização executar. Abaixo está um exemplo de Dockerfile:
FROM python:3 WORKDIR /usr/src/app COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD [ "python", "./your-daemon-or-script.py" ]
Vamos revisar o conteúdo deste Dockerfile simples e ver o que está acontecendo.
A primeira linha, FROM python: 3
, está declarando que a imagem que vamos construir se expandirá na imagem base que contém todo o tempo de execução necessário para executar aplicativos baseados em Python 3.
Todos os comandos após este serão aplicados sobre a imagem Python 3 já existente e, como resultado, criaremos nossa própria imagem personalizada Python 3 que contém nosso aplicativo.
WORKDIR
define o diretório de trabalho. O diretório especificado será assumido para qualquer outro comando que segue no Dockerfile e onde nosso aplicativo está. Nos comandos CMD
e COPY
abaixo, o diretório . refere-se ao WORKDIR.
Posteriormente, o comando COPY
é usado para copiar arquivos de nosso sistema de arquivos local, onde está o Dockerfile, para o contêiner para que esses arquivos estejam prontamente disponíveis em nossa imagem.
O comando RUN
é autodescritivo e executa um determinado comando, que, neste exemplo, está instalando nossas dependências.
Finalmente, o comando CMD
define o comando de inicialização a ser executado quando o contêiner é iniciado; neste caso, simplesmente iniciaremos nosso aplicativo.
Conclusão
Esses conceitos básicos são a base sobre a qual o Docker desenvolve recursos adicionais. Depois de conhecer esses conceitos, você pode aprender qualquer outra coisa. Agora você pode construir suas próprias imagens e entender o que verá quando encontrar um Dockerfile em um projeto do Docker.
Por último, mas não menos importante, você pode encontrar muitas imagens oficiais pré-construídas no Docker Hub.
A seguir, veremos como empacotar um aplicativo Springboot simples com o Docker e apresentaremos o comando docker-compose
e o arquivo docker-compose.
Fonte: Intro to Docker - Containers, images, and the Dockerfile
Licença: Creative Commons -Attribution -ShareAlike 4.0 (CC-BY-SA 4.0)
0 comentários:
Postar um comentário