这是我目前的运行方式(我没有使用Vagrant,不确定这是否有任何区别):
$ 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 build -t gasi/centos-node-hello .
$ docker run -p 49160:8080 -d gasi/centos-node-hello
$ curl localhost:49160
更新:添加了我最终采用的答案。
更新:添加了使用boot2docker 1.3+和fig的更多当前答案。
docker run -v /something:/app/path/inside/docker -p 49160:8080 \ -d gasi/centos-node-hello /usr/bin/node /app/path/inside/docker/index.js
简而言之,构建带有VirtualBox Guest Additions的自定义boot2docker.iso(参见链接)或下载http://static.dockerfiles.io/boot2docker-v1.1.0-virtualbox-guest-additions-v4.3.12.iso并将其保存到~/.boot2docker/boot2docker.iso。
这是我最终做的事情,目前看起来有效,但我仍在深入研究:
# 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
感谢这个来源。
针对docker 1.3和fig的更新
Fig很棒,它真正简化了我以前的脚本。此外,boot2docker现在通过Virtual Box的共享文件夹原生支持在Mac OS X上挂载卷。这是我现在发现非常有效的方法:
首先,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 install,以便任何私有包都能正常工作。此外,这与npm链接很好地配合使用,您只需要将符号链接从/home/linkedProject
创建到容器中的$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
nodemon
,而是编写了一个脚本,使用nodemon
作为库,在将其发送到Docker构建上下文之前正确设置项目。这使我能够做一些事情,比如同时拉取我正在开发的依赖项目。 - Abdullah Jibaly有几种场景可以使用Docker来帮助Web开发:
快速提供各种本地服务。你想要一个干净的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
,你会立即得到它们,并且可以通过docker kill
在下一秒钟摧毁它们。非常适合本地测试场景,无需担心如何配置它们。
管理软件依赖项。例如,您想在不同的node版本(0.8、0.10、0.10.25等)下运行您的node应用程序,只需通过docker search nodejs
查找nodejs docker镜像,并通过挂载应用程序目录作为卷创建容器,您可以运行多个相互隔离的容器。看看我的keystonejs-example项目,了解如何在几秒钟内使用0配置运行复杂的node应用程序和mongodb。考虑更复杂的模型:负载均衡器+应用程序+数据库+缓存,在老式的方式中,有大量的配置选项来适应设置过程,但是,如果将它们作为单独的容器提供,并通过名称链接连接,每个组件都可以通过本地环境变量发现彼此,就像本地PaaS一样。
通过搜索docker index轻松使用应用程序。例如,有一个很棒的工具叫做Heartbleed checker,你可以通过一个命令快速下载/使用它在一个带有准备好配置的容器中,甚至不需要考虑配置、下载语言运行时、配置、卸载等。