2015-04-24 6 views
8

So vor kurzem entdeckte ich Docker und Vagabund, und ich beginne ein neues Php Projekt, in dem ich beide verwenden möchten:Projekt-Layout mit vagabundierenden, Docker und git

Vagrant, um eine austauschbare Umgebung zu haben, dass alle die Entwickler können verwenden.

Docker für die Produktion, sondern auch in der Vagabund Maschine so die Entwicklungsumgebung, die Produktion einer so eng wie möglich ähnelt.

Der erste Ansatz ist Dateien aller Definition zu haben, zusammen mit dem Quellcode im gleichen Repository mit diesem Layout:

/docker 
    /machine1-web_server 
     /Dockerfile 
    /machine2-db_server 
     /Dockerfile 
    /machineX 
     /Dockerfile 
/src 
    /app 
    /public 
    /vendors 
/vagrant 
    /Vagrantfile 

So ist die Vagabund Maschine, auf Bereitstellung, läuft alle Docker „Maschinen“ und Sets Datenbanken und Quellcode ordnungsgemäß.

Ist das ein guter Ansatz? Ich versuche immer noch herauszufinden, wie dies in Bezug auf den Einsatz in der Produktion funktionieren wird.

Antwort

7

Ist das ein guter Ansatz?

Ja, zumindest funktioniert es seit ein paar Monaten für mich.

Der Unterschied ist, dass ich auch eine docker-compose.yml-Datei haben.

In meinem Vagrantfile gibt es einen ersten Bereitstellungsabschnitt, der Docker installiert, pip und Docker-compose:

config.vm.provision "shell", inline: <<-SCRIPT 
    if ! type docker >/dev/null; then 
     echo -e "\n\n========= installing docker..." 
     curl -sL https://get.docker.io/ | sh 
     echo -e "\n\n========= installing docker bash completion..." 
     curl -sL https://raw.githubusercontent.com/dotcloud/docker/master/contrib/completion/bash/docker > /etc/bash_completion.d/docker 
     adduser vagrant docker 
    fi 
    if ! type pip >/dev/null; then 
     echo -e "\n\n========= installing pip..." 
     curl -sk https://bootstrap.pypa.io/get-pip.py | python 
    fi 
    if ! type docker-compose >/dev/null; then 
     echo -e "\n\n========= installing docker-compose..." 
     pip install -U docker-compose 
     echo -e "\n\n========= installing docker-compose command completion..." 
     curl -sL https://raw.githubusercontent.com/docker/compose/$(docker-compose --version | awk 'NR==1{print $NF}')/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose 
    fi 
SCRIPT 

und schließlich ein Provisioning-Abschnitt, der Docker-compose feuert:

config.vm.provision "shell", inline: <<-SCRIPT 
    cd /vagrant 
    docker-compose up -d 
SCRIPT 

Es gibt other ways zu bauen und docker-Container von vagabundierendem zu starten, aber mit docker-compose ermöglicht es mir, jeden docker externalisieren Besonderheiten aus meiner Vagrantfile. Dadurch kann diese Vagrant-Datei für andere Projekte ohne Änderungen wiederverwendet werden; Sie müssten nur eine andere docker-compose.yml Datei bereitstellen.

Eine andere Sache, die ich anders mache, ist die Vagrantfile an der Wurzel Ihres Projekts (und nicht in einem Verzeichnis vagrant), da es ein Ort ist Menschen und Werkzeuge (einige IDE) erwarten, es zu finden. PyCharm macht es, PhpStorm wahrscheinlich.

Ich legte meine docker-compose.yml Datei an der Wurzel meiner Projekte auch.

Am Ende, für die Entwicklung gehe ich einfach zu meinem Projekt-Verzeichnis und fire vagrant, die docker-compose (schließlich bauen dann) die Docker-Container ausführen.


Ich versuche immer noch herauszufinden, wie dies in Bezug auf die Bereitstellung der Produktion arbeiten.

Für die Produktion bereitstellen, ist eine gängige Praxis, um Ihre Docker Bilder an das ops Team zu schaffen, indem sie auf eine privatendocker registry veröffentlichen.Sie können entweder eine solche Registrierung in Ihrer eigenen Infrastruktur hosten oder Online-Dienste verwenden, die sie bereitstellen, wie beispielsweise Docker Hub.

Geben Sie dem ops-Team auch eine docker-compose.yml-Datei, die definiert, wie die Container ausgeführt und verknüpft werden. Beachten Sie, dass diese Datei die Anweisung build: nicht verwenden sollte, sondern sich stattdessen auf die Anweisung image: bezieht. Wer möchte während der Bereitstellung in der Produktion Komponenten erstellen/kompilieren?

Diese Docker blog article kann helfen herauszufinden, wie docker-compose und docker-swarm zur Bereitstellung auf einem Cluster verwendet werden.

+0

Große Antwort, vielen Dank. Nur eine kleine Extra-Frage: Verwenden Sie in Vagrant eine Box oder den Docker-Provider? – antonienko

+2

Ich benutze die 'phusion/ubuntu-14.04-amd64' Box. Ich versuchte den Landstreicher, aber ich war nicht zufrieden mit dem Ergebnis. Es war Monate her, vielleicht funktioniert es jetzt besser, aber mit einem Box + Provisioning-Andockfenster haben Sie die Kontrolle. Meine Vagrantfile ist verfügbar unter https://github.com/thomasleveil/vagrant-phusion-docker/blob/master/Vagrantfile – Thomasleveil

1

Ich empfehle, Docker für die Entwicklung zu verwenden, um vollständige Replikation von Abhängigkeiten zu erhalten. Docker Compose ist das Schlüsselwerkzeug.

Sie können eine Strategie wie folgt verwenden:

Docker-compose.yml

db: 
    image: my_database_image 
    ports: ... 

machinex: 
    image: my_machine_x_image 

web: 
    build: . 
    volumes: 
    - '/path/to/my/php/code:/var/www' 

In Ihrem Dockerfile Sie die Abhängigkeiten festlegen können Sie Ihre PHP-Code auszuführen.

Auch ich empfehle, my_database_image und my_machine_x_image Projekte getrennt mit ihren Dockerfiles zu halten, weil perfekt mit anderen Projekten verwendet werden kann.

Wenn Sie Mac verwenden, werden Sie bereits eine VM namens boot2docker

Ich hoffe, das hilft.