Compreendendo o Dockerfile

Compreendendo o Dockerfile
Você concordará comigo que o impacto que Docker está tendo no mundo da tecnologia é enorme. Está salvando desenvolvedores de software e administradores de sistemas.

Neste artigo, você estará aprendendo sobre uma parte muito crucial de toda a configuração do Docker, o Dockerfile. O DockerFile usa uma estrutura simples. Embora essa simplicidade seja uma coisa boa, dá espaço para os indivíduos apenas hackearem os comandos, sem entender completamente o impacto.

No final deste artigo, você terá uma melhor compreensão do Dockerfile. Então, você poderá escreverfiles de docker que você entende.

Dentro do Dockerfile

O Dockerfile é basicamente um arquivo de texto. Mas, diferentemente dos arquivos de texto regulares, você verá que ele não tem um .TXT extensão de arquivo. O DockerFile é um arquivo que você economizará como Dockerfile, sem extensões de arquivo.

Neste dockerfile, existe todos os comandos usados ​​para montar uma imagem do Docker. Enquanto você pode passar esses comandos para a cli do Docker ao criar uma imagem, você concorda que é melhor prática ter um arquivo para isso, para que as coisas possam ser melhor organizadas.

Os comandos no Dockerfile são vitais para a construção de uma imagem do Docker.

Aqui está o porquê:

Cada linha de comando no Dockerfile cria as camadas que compõem a imagem do Docker. Desde que o DockerFile permaneça o mesmo, toda vez que você construir uma imagem, é certo que você obteria os mesmos resultados. No entanto, quando você adiciona uma nova linha de comando, o Docker simplesmente constrói essa camada e a adiciona às camadas existentes.

Assim como o compilador ou intérprete faz com as linguagens de programação, Docker lê o Dockerfile de cima para baixo. Portanto, a colocação dos comandos importa muito.

Ao contrário da maioria das linguagens de programação, os comandos no Dockerfile não são sensíveis ao caso. Mas você verá a partir de amostras de dockerfiles que os comandos estão escritos em maiúsculas. Isso não passa de uma convenção, que você deve seguir também.

Como linguagens de programação, você pode escrever comentários em seus docesfiles. Comentários em Dockerfiles são indicados usando o símbolo de hash ou libra # No início da linha. Você deve observar que ele suporta apenas comentários de uma linha, portanto, para escrever comentários de várias linhas, você usará o símbolo de hash em cada linha.

Cuidado, porém, nem todos os símbolos de hash que você vê em um Dockerfile são comentários. Símbolos de hash também podem indicar Diretivas de analisador. As diretrizes do analisador são comandos no dockerfile que indicam a maneira como o dockerfile deve ser lido.

Apenas duas diretivas de analisador estão disponíveis no Docker como no momento da redação deste artigo. Eles são o escapar e sintaxe Diretivas de analisador. O sintaxe A diretiva está disponível apenas no Docker quando estiver sendo executado em um back -end do BuildKit.

O escapar A diretiva funciona em todos os lugares. O escapar A diretiva permite que você decida o que o símbolo Docker usa como um personagem de fuga.

Você pode ter em seu Dockerfile, uma linha semelhante à abaixo:

Índice de cópia.html c: \\ documentos

Você ainda não deve se preocupar com o que o comando faz, concentre -se no local do arquivo. Usando o comando acima em uma imagem do Docker baseada no Windows, é válido. Mas você se lembrará de que o Docker é baseado no Linux, por isso usa a barra de barragem \ como um personagem de fuga devido a convenções Linux. Portanto, quando o Docker lê através do DockerFile, ele escapará da barra de barragem em vez de lê -lo como um caminho de arquivo.

Para mudar esse comportamento, você usará o escapar Diretiva analisadora como visto abaixo:

# Escape = '

Esta diretiva faz com que o Docker use o backtick como um personagem de fuga, em vez da barra de barriga. Para usar a diretiva analiser, você terá que colocá-la no topo do Dockerfile, caso contrário, ele contará apenas como um comentário-você terá que colocá-lo acima dos comentários acima, se você tiver os comentários no topo do arquivo.

Instruções do Dockerfile

Docker conta com cada linha de comando no Dockerfile e os executa, construindo uma camada para cada linha no processo.

Você precisará de uma compreensão dos comandos para escrever Dockerfiles. Um ponto de cautela: muitos dos comandos do Dockerfile fazem coisas semelhantes. Você não precisa se preocupar, você também entenderá esses comandos.

Aqui está uma lista dos comandos que você aprenderá:

  • DE
  • RÓTULO
  • Env
  • EXPOR
  • CORRER
  • CÓPIA DE
  • Workdir
  • Cmd

DE

Lembre -se de que o principal objetivo do Docker é virtualizar as coisas no nível do sistema operacional (OS), criando contêineres. Portanto, qualquer que seja a imagem que o Docker construa a partir do seu DockerFile, precisa se basear em um OS-exceto existente, você está construindo uma imagem base.

