Jaki byłby dobry przepływ pracy w Docker Webdev?

121

Mam przeczucie, że docker może znacznie usprawnić mój przepływ pracy w webdevie - ale nie udało mi się dokładnie wyjaśnić, jak podejść do projektu dodającego docker do stosu.

Podstawowy stos oprogramowania wyglądałby następująco:

Oprogramowanie

  • Obraz (y) platformy Docker udostępniający niestandardowy stos LAMP

    • Apache z kilkoma modułami
    • MYSQL
    • PHP
    • Niektóre CMS, np. Silverstripe
  • GIT

Przepływ pracy

Mogłem sobie wyobrazić przepływ pracy wyglądający mniej więcej tak:

Rozwój

  1. Napisz a, Dockerfilektóry definiuje pojemnik LAMP spełniający powyższe wymagania
    • REQ: Maszyna powinna uruchomić apache / mysql zaraz po uruchomieniu
  2. Zbuduj obraz dockera
  3. Skopiuj pliki wymagane do uruchomienia CMS np ~/dev/cmsdir
    • Poddaj się ~/dev/cmsdir/kontroli wersji
  4. Uruchom kontener Dockera i w jakiś sposób podłącz ~/dev/cmsdirgo /var/www/do kontenera
  5. Wypełnij bazę danych
  6. Pracuj w /dev/cmsdir/
  7. Zatwierdź i zamknij kontener Dockera

Rozlokowanie

  1. Skonfiguruj zdalnego hosta (np. Z ansible)
  2. Wypchnij obraz kontenera do zdalnego hosta
  3. Pobierz cmsdir-project przez git
  4. Uruchom kontener Docker, ściągnij bazę danych i zamontuj cmsdirdo/var/www

Na papierze to wszystko wygląda całkiem nieźle, ALE nie jestem do końca pewien, czy w ogóle byłoby to właściwe podejście.

Pytania:

  1. Podczas tworzenia lokalnego, w jaki sposób mogę sprawić, aby baza danych zachowała się między ponownymi uruchomieniami instancji kontenera? A może musiałbym za każdym razem uruchamiać sql-dump przed zakręceniem kontenera?

  2. Czy powinienem mieć oddzielne instancje kontenera dla bazy danych i serwera Apache? A może wystarczyłoby mieć jeden pojemnik na powyższy przypadek użycia?

  3. Jeśli używasz oddzielnych kontenerów dla bazy danych i serwera, w jaki sposób mógłbym zautomatyzować ich jednoczesne włączanie i wyłączanie?

  4. Jak właściwie zamontować /dev/cmsdir/w katalogu-kontenery /var/www/? Czy powinienem do tego wykorzystać woluminy danych ?

  5. Czy przegapiłem jakieś pułapki? Coś, co można uprościć?

jottr
źródło
1
To pytanie wydaje się interesujące dla wielu osób. Wygląda na to, że ktoś niedawno napisał na ten temat cykl postów na blogu. Ponieważ nie jest gotowy już teraz, będę zamieszczać linku w tym komentarzu: project-webdev.blogspot.de/2015/05/...
jottr

Odpowiedzi:

46
  1. Jeśli potrzebujesz trwałości bazy danych niezależnie od kontenera CMS, możesz użyć jednego kontenera dla MySQL i jednego kontenera dla swojego CMS. W takim przypadku możesz mieć swój kontener MySQL nadal działający i możesz niezależnie wdrażać swój CMS tak często, jak chcesz.

    Do programowania - inną opcją jest mapowanie katalogów danych mysql z komputera głównego / programistycznego przy użyciu woluminów danych. W ten sposób możesz zarządzać plikami danych dla mysql (w dockerze) używając git (na hoście) i "przeładuj" stan początkowy w dowolnym momencie (przed uruchomieniem kontenera mysql).

  2. Tak, myślę, że powinieneś mieć osobny pojemnik na db.

  3. Używam tylko podstawowego skryptu:

    #!/bin/bash
    
    $JOB1 = (docker run ... /usr/sbin/mysqld)
    $JOB2 = (docker run ... /usr/sbin/apache2)
    echo MySql=$JOB1, Apache=$JOB2
    
  4. Tak, możesz użyć przełącznika data-volume -v. Użyłbym tego do rozwoju. Możesz użyć montowania tylko do odczytu, więc żadne zmiany nie zostaną wprowadzone w tym katalogu, jeśli chcesz (Twoja aplikacja i tak powinna przechowywać dane w innym miejscu).

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

    W każdym razie, do ostatecznego wdrożenia, zbudowałbym i utworzył obraz za pomocą dockerfile z ADD /home/user/dev/cmsdir /var/www/cmsdir

  5. Nie wiem :-)

Jiri
źródło
6
Napisałem samouczek na temat pisania kontenera mysql, który implementuje to, o czym mówisz w # 1 txt.fliglio.com/2013/11/creating-a-mysql-docker-container
ben schwartz
48
Zdecydowanie potrzeba więcej samouczków / najlepszych praktyk dotyczących tego procesu. :(
Reza S
Ten samouczek może dać ci pewne wskazówki ...
Pithikos
Jeśli chcesz pobierać kod z Github w Dockerze, ten link sugeruje klucze SSH tylko do odczytu (aby obraz Dockera
jhtong
4
@RoyTruelove od 2015 r. Fig jest teraz przestarzała i
zastępuje docker
9

Chcesz użyć docker-compose. Postępuj zgodnie z samouczkiem tutaj. Bardzo prosty. Wydaje się, że zaznaczasz wszystkie pola.

https://docs.docker.com/compose/

Kevin Suttle
źródło
4

Rozumiem, że ten post ma już ponad rok, ale ostatnio zadałem sobie bardzo podobne pytania i mam kilka świetnych odpowiedzi na Twoje pytania.

  1. Możesz skonfigurować instancję dokera MySQL i zachować dane w bezstanowym kontenerze danych, co oznacza, że ​​kontener danych nie musi być aktywnie uruchomiony

  2. Tak, poleciłbym mieć oddzielną instancję dla serwera WWW i bazy danych. To jest moc Dockera.

  3. Sprawdź to repozytorium , które budowałem. Zasadniczo jest to tak proste, jak make build& make runi możesz mieć serwer WWW i kontener bazy danych działające lokalnie.

  4. Użyć -vargumentu podczas uruchamiania pojemnika po raz pierwszy, to odwołuje się folder konkretnego na pojemniku do hosta z systemem pojemnik.

  5. Myślę, że Twoje pomysły są świetne i obecnie możliwe jest osiągnięcie wszystkiego, o co prosisz.

Oto gotowe rozwiązanie spełniające wszystkie wymienione przez Ciebie potrzeby.

gegere
źródło
1

Przygotowałem łatwą w użyciu konfigurację Docker Compose , która powinna odpowiadać Twoim wymaganiom dotyczącym przepływu pracy.

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

Główne cechy

  • Trwałe DB
  • Twój wybór HHVM+ NGINXlub Apache2+PHP5
  • Debuguj i ustawiaj punkty przerwania za pomocą xDebug

Plik README.md powinien być wystarczająco jasny, abyś mógł zacząć.

eamon
źródło