DockerFile
Princípio do espelho
O que é espelho
Mirror é um pacote de software leve, executável e independente usado para empacotar o ambiente operacional do software e o software desenvolvido com base no ambiente operacional. Ele contém todo o conteúdo necessário para executar um determinado software, incluindo código, tempo de execução, biblioteca e ambiente. Variáveis e arquivos de configuração
Pensamento
Qual é a essência do espelhamento do Docker?
Por que uma imagem centos no Docker tem apenas 200 MB e um arquivo iso do sistema operacional centos requer vários G?
Por que uma imagem do tomcat no Docker tem 500 MB, enquanto um pacote de instalação do tomcat tem apenas mais de 70 MB?
**
**
Componentes do sistema operacional
Subsistema de programação de processos Subsistema de
comunicação de processos Subsistema de
gerenciamento de memória Subsistema de gerenciamento de
equipamentos Subsistema de
gerenciamento de arquivos Subsistema de
comunicação de rede Subsistema de
controle de trabalho
Subsistema de gerenciamento de arquivos
O sistema de arquivos Linux consiste em duas partes: bootfs e rootfs
bootfs: contém bootloader (boot loader) e kernel (kernel)
rootfs: sistema de arquivos raiz, que contém diretórios e arquivos padrão como / dev, / proc, / bin, / etc em um sistema Linux típico
Distribuições Linux diferentes, bootfs são basicamente os mesmos, mas rootfs são diferentes, como ubuntu, centos, etc.
1) UnionFS (Union File System)
**
UnionFS (Union File System): O sistema de arquivos Union é um sistema de arquivos hierárquico, leve e de alto desempenho. Ele suporta a modificação do sistema de arquivos como um envio para sobrepor camada por camada e, ao mesmo tempo, diferentes diretórios pode ser sobreposto. Montado no mesmo sistema de arquivos virtual, o sistema de arquivos Union é a base da imagem do Dokcer. Os espelhos podem ser herdados por meio de camadas. Com base no espelho básico (sem o espelho pai), vários espelhos específicos podem ser feitos.
Recursos: carregue vários sistemas de arquivos ao mesmo tempo, mas de fora, apenas um sistema de arquivos pode ser visto. O carregamento conjunto carregará cada camada dos sistemas de arquivos, de modo que o sistema de arquivos final contenha todos os arquivos e diretórios subjacentes
**
**
2) Princípio de carregamento de imagem do Docker
**
A imagem docker é, na verdade, composta por um sistema de arquivos em camadas, este sistema de arquivos em camadas UnionFS.
Inclui principalmente bootloader e kernel. Bootloader é principalmente o kernel do bootloader. Quando o Linux é iniciado, ele carrega o sistema de arquivos bootfs. A camada inferior da imagem Docker é bootfs. Esta camada é a mesma do nosso sistema linux / unix típico e contém o kernel do carregador de boot. Quando o boot é carregado, todo o kernel está na memória. Neste momento, o direito de usar a memória foi dado ao kernel pelo bootfs, e o sistema também irá descarregar bootfs
Normalmente, os CentOS que instalamos na máquina virtual são vários G, por que o docker tem apenas 200M aqui
**
Para um sistema operacional simplificado, rootfs pode ser muito pequeno e só precisa incluir os comandos, ferramentas e bibliotecas mais básicos, porque a camada inferior usa host e kernel diretamente, e você só precisa fornecer rootfs. Pode-se ver que para diferentes distribuições de Linux, bootfs é basicamente o mesmo e rootfs será diferente, portanto, distribuições diferentes podem compartilhar bootfs.
**
3) Espelhamento em camadas
**
Pegue o pull como exemplo. Durante o processo de download, podemos ver que a imagem do docker parece ser baixada camada por camada.
**
4) Por que a imagem do Docker adota essa estrutura em camadas
** A
maior vantagem são os recursos compartilhados. Por
exemplo: se várias imagens forem criadas a partir da mesma imagem de base, o host só precisa salvar uma imagem de base no disco e, ao mesmo tempo, precisa carregar uma base imagem na memória., Você pode servir a todos os servidores. E cada camada do espelho pode ser compartilhada.
**
2. Recursos
** As
imagens do Docker são somente leitura.
Quando o contêiner é iniciado, uma nova camada gravável é carregada na parte superior da imagem.
Esta camada é normalmente chamada de "camada de contêiner", e a "camada de contêiner" é chamada de "camada de espelho"
5) Compreensão profunda
Todas as imagens do Docker começam com uma camada de imagem básica. Ao modificar ou adicionar novo conteúdo, uma nova camada de imagem será criada no topo da camada de imagem atual. Para dar um exemplo simples, se você criar uma nova imagem baseada no Ubuntu Linux 16.04, esta é a primeira camada da nova imagem; se você adicionar um pacote Python à imagem, uma segunda camada de imagem será criada em cima da base camada de imagem; Se você continuar a adicionar um patch de segurança, uma terceira camada de espelho será criada. O espelho atualmente contém 3 camadas de espelho, conforme mostrado na figura abaixo (este é apenas um exemplo muito simples para demonstração).
Ao adicionar camadas de espelho adicionais, o espelho sempre permanece uma combinação de todos os espelhos atuais.É muito importante entender isso. A figura a seguir mostra um exemplo simples, cada camada de espelho contém 3 arquivos e o espelho contém 6 arquivos de duas camadas de espelho.
A camada de espelho na imagem acima é um pouco diferente da imagem anterior, o objetivo principal é facilitar a exibição dos arquivos. A figura a seguir mostra uma imagem de três camadas um pouco mais complicada. De fora, a imagem inteira tem apenas 6 arquivos. Isso ocorre porque o arquivo 7 na camada superior é uma versão atualizada do arquivo 5.
Nesse caso, os arquivos na camada espelhada superior sobrescrevem os arquivos na camada espelhada inferior. Isso permite que a versão atualizada do arquivo seja adicionada ao espelho como uma nova camada de espelho.
O Docker usa o mecanismo de armazenamento (a nova versão adota o mecanismo de instantâneo) para implementar a pilha de camadas espelhadas e garante que as várias camadas espelhadas sejam exibidas externamente como um sistema de arquivos unificado.
Os mecanismos de armazenamento disponíveis no Linux são AUFS, Overlay2, Device Mapper, Btrfs e ZFS. Como o nome indica, cada mecanismo de armazenamento é baseado no sistema de arquivos correspondente ou tecnologia de dispositivo de bloco no Linux, e cada mecanismo de armazenamento tem suas próprias características de desempenho exclusivas.
O Docker só oferece suporte a windowsfilter como mecanismo de armazenamento no Windows, que implementa camadas e CoW [1] com base no sistema de arquivos NTFS.
A figura a seguir mostra o mesmo espelhamento de três camadas da tela do sistema. Todas as camadas de espelho são empilhadas e mescladas para fornecer uma visão unificada do lado de fora.
resumo
1. A imagem do Docker é sobreposta por um sistema de arquivos especial
2. A parte inferior é bootfs, e o bootfs do host é usado
3. A segunda camada é o rootfs do sistema de arquivos raiz, chamado de imagem de base
4. Em seguida, suba e você pode sobrepor outros arquivos espelhados
5. A tecnologia Union File System pode integrar diferentes camadas em um sistema de arquivos, proporcionando uma perspectiva unificada para essas camadas, de forma que a existência de múltiplas camadas fica oculta Do ponto de vista do usuário, existe apenas um sistema de arquivos.
6. Um espelho pode ser colocado em cima de outro espelho. O espelho inferior é chamado de espelho pai e o espelho inferior se torna o espelho da base.
7. Ao iniciar um contêiner a partir de uma imagem, o Docker carregará um sistema de arquivos de leitura e gravação no nível superior como o contêiner
Resolva o problema no problema de pensamento
1. Qual é a essência do espelhamento do Docker?
É um sistema de arquivos hierárquico
2. Por que uma imagem centos no Docker tem apenas 200 MB, mas um arquivo iso de sistema operacional centos requer vários G?
O arquivo de imagem iso do Centos contém bootfs e rootfs, enquanto a imagem centos do docker reutiliza o bootfs do sistema operacional, apenas rootfs e outras camadas espelhadas
3. Por que uma imagem do tomcat no Docker tem 500 MB, enquanto um pacote de instalação do tomcat tem apenas mais de 70 MB?
Como a imagem no docker é hierárquica, embora o tomcat tenha apenas mais de 70 MB, ele precisa depender da imagem pai e da imagem base. O tamanho de todas as imagens expostas do tomcat é superior a 500 MB.
Produção de espelhos
1. Converta o contêiner em um espelho
Função: por exemplo, criamos um novo aplicativo no tomcat, mas queremos enviar o aplicativo aos testadores para teste. Neste momento, podemos colocar o aplicativo no contêiner e convertê-lo em uma imagem espelhada e, em seguida, enviá-lo para o testador para teste
docker commit 容器id 镜像名称:版本号
#镜像是不可以直接传输的
#所以可以将其压缩为压缩文件进行传输
docker save -o 压缩文件名称 镜像名称:版本号
docker load -i 压缩文件名称
2.DockerFile
O que é DockerFile
1.Dockerfile é um arquivo de texto
2. Contém uma instrução
3. Cada instrução constrói uma camada, com base na imagem básica, finalmente constrói uma nova imagem
4. Para desenvolvedores: pode fornecer um ambiente de desenvolvimento totalmente consistente para a equipe de desenvolvimento
5. Para testadores: você pode obter diretamente a imagem construída durante o desenvolvimento ou construir uma nova imagem por meio do arquivo Dockerfile e começar a trabalhar
6. Para o pessoal de operação e manutenção: durante a implantação, a migração perfeita de aplicativos pode ser alcançada
Site da Dochub: https://hub.docker.com
3. Palavra-chave do DockerFile
Palavra-chave | efeito | Observações |
---|---|---|
A PARTIR DE | Especifique o espelho pai | Especifique que o dockerfile é construído com base nessa imagem |
MANUTENÇÃO | Informação sobre o autor | Usado para indicar quem escreveu este dockerfile |
RÓTULO | rótulo | O rótulo usado para indicar o dockerfile pode usar Rótulo em vez de Maintainer, que pode ser visualizado nas informações básicas da imagem do docker. |
CORRE | Executando um pedido | O formato padrão de execução de um comando é / bin / sh: RUN command ou RUN ["command", "param1", "param2"] |
CMD | Comando de inicialização do contêiner | Forneça o comando padrão ao iniciar o contêiner e use-o com ENTRYPOINT. Formate o comando CMD param1 param2 ou CMD ["command", "param1", "param2"] |
PONTO DE ENTRADA | Entrada | Geralmente usado na produção de alguns contêineres que são fechados após a execução |
CÓPIA DE | Copiar arquivos | Copie os arquivos para a imagem durante a construção |
ADICIONAR | adicionar arquivos | Adicionar arquivos à imagem durante a construção não se limita ao contexto de construção atual e pode ser derivado de serviços remotos |
ENV | Variável de ambiente | Especifique as variáveis de ambiente no momento da construção. Você pode passar -e para substituir o formato ENV nome = valor ao iniciar o contêiner. |
ARG | Parâmetros de construção | O parâmetro de construção é usado apenas durante a construção. Se houver ENV, o valor de mesmo nome de ENV sempre substitui o parâmetro de arg |
VOLUME | Defina volumes de dados externos que podem ser montados | Especifique os diretórios de imagem de construção a serem montados no sistema de arquivos quando eles puderem ser iniciados. Ao iniciar o contêiner, use o formato de ligação -v VOLUME ["diretório"] |
EXPOR | Porta exposta | Defina a porta a ser monitorada quando o contêiner estiver em execução. Inicie o contêiner usando -p para vincular o formato de porta exposto: EXPOSE 8080 ou EXPOSE 8080 / udp |
WORKDIR | Lista de trabalho | Especifique o diretório de trabalho dentro do contêiner, se não for criado, ele será criado automaticamente. Se você especificar / usar um endereço absoluto, se não começar com /, então é um caminho relativo para o caminho do diretório de trabalho anterior |
DO UTILIZADOR | Especifique o usuário de execução | Especifique o usuário quando o usuário está executando RUN CMD ENTRYPONT ao construir ou iniciar |
EXAME DE SAÚDE | Exame de saúde | O comando para especificar o monitoramento de saúde do contêiner atual é basicamente inútil porque muitas vezes o próprio aplicativo possui um mecanismo de monitoramento de saúde |
ONBUILD | acionar | Quando a imagem com a palavra-chave ONBUILD é usada como imagem básica, o comando ONBUILD será executado após a execução de FROM ser concluída, mas não afeta a imagem atual e não é muito útil. |
STOPSIGNAL | Envie um semáforo para o host | A instrução STOPSIGNAL define o sinal de chamada do sistema que será enviado ao contêiner para sair. |
CONCHA | Especifique o shell para executar o script | Especifique o shell usado quando RUN CMD ENTRYPOINT executa o comando |
4 ... Faça um espelho baseado em Centos7
exigem
Espelho centos7 personalizado.
Afirmação:
-
O caminho de login padrão é / usr
-
Você pode usar o vim
Etapas de implementação
1. Defina a imagem principal: FROM centos: 7
2. Defina as informações do autor: MAINTAINER itheima [email protected]
3. Execute o comando de instalação do vim: EXECUTE yum install -y vim
4. Defina o diretório de trabalho padrão: WORKDIR / usr
5. Defina o comando a ser executado pelo contêiner: CMD / bin / bash
6. Crie a imagem por meio do dockerfile: docker bulid -f caminho do arquivo dockerfile -t nome da imagem: versão.
Exemplo
Observe que há um ponto no final, caso contrário, um erro será relatado
docker bulid –f centos_dockerfile –t pjhcentos:1 .
Demo
Crie um diretório docker-files no diretório raiz
Crie um conteúdo de arquivo chamado centos_dockerfile
Digite o comando para criar um espelho
Criado com sucesso
Implante o projeto SpringBoot no contêiner
exigem
Defina o dockerfile e publique o projeto springboot
Etapas de implementação
1. Defina a imagem pai: FROM java: 8
2. Defina as informações do autor: MAINTAINER itheima [email protected]
3. Adicione o pacote jar ao contêiner: ADD springboot.jar app.jar
4. Defina o comando para iniciar a execução do contêiner: CMD java – jar app.jar
5. Crie a imagem por meio do dockerfile: docker bulid -f caminho do arquivo dockerfile -t nome da imagem: versão
Demo
Crie um projeto springboot
Embale como um pacote de jar
Upload para o servidor
Transfira para o diretório dockerfile correspondente
Adicione o pacote jar correspondente ao espelho correspondente e, em seguida,
grave o arquivo de configuração DockerFile correspondente
Construir imagem
Crie o contêiner correspondente
Visita de teste
Orquestração de serviço
O sistema de aplicativo da arquitetura de microsserviço geralmente contém vários microsserviços, e cada microsserviço geralmente implanta várias instâncias. Se cada microsserviço tiver que ser iniciado e interrompido manualmente, a carga de trabalho de manutenção será muito grande.
1. Para construir uma imagem do Dockerfile ou puxar a imagem do dockerhub
2. Para criar vários contêineres
3. Para gerenciar esses contêineres (iniciar, parar, excluir)
conceito:
Gerenciar contêineres em lotes de acordo com certas regras de negócios
DockerCompose
Introdução do conceito
O Docker Compose é uma ferramenta para orquestrar a implantação distribuída de vários contêineres. Ele fornece um conjunto de comandos para gerenciar o ciclo completo de desenvolvimento de aplicativos em contêineres, incluindo construção, início e parada de serviço. Use as etapas: Use Dockerfile para definir a imagem do ambiente operacional Use docker-compose.yml para definir os serviços que compõem o aplicativo Execute docker-compose para iniciar o aplicativo
Instalação e uso de DockerCompose
1. Método de instalação
# Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我 们以编译好的二进制包方式安装在Linux系统中。
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 设置文件可执行权限
chmod +x /usr/local/bin/docker-compose
# 查看版本信息
docker-compose -version
2. Método de desinstalação
# 二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose
3. Use docker compose para organizar o projeto nginx + springboot
1. Crie um diretório docker-compose
mkdir ~/docker-compose
cd ~/docker-compose
2. Grave o arquivo docker-compose.yml
Observe que o nome deve ser
docker-compose.yml
#版本号
version: '3'
services:
nginx:
#对应的nginx镜像名称
image: nginx
#容器与虚拟机的端口映射
ports:
- 80:80
#当前的项目可以访问到对应的app项目于下面定义的app相联系
links:
- app
#挂载数据卷,前面为宿主机目录后面为容器的目录
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
app:
#对应应用的镜像名称
image: app
expose:
- "8080"
3. Crie o diretório ./nginx/conf.d
mkdir -p ./nginx/conf.d
4. Grave o arquivo itheima.conf no diretório ./nginx/conf.d
server {
listen 80;
access_log off;
location / {
proxy_pass http://app:8080;
}
}
5. Use docker-compose para iniciar o contêiner no diretório ~ / docker-compose
docker-compose up
6. Visita de teste
http://192.168.149.135/hello