Tecnologia de contêiner do Docker - imagem e Dockerfile

índice

Imagem Docker

Docker Image é um arquivo somente leitura que serve como modelo para a criação de Docker Containers. A imagem é a base do contêiner. O contêiner é iniciado com base na imagem. A imagem é como o código-fonte do contêiner, o que salva várias condições para o contêiner iniciar.

O Docker suporta a criação de novas imagens estendendo as imagens existentes. Na verdade, 99% das imagens no Docker Hub são criadas instalando e configurando o software necessário na imagem base.

Insira a descrição da imagem aqui

A imagem do Docker é um sistema de arquivos somente leitura em camadas com a seguinte estrutura:

  • bootfs (sistema de arquivos de inicialização) : Um sistema de inicialização que interage com o kernel do Linux.
  • rootfs (sistema de arquivos raiz) : O sistema de arquivos raiz, a imagem base, pode ser um ou mais sistemas operacionais, como Ubuntu ou CentOS. O rootfs é sempre somente leitura.
  • unionFS (United File System) : o sistema de arquivos acima de todas as imagens de base. O Docker aplica a montagem de união (tecnologia de montagem de união), que pode montar vários sistemas de arquivos somente leitura em cima de rootfs por vez, e apenas um sistema de arquivos pode ser visto de fora. A montagem da união sobrepõe os sistemas de arquivos de todas as camadas juntos, de modo que o sistema de arquivos finalmente apresentado contenha todos os sistemas de arquivos e diretórios subjacentes.Tal sistema de arquivos é um espelho.

Um espelho pode ser colocado em cima de outro espelho. O espelho da parte inferior é chamado de espelho pai, e assim por diante. O espelho inferior é chamado de imagem de base, que se refere a rootfs, ou seja, Ubuntu ou CentOS.

Quando um contêiner é iniciado com a imagem, um novo sistema de arquivos gravável é carregado na parte superior da imagem, a saber: a camada gravável, que normalmente também é chamada de "camada de contêiner", e tudo sob a "camada de contêiner" é chamado de "camada de imagem" "

Insira a descrição da imagem aqui

O programa em execução no Container é executado nesta "camada de container". Quando o Container é iniciado pela primeira vez, a "camada do container" está vazia.Quando o sistema de arquivos muda, ele será aplicado a esta camada. Se você quiser modificar um arquivo, o arquivo será primeiro copiado da “camada espelho somente leitura” sob a “camada de contêiner” para a camada gravável. A versão somente leitura do arquivo ainda existe, mas foi copiada pelo arquivo na camada gravável. ocultar. Esta é uma cópia importante no mecanismo de gravação do Docker.

Insira a descrição da imagem aqui

  • O ciclo de vida do Docker Image
    Insira a descrição da imagem aqui

Dockerfile

Cada Docker Container começa com um Dockerfile. Dockerfile é um arquivo de texto escrito com uma sintaxe fácil de entender. Ele descreve como gerar uma imagem Docker. Ele especifica o sistema operacional do contêiner, a linguagem de programação, as variáveis ​​de ambiente, o local do arquivo, as portas de rede e outros componentes e outras informações de configuração. Claro, também especifica a inicialização do contêiner. O conteúdo a ser executado posteriormente.

Docker Image é o "transportador de conteúdo" do Container Docker. É essencialmente um arquivo portátil que contém especificações para quais componentes de software o contêiner será executado e como será executado. Cada Container é uma instância de Image. Como o Dockerfile pode conter instruções para obter certos pacotes da biblioteca de recursos online, você precisa ter cuidado para especificar a versão correta, caso contrário, o Dockerfile pode gerar imagens inconsistentes dependendo do tempo de invocação. Mas, uma vez que uma imagem é criada, ela é estática.

  • Escreva Dockerfile
# vim Dockerfile

FROM centos
RUN yum install openssh-server -y 
RUN echo "root:123456" |chpasswd
RUN /etc/init.d/sshd start 
CMD ["/usr/sbin/sshd","-D"]
  • Construir imagem
ocker image build  -t centos .
  • . Indica que o Dockerfile está no caminho atual

Instruções do Dockerfile

As instruções do Dockerfile não diferenciam maiúsculas de minúsculas, mas geralmente usam letras maiúsculas, usando # como comentário. Cada linha suporta apenas uma instrução, e cada instrução pode conter vários parâmetros.

As instruções do Dockerfile podem ser divididas em dois tipos de acordo com suas funções:

  • Instrução de construção : usada para construir a imagem, a operação especificada não será executada no contêiner executando a imagem;
  • Instruções de configuração : usadas para definir os atributos da imagem, e as operações especificadas serão executadas no recipiente que executa a imagem.

Insira a descrição da imagem aqui

Instruções de construção

DE (指定 imagem de base)

Ele deve ser especificado no cabeçalho do Dockerfile e as instruções subsequentes dependem da imagem base especificada por FROM.

Esta instrução tem dois formatos:

# 指定 base image 为该 image 的最后修改的版本。
FROM <image>       

# 指定 base image 为该 image 的一个 tag 版本。
FROM <image>:<tag>  

MAINTAINER (Especifique as informações do criador da imagem)

Especifique o criador da imagem. Ao usar o docker inspect para visualizar, haverá campos correspondentes na saída para registrar as informações.

MAINTAINER <name>

RUN (especifique a instrução a ser executada ao construir a imagem)

RUN pode executar qualquer comando compatível com a imagem de base, como comandos de gerenciamento de software.

  • Se a imagem base for ubuntu, use apt install.
  • Se a imagem base for centos, use yum install.

Esta instrução tem dois formatos:

