在Docker容器中运行开发环境是否有好处?


12

我主要在Windows上使用Visual Studio进行开发。问题是一段时间后Windows陷入困境,我面临着需要重新安装Windows的麻烦。同样,切换到新机器也是一个问题。

重新安装Windows很麻烦,因为我的开发环境有很多依赖项(例如,额外的MSBuild配置文件,VS扩展,npm,Java等)。我不认为我会一个人拥有复杂的系统,而将其设置为备份至少可能需要一天的时间。

我没有真正使用过Docker,但是从理论上讲,这听起来像我可以在Windows容器中设置我的开发环境,然后随身携带它(例如,复制到我的笔记本电脑中,放入新的Windows安装中),这应该很轻松。

我要描述的可能吗?是否存在性能,可靠性等缺点?其他陷阱?


我很好奇您会在导致Windows“陷入困境”的开发环境中做什么。安装Node,VS和某些插件应该不会引起任何问题。
neilsimp1'1/

@ neilsimp1是正确的,但实际情况更像是VS的4个版本,编辑器,绘画工具,Android Studio,Netbeans,Office,CrashPlan,Git,TortoiseSVN,Fiddler,远程桌面,会议,Skype,wireshark,vmware和继续。
Jim W说要

作为附带说明,您应该研究磁盘克隆实用程序。您可以安装OS +所有必需的软件并正确配置所有内容。然后克隆磁盘并将其备份到某个位置。当您需要“重置”所有内容时,只需从该克隆中还原即可。有很多工具可以做到这一点,在您的情况下,它可以节省数十个小时:)。
Radu Murzea '17

Answers:


13

这不是一个罕见的问题,但是Docker并不是解决它的正确工具。通常,容器(包括Docker)旨在为单个进程(例如Web服务器)提供应用程序运行时,而不是为多进程方案(例如dev环境)提供应用程序运行时。在可以做,但不是很优雅的解决方案。

更好(也是更常见)的方法是通过传统的虚拟机管理程序(例如VirtualBox或Hyper-V)创建VM(因为您使用的是Windows)。典型的工作流程是:

  • 根据您喜欢的操作系统风格查找或创建基础VM映像。这可以直接通过安装程序ISO来完成,或者您工作场所中的某人可能已经拥有一个。
  • 构建基础映像后,添加所需的所有开发工具和设置。快照或将其另存为单独的图像。
  • 现在,您可以运行此映像(RDP或远程映像),并进行操作,直到达到“陷入困境”的地步,然后保存所需的文件(提交给源代码控制等),然后进行删除删除该图像,然后从创建的两个快照/图像中重新开始。这可以在几秒钟内完成,而传统的一天最多可以完成一天。
  • 在此过程中的任何时候,遇到可能需要回滚以重现问题的情况时,请创建其他快照。

Vagrant还是一种出色的工具,可以以更结构化的方式完成上述大部分操作。

所有这些的附带好处是您现在拥有可以与您的整个团队共享的标准化环境,从而节省了所有人的精力。这对于快速入职的新人特别有用。

回到您最初的问题,Docker并不是真的打算这样做,但是如果您有一个足够小的开发环境(例如Linux上的PHP),则可以在容器中进行操作,这样做的好处是可以缩小图像(可能是)小于100MB,而带有虚拟磁盘的Windows VM则为许多GB)。


2

不是在一个docker容器中,而是在n个docker容器中。

从理论上讲,虽然您可以在一个容器中组装整个开发环境,但docker并不是要这样做。

相反,您应该使用docker compose将每个服务部署到单独的容器中,在一个文件中管理整个基础架构,其中每个服务将具有自己的日志文件,用户空间,网络等。

让我举一个例子,这是我的草稿 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

有一个nginx代理(myproxy),两个类似的postgres数据库(mydb1和2),一个旧的Java Web应用程序服务器(www),一个提供其余Web服务的Java Jetty容器,最后是一个非常简单的SMTP postfix容器。

一切都会开始-通常是:)-通过docker-compose up,在我的开发机器上或在生产中进行;日志文件被汇总到一个易于阅读的文件中,并且可以在本地复制几乎所有功能,并保证如果在笔记本电脑上可以正常运行。


2

我将VirtualBox VM用于此类事情。

将开发环境放在容器中的可移植性很方便,但真正的好处是,我可以在进行任何升级尝试之前对其进行快照,并且如果我搞砸了,可以退回并重新启动也没问题。

我还发现这样做很有帮助,因为我经常使用Qt之类的多个版本,并且我不想弄清楚如何使两个版本共存-相反,我只是将它们放在不同的VM上,我不必担心交互,因为我安装不正确。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.