O que seria um bom fluxo de trabalho do docker webdev?


121

Eu tenho um palpite de que o docker poderia melhorar muito meu fluxo de trabalho no webdev - mas ainda não consegui entender como abordar um projeto que adiciona o docker à pilha.

A pilha básica de software ficaria assim:

Programas

  • Imagem (s) do Docker que fornece pilha LAMP personalizada

    • Apache com vários módulos
    • MYSQL
    • PHP
    • Alguns CMS, por exemplo, Silverstripe
  • GIT

Fluxo de trabalho

Eu poderia imaginar o fluxo de trabalho parecido com o seguinte:

Desenvolvimento

  1. Escreva um Dockerfileque defina um contêiner LAMP que atenda aos requisitos estabelecidos acima
    • REQ: A máquina deve iniciar o apache / mysql logo após a inicialização
  2. Construa a imagem da janela de encaixe
  3. Copie os arquivos necessários para executar o CMS em, por exemplo ~/dev/cmsdir
    • Colocar ~/dev/cmsdir/sob controle de versão
  4. Execute o recipiente janela de encaixe, e de alguma forma montar ~/dev/cmsdira /var/www/no recipiente
  5. Preencher o banco de dados
  6. Trabalhe em /dev/cmsdir/
  7. Confirmar e desligar o container docker

Desdobramento, desenvolvimento

  1. Configurar host remoto (por exemplo, com ansible)
  2. Enviar imagem do contêiner para o host remoto
  3. Buscar cmsdir-project via git
  4. Execute o contêiner do docker, puxe o banco de dados e monte cmsdirno/var/www

Agora, isso parece muito bom no papel, mas não tenho muita certeza se essa seria a abordagem correta.

Questões:

  1. Enquanto desenvolvia localmente, como eu faria o banco de dados persistir entre as reinicializações da instância do contêiner? Ou precisaria executar o sql-dump toda vez antes de girar o contêiner?

  2. Devo ter instâncias de contêiner separadas para o db e o servidor apache? Ou seria suficiente ter um único contêiner para o caso de uso acima?

  3. Se estiver usando contêineres separados para banco de dados e servidor, como eu poderia automatizar a rotação deles para cima e para baixo ao mesmo tempo?

  4. Como eu realmente montaria /dev/cmsdir/nos /var/www/diretórios containers ? Devo utilizar volumes de dados para isso?

  5. Perdi algumas armadilhas? Algo que poderia ser simplificado?


1
Esta questão parece ser interessante para algumas pessoas. Alguém parece ter escrito recentemente uma série de posts no blog. Uma vez que não está acabado a partir de agora, vou postar o link em este comentário: project-webdev.blogspot.de/2015/05/...
jottr

Respostas:


46
  1. Se você precisar de persistência do banco de dados independente do seu contêiner CMS, poderá usar um contêiner para MySQL e um contêiner para seu CMS. Nesse caso, você pode ter seu contêiner MySQL ainda em execução e pode reimplementar seu CMS quantas vezes quiser independentemente.

    Para desenvolvimento - a outra opção é mapear diretórios de dados mysql da sua máquina host / desenvolvimento usando volumes de dados. Dessa forma, você pode gerenciar arquivos de dados para o mysql (no docker) usando git (no host) e "recarregar" o estado inicial a qualquer momento (antes de iniciar o contêiner do mysql).

  2. Sim, acho que você deve ter um contêiner separado para db.

  3. Eu estou usando apenas script básico:

    #!/bin/bash
    
    $JOB1 = (docker run ... /usr/sbin/mysqld)
    $JOB2 = (docker run ... /usr/sbin/apache2)
    echo MySql=$JOB1, Apache=$JOB2
    
  4. Sim, você pode usar a opção data-volumes -v. Eu usaria isso para desenvolvimento. Você pode usar a montagem somente leitura, portanto, nenhuma alteração será feita nesse diretório, se desejar (seu aplicativo deve armazenar dados em outro lugar).

    docker run -v=/home/user/dev/cmsdir:/var/www/cmsdir:ro image /usr/sbin/apache2
    

    De qualquer forma, para a implantação final, eu criaria e criaria imagens usando o dockerfile com ADD /home/user/dev/cmsdir /var/www/cmsdir

  5. Eu não sei :-)


6
i escreveu um tutorial sobre como escrever um recipiente mysql que implementa o que você está falando em # 1 txt.fliglio.com/2013/11/creating-a-mysql-docker-container
Ben Schwartz

48
Definitivamente, precisa haver mais tutoriais / práticas recomendadas para esse processo. :(
Reza S

Este tutorial pode lhe dar alguma direção ..
Pithikos

Se você estiver em puxando código de Github em Docker, este link sugere chaves SSH somente leitura (modo imagem Docker podem ser listadas publicamente) slash-dev-blog.me/docker-git.html
jhtong

4
@RoyTruelove a partir de 2015, a fig está agora abandonada em favor da janela de encaixe-compor
allan.simon


4

Entendo que este post tem mais de um ano no momento, mas recentemente me fiz perguntas muito semelhantes e tenho várias ótimas respostas para suas perguntas.

  1. Você pode configurar uma instância do docker MySQL e manter os dados em um contêiner sem estado, também conhecido como o contêiner de dados não precisa estar em execução ativa

  2. Sim, eu recomendaria ter uma instância separada para seu servidor web e banco de dados. Esse é o poder do Docker.

  3. Confira este repo que estou construindo. Basicamente, é tão simples quanto make build& make rune você pode ter um servidor da Web e um contêiner de banco de dados em execução localmente.

  4. Você usa o -vargumento ao executar o contêiner pela primeira vez, isso vinculará uma pasta específica no contêiner ao host que o está executando.

  5. Eu acho que suas idéias são ótimas e atualmente é possível alcançar tudo o que você está pedindo.

Aqui está uma solução pronta para atender a todas as necessidades listadas.


1

Reunimos uma configuração de composição de encaixe fácil de usar que deve corresponder aos seus requisitos de fluxo de trabalho de desenvolvimento.

https://github.com/ehyland/docker-silverstripe-dev

Principais características

  • DB persistente
  • Sua escolha de HHVM+ NGINXou Apache2+PHP5
  • Depurar e definir pontos de interrupção com xDebug

O arquivo README.md deve ser suficientemente claro para você começar.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.