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.