O comando do comando é usado para indicar o que você pretende usar como imagem base. Se você pretende construir em uma imagem base, o comando de deve Seja o primeiro comando nas diretrizes e comentários do analisador do DockerFile-ASIDES.

RÓTULO

O Dockerfile precisa de metadados, e o comando do rótulo é o que você usaria para criá -los. Depois de construir uma imagem e executar um recipiente, você pode usar o Docker inspecionar comando para encontrar informações sobre o contêiner.

Env

Variáveis ​​ambientais. Palavras familiares? Bem, o comando ENV é usado para definir variáveis ​​de ambiente ao criar a imagem do Docker. Você também verá que essas variáveis ​​de ambiente definidas também estão acessíveis após o lançamento do contêiner.

Dockerfile tem um comando semelhante ao Env, conhecido como Arg. No entanto, qualquer que seja a variável de ambiente definida usando arg está disponível apenas durante a criação da imagem, mas não após o lançamento do contêiner.

EXPOR

Da mesma forma que o seu host do docker-sua máquina local é o host do Docker nessas portas de caso-para comunicação como 8080, 5000, etc. é da mesma maneira que os contêineres do Docker têm portas.

Você usará o comando expose para escolher quais portas devem estar disponíveis para se comunicar com um contêiner.

Ao executar recipientes do Docker, você pode passar no -p argumento conhecido como publicish, que é semelhante ao comando expose.

Aqui está a diferença sutil: você usa o comando expose para abrir portas para outros contêineres do Docker, enquanto o -p O argumento é usado para abrir portas para o ambiente externo i.e. fora do recipiente do docker.

Se você não usar expor ou -p De qualquer forma, o recipiente do Docker não estará acessível através de nenhuma porta de fora do recipiente ou de outros contêineres do Docker.

CORRER

Ao criar uma imagem do Docker, pode ser necessário executar comandos por razões como instalar aplicativos e pacotes para fazer parte da imagem.

Usando o comando run, você pode fazer tudo isso. Mas lembre -se: os comandos são executados apenas quando você está construindo a imagem do Docker.

CÓPIA DE

Existem diferentes razões para copiar arquivos do seu host do Docker para sua imagem do Docker. Alguns arquivos que você pode copiar podem ser arquivos de configuração, ou o código-fonte-se você estiver executando no seu contêiner do Docker.

Para copiar arquivos do seu host Docker para uma imagem do Docker, você pode usar o comando Copy.

Existe o comando add que é semelhante à cópia e é um pouco diferente. Embora a cópia possa copiar apenas arquivos do seu host do Docker para a imagem do Docker, adicionar pode copiar arquivos de um URL e também extrair arquivos compactados para a imagem do docker.

Por que usar cópia em vez de add? Bem, você descobrirá que copiar arquivos de um URL é uma tarefa que você pode executar com o CURL usando o comando RUN. Você também pode extrair arquivos na imagem do docker usando o comando run também.

No entanto, não há nada de errado em usar Add para extrair diretamente arquivos compactados na imagem do Docker.

Workdir

Lembre -se do comando de corrida? Você pode usar o comando run para executar comandos na sua imagem do Docker. No entanto, às vezes você terá um motivo para executar um comando em determinados diretórios. Como exemplo, para descompactar um arquivo, você deve estar no diretório do arquivo zip ou apontar para ele.

É aí que o Workdir é útil. O Workdir permite alterar o diretório enquanto o Docker constrói a imagem, e o novo diretório continua sendo o diretório atual para o restante das instruções de construção.

Cmd

Seu contêiner do docker geralmente é configurado para executar um processo. Mas como ele sabe qual processo executar? É através do comando cmd. O comando CMD é usado para executar comandos quando o Docker lança o contêiner do docker da imagem.

Embora você possa especificar o comando a ser executado ao ser lançado a partir da linha de comando, os comandos declarados na instrução CMD continuam sendo o padrão.

Docker pode executar apenas um comando cmd. Portanto, se você inserir duas ou mais instruções de CMD, o Docker só executaria o último que eu.e. o mais recente.

A entrada de entrada é semelhante à CMD, no entanto, você pode executar comandos durante o lançamento e não substituiria as instruções que você definiu no ponto de entrada.

Exemplo

Neste exemplo, você verá uma implementação de quase todos os comandos discutidos acima. Você verá como um aplicativo de frasco seria executado em um contêiner do Docker. Se você não sabe o que é o Flask, o Flask é uma estrutura da web escrita em Python para criar aplicativos da Web.

É bastante simples, então você não precisa ter nenhum conhecimento do idioma para executar o exemplo.

Para começar, você precisará instalar o git em sua máquina. Depois de instalar o Git, você clonará o código -fonte do repositório do GitHub aqui.

Primeiro, crie um novo diretório. Você terá o código -fonte e o Dockerfile neste diretório. Você pode criar um diretório-você pode chamá-lo Docker-amostra-e o DockerFile usando os comandos abaixo:

MKDIR Docker-Sple && CD Docker-Sple
toque no Dockerfile

Lembre -se de que o DockerFile é apenas um arquivo de texto simples? Você também se lembra que não deveria ter o .TXT extensão? Você encontrará essa discussão no início da seção "Inside the Dockerfile", se você a perdeu.

Em seguida, você baixará o código -fonte do GitHub usando o clone git comando como visto abaixo:

clone git https: // github.com/Craigkerstiens/Flask-Lowerld.git

Você pode verificar o conteúdo do Flask-Shelloworld diretório:

LS Flask-Shelloworld

Você verá os seguintes arquivos:

  • Markdown.RST: Ele contém os detalhes do projeto, mas não é importante para este exemplo. Você não deveria se preocupar com isso.
  • Procfile: Ele contém comandos para executar os projetos em um servidor. Você também não deve se preocupar com isso.
  • aplicativo.py: Ele contém o código que você executará no contêiner do Docker.
  • Requisitos.TXT: Contém as dependências do aplicativo.py O arquivo precisa ser executado com sucesso.

Escrevendo o Dockerfile

Este Dockerfile tem todas as instruções do Docker discutidas acima. Ele também tem comentários, para ajudá -lo a entender o que cada linha faz.

# Da instrução escolhe a imagem pai para o Docker.
# Este exemplo usa alpino.
# Alpine é uma imagem mínima do docker muito pequena em tamanho
De Alpine: 3.3
# A instrução de etiqueta cria rótulos.
# O primeiro rótulo é o mantenedor com a dica do Value Linux.
# O segundo rótulo é o nome do AppName com o Flask de Valor Olá. Mundo
# Você pode ter tantos pares importantes para valores quanto quiser.
# Você também pode escolher qualquer nome para as chaves.
# A escolha do mantenedor e AppName neste exemplo
# é uma escolha pessoal.
Etiqueta "mantenedor" = "linux dica" "AppName" = "Flask Hello World"
# Instrução Env atribui variáveis ​​de ambiente.
# O diretório /usr /src possui programas baixados,
# seja fonte ou binário antes de instalá -los.
ENV APORTOCATION /USR /SRC
# Copiar instruções copia arquivos ou diretórios,
# do host do docker à imagem do Docker.
# Você copiará o código -fonte para a imagem do Docker.
# O comando abaixo usa a variável de ambiente definida.
Copiar o Flask-Belloworld $ APLATOCATION/FLÁSTICO-ALGO-ALGULO
# Usando a instrução ENV novamente.
Env Flaskapp $ APORTOCACIONAL/FLÁSTICO
# A instrução do Workdir altera o diretório atual na imagem do Docker.
# O comando abaixo muda o diretório para/usr/src/flask-to-loborld.
# O diretório de destino usa a variável de ambiente.
Workdir $ FLASKAPP/
# Executar instruções executam comandos,
# Assim como você faz no terminal,
# Mas na imagem do Docker.
# O comando abaixo instala Python, Pip e as dependências do aplicativo.
# As dependências estão nos requisitos.arquivo txt.
Execute apk add-update python py-pip
Execute o pip install -upgrade pip
Execute os requisitos de instalação do PIP.txt # expor as instruções abre a porta para se comunicar com o contêiner do docker.
# Flask App usa a porta 5000, então você exporá a porta 5000.
Exponha 5000 # Instrução CMD Executa comandos como Run,
# Mas os comandos são executados quando o contêiner do Docker inicia.
# Apenas uma instrução CMD pode ser usada.
Cmd ["python", "aplicativo.py "]

Construindo a imagem do Docker

Depois de escrever o Dockerfile, você pode construir a imagem do Docker com o comando abaixo:

sudo docker build -t sample_image .

Aqui, sample_image é o nome da imagem do docker. Você pode dar outro nome. O ponto (.) no final do comando indica que os arquivos com os quais você está trabalhando estão no diretório atual.

Executando o contêiner do Docker

Para executar o recipiente do docker, você pode usar o Docker Run Comando abaixo:

Sudo Docker Run -IP 5000: 5000 Sample_image: mais recente

O parâmetro -i garante que o contêiner do docker seja executado no modo interativo e o parâmetro -p liga a porta do host do docker à porta do contêiner do docker. Pense nisso como: Docker-Host: Docker-container.

Depois de lançar o contêiner do Docker, você pode visitar localhost: 5000 no seu navegador para ver os resultados do aplicativo Flask.

Conclusão

O Dockerfile é o plano para uma imagem do Docker. Entender como o Dockerfiles funcionam e ser capaz de escrevê -los confortavelmente tornaria sua experiência do Docker agradável.

Trabalhando para isso através deste artigo, você viu como os dockerfiles funcionam. Felizmente, você também entende o que significam as principais instruções do Docker e podem usá -las na construção de suas próprias imagens do Docker.

Qualquer pergunta que você tem relacionada a Dockerfiles seria bem -vinda. Obrigado pela leitura.