Czy korzystanie z mojego środowiska programistycznego w kontenerze Docker jest korzystne?

12

Tworzę głównie za pomocą programu Visual Studio w systemie Windows. Problem polega na tym, że po pewnym czasie system Windows ugrzęznie i muszę ponownie zainstalować system Windows. Podobnie przejście na nowe maszyny jest problemem.

Ponowna instalacja systemu Windows jest bolesna, ponieważ moje środowisko programistyczne ma wiele zależności (takich jak dodatkowe pliki konfiguracyjne MSBuild, rozszerzenia VS, npm, Java itp.). Nie wyobrażam sobie, że jestem sam, mając skomplikowany system, a jego przywrócenie zajęłoby prawdopodobnie dzień minimum.

Tak naprawdę nie korzystałem z Dockera, ale teoretycznie brzmi to tak, jakbym mógł skonfigurować moje środowisko programistyczne w Windows Container, a następnie po prostu go rozesłać (np. Skopiować na mój laptop, zainstalować nową instalację Windows) i powinno to być bezbolesne .

Czy to, co opisuję, jest możliwe? Czy są jakieś wady, takie jak wydajność, niezawodność? Inne gotcha?

Jim W mówi o przywróceniu Moniki
źródło
Jestem ciekawy, co możesz zrobić ze środowiskiem programistycznym, które powoduje, że system Windows „ugrzęznie”. Instalacja Node, VS i niektórych wtyczek nie powinna powodować żadnych problemów.
neilsimp1
@ neilsimp1 masz rację, ale rzeczywistość jest bardziej jak 4 wersje VS, edytory, narzędzia do malowania, Android Studio, Netbeans, Office, CrashPlan, Git, TortoiseSVN, Fiddler, pulpit zdalny, konferencje, skype, wireshark, vmware i ciągle.
Jim W mówi o przywróceniu Moniki
Na marginesie, powinieneś przyjrzeć się narzędziom do klonowania dysku. Możesz zainstalować OS + całe potrzebne oprogramowanie i skonfigurować wszystko dokładnie. Następnie sklonuj dysk i skopiuj go gdzieś. Kiedy wszystko trzeba „zresetować”, po prostu przywróć z tego klonu i gotowe. Jest wiele narzędzi, które mogą to zrobić, a Twoja sytuacja może zaoszczędzić dziesiątki godzin :).
Radu Murzea,

Odpowiedzi:

13

Nie jest to rzadki problem, ale Docker nie jest właściwym narzędziem do jego rozwiązania. Kontenery ogólnie (w tym Docker) mają na celu zapewnienie środowiska wykonawczego aplikacji dla pojedynczego procesu , takiego jak serwer WWW, a nie dla scenariusza wieloprocesowego, takiego jak środowisko programistyczne. W może być zrobione, ale nie jest to bardzo eleganckie rozwiązanie.

Lepszym (i bardziej powszechnym) podejściem jest tworzenie maszyn wirtualnych za pomocą tradycyjnego hiperwizora, takiego jak VirtualBox lub Hyper-V (ponieważ korzystasz z systemu Windows). Typowy przepływ pracy to:

  • Znajdź lub utwórz podstawowy obraz maszyny wirtualnej w oparciu o preferowany smak systemu operacyjnego. Można to zrobić bezpośrednio za pomocą ISO instalatora lub ktoś w twoim miejscu pracy może już go mieć.
  • Po zbudowaniu obrazu podstawowego dodaj wszystkie potrzebne narzędzia i ustawienia programistyczne. Zrób migawkę lub zapisz jako osobny obraz.
  • Teraz możesz uruchomić ten obraz, RDP lub zdalnie, i pracować, aż dojdziesz do punktu, w którym „utkniesz”, a następnie po prostu zapisz potrzebne pliki (zobowiązaj się do kontroli źródła itp.), A następnie wydmuchuj od obrazu i zacznij ponownie od jednej z dwóch utworzonych migawek / obrazów. Można to zrobić w kilka sekund, w porównaniu do jednego dnia w staromodny sposób.
  • W dowolnym momencie na linii utwórz dodatkowe migawki, gdy napotkasz sytuacje, do których możesz chcieć przywrócić, aby odtworzyć problem itp.

Vagrant to także fantastyczne narzędzie do wykonywania większości powyższych czynności w bardziej uporządkowany sposób.

