Os contêineres do Docker devem ser um substituto para aplicações. Eles devem ser descartáveis e fáceis de substituir. Esta propriedade é, de fato, a pedra angular de muitos oleodutos de IC/CD. Quando uma mudança é feita empurrada para o seu repositório de origem que desencadeia uma cadeia de eventos. As imagens do Docker são construídas automaticamente, testadas e (às vezes) até implantadas na produção, substituindo as versões mais antigas sem problemas.
Mas muitas vezes há dados persistentes que precisam ser preservados entre diferentes liberações do seu aplicativo. Exemplos incluem bancos de dados, arquivos de configuração para seus aplicativos, arquivos de log e credenciais de segurança como chaves de API e certificados TLS.
Para permitir que todos esses dados persistam, usaremos os volumes do Docker, que são apenas partes do sistema de arquivos do Docker Host (um diretório ou um dispositivo de bloco formatado com um sistema de arquivos) que pode ser montado dentro de um contêiner em qualquer local desejado do sistema de arquivos do contêiner.
Configurar
Para garantir que estamos todos na mesma página, aqui está a versão do Docker Runtime e Docker-Compose que estou usando:
Exemplo: hospedando um site Ghost CMS
Trabalhar com composição é realmente direto. Você escreve um arquivo YAML descrevendo sua implantação e depois o executa usando a CLI do Docker-Compose. Vamos começar com uma simples implantação de cms fantasmas.
Crie um diretório chamado composos e dentro dele, crie um arquivo chamado Docker-Compose.Yaml
$ mkdir compostos
$ CD ComposesPosples
Conteúdo de Docker-Compose.YAML:
Versão: "3.0 "
Serviços:
rede:
Imagem: Ghost: mais recente
Portas:
- "2368: 2368"
volumes:
- Content CMS:/var/lib/fantasma/conteúdo
volumes:
Content CMS:
Este arquivo composto declara um único serviço que é a Web que está executando a imagem mais recente do Ghost CMS do repositório oficial do Docker Hub. A porta exposta é 2368 (mais sobre isso em um pouco mais tarde) e um volume é um volume chamado CMS-Content montado em/var/lib/fantasma/conteúdo que você pode ler sobre seu aplicativo específico e suas nuances, observando que os aplicativos documentação. Por exemplo, a porta padrão 2368 do contêiner fantasma e o ponto de montagem padrão para o conteúdo do site/var/lib/fantasma/conteúdo são mencionados na documentação oficial do contêiner.
Se você estiver escrevendo uma nova aplicação, pense em todos os dados persistentes aos quais precisará acessar e definirá os pontos de montagem para o seu volume do Docker.
Para testar que o volume persistente funciona, tente o seguinte:
Sintaxe e verbosidade
A sintaxe para introduzir um volume usando o Docker-Compose é bem direto. Você começa com algo semelhante a um recipiente e menciona o nome do volume que deseja montar dentro dele. Se você não mencionar um nome, poderá optar por uma sintaxe preguiçosa como abaixo:
Versão: "3.0 "
Serviços:
rede:
Imagem: Ghost: mais recente
Portas:
- "2368: 2368"
volumes:
- /var/lib/fantasma/conteúdo
Se você quiser ser um pouco mais detalhado, terá que mencionar o volume do Docker como uma definição de nível superior:
Versão: "3.0 "
Serviços:
rede:
Imagem: Ghost: mais recente
Portas:
- "2368: 2368"
volumes:
- Content CMS:/var/lib/fantasma/conteúdo
## Definir que o conteúdo do CMS é de fato um volume.
volumes:
Content CMS:
Embora a última versão exija que você digite mais, é mais detalhado. Escolha o nome relevante para seus volumes, para que seus colegas possam entender o que foi feito. Você pode ir ainda mais longe e mencionar o tipo de volume (mais sobre isso mais tarde) e apontar a fonte e o alvo.
volumes:
- Tipo: volume
Fonte: CMS-Data
alvo:/var/lib/fantasma/conteúdo
Montagens de ligação
As montagens de ligação são partes do sistema de arquivos host que podem ser montados diretamente dentro do recipiente do docker. Para introduzir uma montagem de ligação, basta mencionar o diretório host que você deseja compartilhar e o ponto de montagem dentro do recipiente do Docker, onde deve ser montado:
volumes:
- /lar//Projetos/fantasma:/var/lib/fantasma/conteúdo
Eu usei o caminho/home // Projects/Ghost como apenas um exemplo, você pode usar qualquer caminho no seu host do Docker que desejar, desde que você tenha acesso a ele, é claro.
Você também pode usar caminhos relativos usando $ pwd ou ~, mas isso pode facilmente levar a bugs e desastres nos cenários do mundo real, onde você está colaborando com vários outros humanos, cada um com seu próprio ambiente Linux. Por outro lado, às vezes os caminhos relativos são realmente mais fáceis de gerenciar. Por exemplo, se o seu repositório Git também deverá ser o seu suporte de ligação usando o DOT (.) para simbolizar o diretório atual pode muito bem ser o ideal.
Novos usuários clonando o repositório e clonam em qualquer lugar do sistema host, e executem o Docker -Compompose up -d e obtenha praticamente o mesmo resultado.
Se você usar uma sintaxe mais detalhada, é isso que seu arquivo de composição conterá:
volumes:
- Tipo: Bind
Fonte:/Home/User/Projects/Ghost
alvo:/var/lib/fantasma/conteúdo
Para organizar seus aplicativos, o aplicativo é separado dos dados pode ser muito útil. Os volumes são maneiras sãs de realizar exatamente isso. Desde que eles sejam apoiados e seguros, você pode usar livremente para usar os contêineres como ambientes descartáveis, mesmo na produção!
A atualização de uma versão do aplicativo para a próxima ou usando versões diferentes do seu aplicativo para testes A/B pode se tornar muito simplificada, desde que a maneira pela qual os dados sejam armazenados ou acessados seja o mesmo para ambas as versões.