¿Hay beneficios al ejecutar mi entorno de desarrollo en un contenedor de Docker?

7

Me desarrollo principalmente utilizando Visual Studio en Windows. El problema es que después de un tiempo, Windows se atasca y me enfrento a la necesidad de reinstalar Windows. Del mismo modo, cambiar a nuevas máquinas es un problema.

Reinstalar Windows es doloroso porque mi entorno de desarrollo tiene muchas dependencias (como archivos de configuración de MSBuild adicionales, extensiones VS, npm, Java, etc.). No creo que esté solo teniendo un sistema complejo, y configurarlo de nuevo probablemente tomaría un día como mínimo.

Realmente no he usado Docker, pero en teoría parece que podría configurar mi entorno de desarrollo en un contenedor de Windows y luego enviarlo (p. ej., copiarlo en mi computadora portátil, instalarlo en una nueva instalación de Windows) y debería ser indoloro.

¿Es posible lo que estoy describiendo? ¿Hay desventajas, como el rendimiento, la fiabilidad? Otras gotchas?

    
pregunta Jim W 09.09.2017 - 02:50

3 respuestas

9

Este no es un problema poco común, pero Docker no es realmente la herramienta correcta para resolverlo. Los contenedores en general (incluido Docker) están destinados a proporcionar un tiempo de ejecución de la aplicación para un solo proceso , como un servidor web, no para un escenario de múltiples procesos, como un entorno de desarrollo. En se puede hacer, pero no es una solución muy elegante.

Un enfoque mejor (y más común) es crear máquinas virtuales a través de un hipervisor tradicional como VirtualBox o Hyper-V (ya que estás en Windows). Un flujo de trabajo típico es:

  • Encuentre o cree una imagen de VM base basada en su versión de SO preferida. Esto se puede hacer directamente con el instalador ISO, o alguien en su lugar de trabajo puede tener uno ya.
  • Una vez que se haya creado la imagen base, agregue todas las herramientas y configuraciones de desarrollo que necesite. Haga una instantánea o guárdela como una imagen separada.
  • Ahora puede ejecutar esta imagen, RDP o control remoto en ella, y trabajar hasta que llegue a un punto en el que se "quede atascado", y luego simplemente guarde los archivos que necesita (confirme con el control de código fuente, etc.) , luego sople la imagen y comience nuevamente desde cualquiera de las dos instantáneas / imágenes que creó. Esto se puede hacer en segundos, frente a un día a la antigua usanza.
  • En cualquier punto a lo largo de la línea, cree instantáneas adicionales cuando encuentre situaciones a las que le gustaría retroceder para reproducir un problema, etc.

Vagrant también es una herramienta fantástica para hacer mucho de lo anterior de una manera más estructurada.

Un beneficio adicional de todo esto es que ahora tiene entornos estandarizados que pueden compartirse con todo su equipo, ahorrando el esfuerzo a todos. Esto es especialmente bueno para la incorporación rápida de nuevas personas.

Volviendo a tu pregunta original, Docker no está realmente destinado a esto, pero si tuvieras un entorno de desarrollo suficientemente pequeño (por ejemplo, PHP en Linux), podrías hacerlo en un contenedor, y el beneficio sería mucho menor. imagen (potencialmente inferior a 100 MB frente a muchos GB para una máquina virtual de Windows con disco virtual).

    
respondido por el Dan1701 09.09.2017 - 04:10
2

no en un contenedor docker, pero sí en n contenedores docker.

Aunque, teóricamente, podría ensamblar todo su entorno de desarrollo en un solo contenedor, la ventana acoplable no estaba destinada a hacer esto.

En su lugar, debe implementar cada servicio en contenedores separados, utilizando docker compose , administrando toda la infraestructura en un solo archivo , donde cada servicio tendrá su propio archivo de registro, espacio de usuario, redes, etc.

Déjame darte un ejemplo, este es un borrador de mi 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

Hay un proxy nginx (myproxy), dos bases de datos postgres similares (mydb1 y 2), un antiguo servidor de aplicaciones web java (www), un contenedor java jetty que proporciona un servicio web de descanso y, por último, un contenedor SMTP Postfix muy simple. .

Todo comienza, generalmente :) - con docker-compose up , ya sea en mi máquina dev o en producción; los archivos de registro se agregan en un solo archivo fácil de leer y es posible replicar localmente casi todas las funciones con la garantía de que, si funciona en mi computadora portátil, funcionará.

    
respondido por el Edoardo 16.09.2017 - 21:19
1

Yo uso máquinas virtuales de VirtualBox para este tipo de cosas.

La portabilidad de tener tu entorno de desarrollo en un contenedor es útil, pero lo realmente bueno es que puedo hacer una instantánea de la cosa antes de cualquier intento de actualización, y si lo arruino, no hay problema en retroceder y comenzar de nuevo.

También me parece útil hacer esto porque frecuentemente trabajo con múltiples versiones de cosas como Qt, y no tengo ganas de descubrir cómo hacer que coexistan las dos versiones, en lugar de eso, simplemente las puse diferentes máquinas virtuales y no tengo que preocuparme por las interacciones porque instalé algo incorrectamente.

    
respondido por el Michael Kohne 11.10.2017 - 20:53

Lea otras preguntas en las etiquetas