índice
Artigo Diretório
- índice
- Imagem Docker
- Dockerfile
- Instruções do Dockerfile
-
- Instruções de construção
- Definir instrução
-
- CMD (Definir a operação realizada quando o contêiner inicia)
- ENTRYPOINT (Definir a operação realizada quando o contêiner inicia)
- USUÁRIO (Definir o usuário que inicia o contêiner)
- EXPOR (definir a porta que o contêiner precisa ser mapeado para o host)
- ENV (definir variável de ambiente)
- ADD (definido para copiar arquivos de HostSrc para ContainerDest)
- VOLUME (definir o ponto de montagem do volume)
- WORKDIR (alternando o diretório de configurações)
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.
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" "
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.
- O ciclo de vida do Docker Image
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.
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:
- 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.
- 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:
- 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.
- 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