Zaletą tego wszystkiego jest to, że masz teraz znormalizowane środowiska, które można udostępniać całemu zespołowi, oszczędzając wszystkim wysiłku. Jest to szczególnie przydatne w przypadku szybkiego dołączania nowych osób.

Wracając do twojego pierwotnego pytania, Docker tak naprawdę nie jest do tego przeznaczony, ale jeśli masz wystarczająco małe środowisko programistyczne (powiedzmy PHP w Linuksie), możesz to zrobić w kontenerze, a korzyścią będzie znacznie mniejszy obraz (potencjalnie poniżej 100 MB w porównaniu do wielu GB dla maszyny wirtualnej z systemem Windows z dyskiem wirtualnym).

Dan1701
źródło
2

nie w jednym kontenerze dokowanym, ale tak w n kontenerach dokowanych.

Chociaż możesz - teoretycznie - zmontować całe środowisko programistyczne w jednym pojemniku, doker nie miał tego robić.

Zamiast tego powinieneś wdrożyć każdą usługę w osobnych kontenerach, używając komponowania dokowania , zarządzając całą infrastrukturą w jednym pliku, gdzie każda usługa będzie miała swój własny plik dziennika, przestrzeń użytkownika, sieć itp.

Dam wam przykład, to jest mój szkic docker-compose.yml

version: '2'
services:

  myproxy:
    build: myproxy
    container_name: ppproxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
    networks:
      default:
        aliases:
          - www.domain1.it
          - www.domain2.it
          - www.domain4.it

  mydb1:
    build: mydb
    environment:
      DB_USER: sdffdssdf
      DB_PASSWORD:  fdsfsdsdf
      DB_NAME: dbanme1
      DB_ENCODING: UTF-8    
      VIRTUAL_HOST: myhost1.net.lan
      VIRTUAL_PORT: 5432

  mydb2:
    build: mydb
    environment:
      DB_USER: ssdfsdfs
      DB_PASSWORD:  sffdssd
      DB_NAME: dbanme2
      DB_ENCODING: UTF-8    
      VIRTUAL_HOST: myhost2.net.lan
      VIRTUAL_PORT: 5432

  www:
    image: myimages/oldservice:v1.1
    container_name: www
    command: /bin/bash /root/launch
    environment:
        VIRTUAL_HOST: www.domain1.it
        VIRTUAL_PORT: 80
    ports:
      - 80
    depends_on:
      - mydb1
      - mydb1
      - myws

  myws:
    build: myjettycontainer
    environment:
        HTTPS_METHOD: noredirect
        VIRTUAL_HOST: www.domain2.it
        VIRTUAL_PORT: 8080
    ports:
      - 8080
    depends_on:
      - mydb1
      - mydb2
      - myproxy
      - mypostfix

  mypostfix:
    image: catatnight/postfix
    container_name: mailer
    environment:
      maildomain: domain1.it
      smtp_user: mymail:sfsfdfds
    ports:
      - 25

Istnieje serwer proxy Nginx (myproxy), dwie podobne bazy danych Postgres (mydb1 i 2), stary serwer aplikacji Java (www), kontener Java Jet, który zapewnia usługę spoczynkową, a na koniec bardzo prosty kontener Postfix SMTP.

Wszystko zaczyna się - zwykle :) - z docker-compose upalbo na mojej maszynie deweloperskiej, albo w produkcji; pliki dziennika są agregowane w jeden łatwy do odczytania plik i można replikować lokalnie prawie każdą funkcjonalność z gwarancją, że jeśli działa na moim laptopie, będzie działać.

Edoardo
źródło
2

Używam maszyn wirtualnych VirtualBox do tego rodzaju rzeczy.

Przenośność środowiska deweloperskiego w kontenerze jest przydatna, ale naprawdę fajną rzeczą jest to, że mogę wykonać migawkę przed próbą ulepszenia, a jeśli to spieprzę, nie będzie problemu, aby cofnąć się i zacząć od nowa.

Przydaje mi się również to, ponieważ często pracuję z wieloma wersjami rzeczy, takimi jak Qt, i nie mam ochoty wymyślić, jak sprawić, by obie wersje współistniały - zamiast tego po prostu umieszczam je na różnych maszynach wirtualnych i Nie muszę się martwić interakcjami, ponieważ zainstalowałem coś niepoprawnie.

Michael Kohne
źródło