在开发工作stream程中使用docker

我在OS X上使用boot2docker,并克隆了以下回购:

https://github.com/enokd/docker-node-hello

它基本上有一个Dockerfile和一个打印hello world的非常简单的快速应用程序。 当我构build和运行图像时,一切都运行良好,但是当然如果我在Mac上对index.js进行任何更改,都不会反映在我的运行映像中。 我似乎无法find任何有关如何设置docker的参考信息,以便我可以在开发环境中运行它,以便自动获取我的源代码更改,因此我觉得我“做错了”。 有什么build议么?

这是我目前如何运行它(我不使用stream浪汉,不太确定是否有任何区别):

$ docker build -t gasi/centos-node-hello . $ docker run -p 49160:8080 -d gasi/centos-node-hello $ curl localhost:49160 

更新:添加了我最终做的一个答案。

更新:使用boot2docker 1.3+和fig。添加了更多的当前答案。

您的问题非常有趣,(部分)与Docker没有特别的关系。 让我说,这里的主要和最后一个问题是使用虚拟机。

使用虚拟机(裸机Virtualbox VM,Vagrant VM,Docker boot2docker VM …)时,在主机上跟踪代码更改可能是一个挑战。

虚拟机是你的Mac(你的代码发生变化的地方)和你的应用程序栈(这里是在一个微小的Linux VM上运行的Docker容器)之间的一个完整的抽象层。

  • 您必须在Mac和boot2docker之间的Virtualbox中明确定义共享文件夹(NFS,…)。 这个共享文件夹将是你的代码库的根。 这是第一步。

    Mac :/ Users / You / stuff / approot ===> boot2docker/ something

  • 然后,你将不得不告诉你的Docker容器使用绑定到boot2docker的Volume (docker术语),并将你的Docker应用指向它:
   docker运行-v / something/ app / path / inside / docker -p 49160:8080 \
      -d gasi / centos-node-hello / usr / bin / node /app/path/inside/docker/index.js

  • 让NodeJs检测文件变化是另一个挑战。 您需要额外的包装来观察文件系统,并在代码更改后重新启动节点( Forever , Nodemon …)。

  • 此后,由于更改不会发生在本地文件系统上,而是发生在共享文件夹上,您可能必须告诉Nodejs监视器(Forever / Nodemon / …)使用轮询模式。 它工作(或多或less),但会烧毁大量的CPU。

关于与VirtualBox共享的文件夹,请查看:

boot2docker与VirtualBox Guest Additions一起使用
如何挂载/用户到boot2docker

https://medium.com/boot2docker-lightweight-linux-for-docker/boot2docker-together-with-virtualbox-guest-additions-da1e3ab2465c

tl; dr使用VirtualBox Guest Additions构build您自己的自定义boot2docker.iso(请参阅链接 )或下载http://static.dockerfiles.io/boot2docker-v1.1.0-virtualbox-guest-additions-v4.3.12.iso并保存到〜/ .boot2docker / boot2docker.iso。

编辑:更新链接到boot2docker v1.1.0

这是我最终做的,到目前为止似乎工作,但我仍然深入挖掘:

 # script located in bin/run NS=mycompany PROJECT=myproject # kill and remove old container if it exists docker kill $PROJECT docker rm $PROJECT # tag the previously built image docker tag $NS/$PROJECT $NS/$PROJECT:old # build the new image docker build -t $NS/$PROJECT . # remove the old image docker rmi $NS/$PROJECT:old docker run -dP --name=$PROJECT $NS/$PROJECT /sbin/my_init 

在我的项目根目录下,我只需运行:

 nodemon -x bin/run 

信贷来源于此。

docker1.3更新和无花果

无论如何,这真是太复杂了。 此外,boot2docker现在支持使用Virtual Box的共享文件夹在Mac OS X上安装卷。 这是我现在find的真正适合我的东西:

首先, Dockerfile

 FROM ubuntu:14.04 # Replace shell with bash so we can source files RUN rm /bin/sh && ln -s /bin/bash /bin/sh # Set debconf to run non-interactively RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections # Install base dependencies RUN apt-get update && apt-get install -y -q --no-install-recommends \ build-essential \ ca-certificates \ curl \ git \ libssl-dev \ python \ rsync \ software-properties-common \ wget \ && rm -rf /var/lib/apt/lists/* ENV NVM_DIR /usr/local/nvm ENV NODE_VERSION 0.10.33 # Install nvm with node and npm RUN curl https://raw.githubusercontent.com/creationix/nvm/v0.20.0/install.sh | bash \ && source $NVM_DIR/nvm.sh \ && nvm install $NODE_VERSION \ && nvm alias default $NODE_VERSION \ && nvm use default ENV NODE_PATH $NVM_DIR/v$NODE_VERSION/lib/node_modules ENV PATH $NVM_DIR/v$NODE_VERSION/bin:$PATH CMD ["npm", "start"] 

fig.yml

 app: image: myNodeImage working_dir: /home/myProject volumes_from: - myvols 

这是新的bin/run

 #!/usr/bin/env bash # This is the the bin/run script docker run --rm --volumes-from myvols myNodeImage \ rsync \ --delete \ --recursive \ --safe-links \ --exclude .git --exclude node_modules \ /data/myProject/ /home/myProject fig up 

我也有一个bin/install脚本来完成node_modules依赖项的安装。 这假定我已经在我的主机上完成了一个npm安装,这样任何私有包都可以工作。 另外,这对于npm链接很有效,你只需要在/home/linkedProject创build一个符号链接到你的容器中的$NODE_PATH/linkedProject

 #!/usr/bin/env bash # This is the the bin/install script docker run --rm --volumes-from myvols myNodeImage \ rm -rf /home/myProject && \ rsync \ --delete \ --recursive \ --safe-links \ --exclude .git \ /data/myProject/ /home/myProject && \ cd /home/myProject && \ npm rebuild 

所以,把这一切放在一起,这是按顺序的步骤:

  1. 创build我的数据卷容器:

    docker run -v $HOME/data:/data:ro \ -v /home \ -v /path/to/NODE_PATH \ --name myvols myNodeImage echo Creating my volumes

  2. 运行我的安装脚本: cd ~/data/myProject && ./bin/install

  3. 运行我的运行脚本: nodemon -x bin/run

docker可以帮助web开发的几个场景:

  1. 照明在本地快速提供各种不同的服务。 你想要一个干净的couchdb,运行docker run -d -p 5984:5984 tutum/couchdb ; MySQL,没问题: docker run -d -p 3306:3306 tutum/mysql ,与Firefox的selenium服务器? 简单: sudo docker run -p 4444:4444 -d lzhang/selenium ,你会立刻得到它们,并且可以被sudo docker run -p 4444:4444 -d lzhang/selenium销毁,接下来的几秒你不想要它们。 非常适合本地testing场景,无需担心如何configuration它们。

  2. pipe理软件依赖关系。 例如,要在不同的节点版本(0.8,0.10,0.10.25等)下运行节点应用程序,只需通过docker docker search nodejsfindnodejs docker镜像,然后通过将应用程序目录挂载为volume来创build容器,就可以运行多个彼此隔离的容器。 看看我的keystonejs示例项目,了解如何使用mongodb在0configuration下运行一个复杂的节点应用程序。 思考一个更复杂的模型:负载平衡器+应用程序+数据库+caching,在老派的方式,有大量的configuration选项,以适应安装程序,但是,如果你提供他们作为单独的容器和链接他们的名字 ,可以通过本地环境variables发现对方,就像本地PaaS一样。

  3. 通过searchdocker索引来使用应用程序的简单方法。 例如,有一个叫做Heartbleed checker的简洁工具,你可以通过一个命令快速下载/使用它在一个容器中进行configuration,甚至不需要考虑configuration,下载语言运行时,configuration,卸载等。

每boot2docker,我假设你在OSX上,所以你最好select支持hostonlynetworkingconfiguration的版本v0.9.2 +,那么你可以通过hostonlynetworking访问虚拟机内运行的容器。