准备:

需要5个文件

新建一个docker文件夹

1 .ignore git忽略文件用的

2 pakage.json 安装NODE程序的 也可以直接拷贝进 docker文件加

3 node环境 linux版本

4 node程序

5 dockerfile配置文件

package可以有也可以没有

此处分为两种:

一种是node程序在git上

一种是直接拷贝到docker程序中

为了简便我用的是第二种

dockerfile配置如下:

FROM centos:latest

ENV NPM_CONFIG_LOGLEVEL info

# NODE版本
ENV NODE_VERSION 4.5.0
# XCLOUD版本
ENV XCLOUD_VERSION 1.0.0

# linux node at https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.x
# e.g, curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz"
#此处将node环境拷贝进docker 在linux中需要编译安装,在docker中只需将其考进去便可以,考到root/app中 这个文件对外看不到
COPY ./node-v4.5.0-linux-x64.tar.xz / COPY ./node_modules/am-privatecloud /root/app RUN tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 \ && rm "node-v$NODE_VERSION-linux-x64.tar.xz" \
#此处不明白为什么多了一个连接????
&& ln -s /usr/local/bin/node /usr/local/bin/nodejs # 进入工作目录 WORKDIR /root/app # 安装项目依赖 RUN npm install # 启动项目 ENTRYPOINT ["node"] CMD ["-v"] # 开放30000端口 EXPOSE 30000

在虚拟机上按照型号安装好docker ;

1、将上面的docker文件拷贝到虚拟机上,进入目录运行

docker build -t yunshipei/private-xcloud:1.0.0 .

参数含义
-t yunshipei/private-xcloud:1.0.0 镜像名字为yunshipei/private-xcloud,tag为1.0.0
. 代表当前目录,即Dockerfile所在目录

生成docker镜像 即images

2、 测试镜像docker run --rm yunshipei/private-xcloud:1.0.0,如果输出v4.5.0说明容器没有问题。

参数含义
--rm 容器停止后删除容器
yunshipei/private-xcloud:1.0.0 镜像名:tag
这里没有指定启动命令,这时自动命令是Dockerfile中配置的ENTRYPOINT + CMD即node -v。如果指定了命令,指定的命令就会替换掉CMD的默认命令。

3、 启动容器

docker run -d --name xcloud -e "NODE_ENV=production" -v /root/xcloud:/root/app/static --restart=always -p 30000:30000 yunshipei/private-xcloud:1.0.0 /root/app/bin/www

此处注意 末尾 /root/app/bin/www 启动文件

参数含义: -d 以后台进程方式启动
--name xcloud容器名字为xcloud
-e "NODE_ENV=production" 设置环境变量NODE_ENV=production
-v /root/xcloud:/root/app/static 本地/root/xcloud(任意指定)目录映射到容器内的/root/app/static(不能变)目录(用户存放拉取下来的allmobilize.min.js)
--restart=always 如果进程异常退出总是自动重启
-p 30000:30000 将主机的30000端口映射到容器内的30000端口
yunshipei/private-xcloud:1.0.0 镜像名:tag
/root/app/server.js 启动命令(实际全部的启动命令为 node /root/app/server.js,因为在Dockerfile中已经设置了ENTRYPOINT为node)

4、 查看容器状态docker ps -a,找到Name是xcloud查看器状态。如果STATUS是UP说明容器正常启动了。

参数含义
ps -a 查看所有容器 查看名字是xloud的容器

如果配置完成,外网不能访问。那么检查一下本地系统的转发支持

sysctl net.ipv4.ip_forward    
net.ipv4.ip_forward = 1    

如果是0表示没有开启,则需要手动打开

sysctl -w net.ipv4.ip_forward=1    

以上设置在重启后就不生效了,想要永久生效需要在/etc/sysctl.conf找到net.ipv4.ip_forward部分设置为1(如果没有,在最后追加一项)

net.ipv4.ip_forward = 1

然后运行sysctl -p

镜像的导入导出

在机器上第一次编译镜像时间比较慢(首次编译如果本地没有镜像缓存,还要去中央仓库拉取依赖的镜像),另外新机器也可能没有权限去拉取Git上面的项目。在这种情况下在本地把镜像编译后,导出来,分发给客户镜像压缩包。客户那边直接装载这个导出的镜像即可。

镜像导出

docker save yunshipei/private-xcloud:1.0.0 | gzip -c > xcloud-100.tar.gz   

参数含义:
导出命令为docker save
yunshipei/private-xcloud:1.0.0 镜像名:tag
| gzip -c > xcloud-100.tar.gz 输出重定向到gzip执行压缩,然后输出到 xcloud-100.tar.gz文件中

镜像导入

gunzip -c xcloud-100.tar.gz | docker load                      

参数含义:
docker load 为导入镜像命令
gunzip -c xcloud-100.tar.gz解压镜像压缩包输出到标准输出
| docker load 重定向标准输出到docker load