RUN <command> (the command is run in a shell - `/bin/sh -c`)
RUN ["executable", "param1", "param2" ... ]  (exec form)

Definir instrução

CMD (Definir a operação realizada quando o contêiner inicia)

Um Dockerfile pode conter apenas uma instrução CMD, se houver várias, apenas a última é executada. O tipo de operação especificado pelo CMD pode ser um programa binário, um script personalizado ou um comando do sistema operacional.

Este comando possui 3 formatos:

CMD ["executable","param1","param2"] (like an exec, this is the preferred form)
CMD command param1 param2 (as a shell)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)

Dentre eles, ENTRYPOINT especifica o caminho de um programa executável ou script, e o script terá param1 e param2 como parâmetros. Em seguida, a instrução ENTRYPOINT deve ser escrita no Dockerfile.

ENTRYPOINT (Definir a operação realizada quando o contêiner inicia)

Esta instrução tem dois formatos:

ENTRYPOINT ["executable", "param1", "param2"] (like an exec, the preferred form)
ENTRYPOINT command param1 param2 (as a shell)

O uso da instrução ENTRYPOINT é dividido em duas situações:

  1. Usar sozinho : quando usado sozinho, se o comando CMD for escrito no mesmo Dockerfile e o CMD for um comando executável completo, o comando CMD e o comando ENTRYPOINT se sobrescreverão. Apenas o último CMD ou ENTRYPOINT é válido.
  2. Usado em conjunto com a instrução CMD : usado para especificar os parâmetros padrão de ENTRYPOINT. No momento, a instrução CMD não é um comando executável completo, apenas a parte do parâmetro, porque a instrução ENTRYPOINT só pode usar JSON para especificar o comando de execução, mas não os parâmetros. Por exemplo:
FROM ubuntu
CMD ["-l"]
ENTRYPOINT ["/usr/bin/ls"]

USUÁRIO (Definir o usuário que inicia o contêiner)

O padrão é o usuário root. Especifique o usuário em execução do memcached. Por exemplo:

ENTRYPOINT ["memcached"]
USER daemon
# 或
ENTRYPOINT ["memcached", "-u", "daemon"]

EXPOR (definir a porta que o contêiner precisa ser mapeado para o host)

Esta instrução mapeia a porta no contêiner para uma porta no host, e o exterior pode acessar o Socket de serviço do contêiner através do IP do host: Porta.

Para alcançar esse efeito, são necessárias duas etapas:

  1. Primeiro, use a instrução EXPOSE no Dockerfile para definir a porta do contêiner a ser mapeada. A instrução EXPOSE pode definir vários números de porta de uma vez.
  2. Em seguida, use a opção -p para adicionar a porta definida por EXPOSE ao executar o contêiner. Você pode usar a opção -p várias vezes.
# 映射一个端口
EXPOSE port1

# 相应的运行容器使用的命令 [主机端口:容器端口]
docker run -p host_port1:port1 image

Desta forma, o número da porta definido por EXPOSE será mapeado aleatoriamente para um número de porta no host. Obviamente, você também pode especificar o número da porta específica que precisa ser mapeada para o host.Neste caso, você deve primeiro garantir que o número da porta no host não esteja ocupado.

ENV (definir variável de ambiente)

ENV <key> <value>

Depois que a variável de ambiente é definida, todas as instruções RUN subsequentes podem ser usadas. Depois que o contêiner é iniciado, você pode visualizar essa variável de ambiente por meio da instrução docker inspect ou pode definir ou modificar a variável de ambiente especificada por meio da instrução docker run --env key = value.

ADD (definido para copiar arquivos de HostSrc para ContainerDest)

Observe que as permissões de todos os arquivos ou diretórios copiados do host para o contêiner são 0755 e o uid e gid são 0.

ADD <src> <dest>
  • O caminho de src é o caminho relativo do diretório docker build ou pode ser um URL de arquivo remoto.
  • dest é o caminho absoluto do contêiner.
  • Se src for um arquivo e dest não terminar com uma barra "/", dest também será considerado um arquivo e o conteúdo de src será gravado em dest.
  • Se src for um arquivo e dest terminar com uma barra "/", o arquivo src será copiado para o diretório dest.
  • Se src for um diretório, todos os arquivos no diretório serão adicionados a dest, excluindo o próprio diretório src.
  • Se src for um arquivo e um formato de compactação reconhecível, descompacte-o (observe o formato de compactação).

VOLUME (definir o ponto de montagem do volume)

Definir o ponto de montagem do volume permite que um diretório no contêiner tenha a função de armazenar dados persistentemente. O diretório pode ser usado pelo próprio contêiner ou compartilhado com outros contêineres.

O sistema de arquivos usado pelo próprio contêiner é AUFS. Este sistema de arquivos não pode persistir dados. Quando o contêiner é fechado, todas as alterações serão perdidas, ou seja, a ausência de estado do contêiner ou é chamado de imutabilidade.

Portanto, quando o aplicativo no contêiner precisa persistir dados, você pode usar a instrução VOLUME para montar o diretório de um host no contêiner e usar o sistema de arquivos do host para persistência.

FROM base
VOLUME ["/tmp/data"]

WORKDIR (alternando o diretório de configurações)

É equivalente ao comando cd, que pode ser alternado várias vezes e é eficaz para os comandos RUN, CMD e ENTRYPOINT.

# 在 /p1/p2 下执行 vim a.txt
WORKDIR /p1 WORKDIR p2 RUN vim a.txt

Acho que você gosta

Origin blog.csdn.net/Jmilk/article/details/108895101
Recomendado
Clasificación