DockerLession03 部署现有服务(nodejs+mongodb)

写在前面

初用 VirtualBox, 几个显示切换快捷键还是要记一下的:

Right Ctrl + F        -- 切换到全屏模式
Right Ctrl + L        -- 切换到无缝模式
Right Ctrl + C        -- 切换到比例模式
Right Ctrl + Home -- 显示控制菜单

使用 VirtualBox, 共享 Windows 目录

点击Devices->Inserts Guest Additions CD Images..
mount /dev/cdrom /mnt/cdrom
cd /mnt/cdrom && sh VBoxLinuxAddition.run

在虚拟主机上共享C:\Share 到Share
mkdir /mnt/share
modprobe vboxsf
mount -t vboxsf Share /mnt/share

使用 VirtualBox, 挂载 ios 文件

umount -f /dev/cdrom
mkdir /mnt/cdrom
mount /dev/cdrom /mnt/cdrom

使用 Docker 编写 image 构建 node 服务

编写 install_nodejs.sh

首先编写在 linux 里可以运行的 node 部署脚本

PACKAGE_NAME=node-v5.0.0-linux-x64
INSTALL_PATH=/data/nodejs

echo "unpackage and copy data: "

if [ -d ./${PACKAGE_NAME} ]; then
    rm -rf ./${PACKAGE_NAME}
fi
tar zxvf ${PACKAGE_NAME}.tar.gz

if [ -d ${INSTALL_PATH} ]; then
    rm -rf ${INSTALL_PATH}
fi
cp ${PACKAGE_NAME} ${INSTALL_PATH} -r

echo "link node to path: "

rm -rf /usr/local/bin/node
rm -rf /usr/local/bin/npm
rm -rf /usr/bin/node
rm -rf /usr/bin/npm

ln -s ${INSTALL_PATH}/bin/node /usr/local/bin/node
ln -s ${INSTALL_PATH}/bin/npm  /usr/local/bin/npm
ln -s /usr/local/bin/node  /usr/bin/node
ln -s /usr/local/bin/npm   /usr/bin/npm

rm -rf /usr/local/bin/cnpm
rm -rf /usr/bin/cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
ln -s ${INSTALL_PATH}/bin/cnpm /usr/local/bin/cnpm
ln -s /usr/local/bin/cnpm  /usr/bin/cnpm

echo "start to install software: "

rm -rf /usr/local/bin/node-gyp
rm -rf /usr/bin/node-gyp
cnpm install node-gyp -g
ln -s ${INSTALL_PATH}/bin/node-gyp /usr/local/bin/node-gyp
ln -s /usr/local/bin/node-gyp   /usr/bin/node-gyp

rm -rf /usr/local/bin/pm2
rm -rf /usr/bin/pm2
cnpm install pm2 -g
ln -s ${INSTALL_PATH}/bin/pm2      /usr/local/bin/pm2
ln -s /usr/local/bin/pm2        /usr/bin/pm2

rm -rf /usr/local/bin/express
rm -rf /usr/bin/express
cnpm install express-generator -g
ln -s ${INSTALL_PATH}/bin/express  /usr/local/bin/express
ln -s /usr/local/bin/express    /usr/bin/express

rm -rf /usr/local/bin/hexo
rm -rf /usr/bin/hexo
cnpm install hexo -g
ln -s ${INSTALL_PATH}/bin/hexo     /usr/local/bin/hexo
ln -s /usr/local/bin/hexo       /usr/bin/hexo

rm -rf /usr/local/bin/forever
rm -rf /usr/bin/forever
cnpm install forever -g
ln -s ${INSTALL_PATH}/bin/forever  /usr/local/bin/forever
ln -s /usr/local/bin/forever    /usr/bin/forever

rm -rf /usr/local/bin/mocha
rm -rf /usr/bin/mocha
cnpm install mocha -g
ln -s ${INSTALL_PATH}/bin/mocha  /usr/local/bin/mocha
ln -s /usr/local/bin/mocha    /usr/bin/mocha

rm -rf /usr/local/bin/grunt
rm -rf /usr/bin/grunt
cnpm install grunt-cli -g
ln -s ${INSTALL_PATH}/bin/grunt  /usr/local/bin/grunt
ln -s /usr/local/bin/grunt    /usr/bin/grunt

rm -rf /usr/local/bin/supervisor
rm -rf /usr/bin/supervisor
cnpm install supervisor -g
ln -s ${INSTALL_PATH}/bin/supervisor  /usr/local/bin/supervisor
ln -s /usr/local/bin/supervisor    /usr/bin/supervisor

rm -rf /usr/local/bin/node-dev
rm -rf /usr/bin/node-dev
cnpm install node-dev -g
ln -s ${INSTALL_PATH}/bin/node-dev  /usr/local/bin/node-dev
ln -s /usr/local/bin/node-dev    /usr/bin/node-dev

rm -rf /usr/local/bin/node-inspector
rm -rf /usr/bin/node-inspector
cnpm install node-inspector -g
ln -s ${INSTALL_PATH}/bin/node-inspector  /usr/local/bin/node-inspector
ln -s /usr/local/bin/node-inspector    /usr/bin/node-inspector

rm -rf /usr/local/bin/sails
rm -rf /usr/bin/sails
cnpm install sails -g
ln -s ${INSTALL_PATH}/bin/sails    /usr/local/bin/sails
ln -s /usr/local/bin/sails      /usr/bin/sails

rm -rf /usr/local/bin/pomelo
rm -rf /usr/bin/pomelo
cnpm install pomelo -g
ln -s ${INSTALL_PATH}/bin/pomelo   /usr/local/bin/pomelo
ln -s /usr/local/bin/pomelo     /usr/bin/pomelo

ls -la /usr/local/bin/
ls -la /data/nodejs/bin/

编写 Dockerfile 文件

使用 Dockerfile 文件将 centos&安装脚本&node 安装包组合起来

FROM  centos:latest

RUN   yum install epel-release -y

RUN   mkdir -p /data/software/node/

COPY  install_nodejs.sh /data/software/node/
COPY  node-v5.0.0-linux-x64.tar.gz /data/software/node/

RUN   cd /data/software/node/ && sh install_nodejs.sh

使用编译语句将 Dockerfile 编译成镜像

docker build -t node-dev .
docker images

使用编译好的 node-dev:latest 镜像

依据我们构建好的 node-dev 来构建工程

Dockerfile:

FROM node-dev:latest

RUN  mkdir -p /data/projects/mobile
COPY . /data/projects/mobile

RUN  cd /data/projects/mobile && cnpm install -d

EXPOSE 18403

CMD  ["node", "/data/projects/mobile/app.js"]


Shell Command:

docker build -t mobile .

这样, 测试一下使用(-t –tty):

docker run -t --name mobile -d mobile

会看见控制台输出 log, 我的项目由于依赖了 mongo 数据库 127.0.0.1:27017, 会一直提示连接出错…

至此 nodejs 环境, 代码部署完成.

创建 mongo 数据库

mongo 使用官方集成环境

docker pull mongo

启动测试用例

docker run -p 27000:27017 --name mongodb -d mongo
netstat -lntp | grep 27000

将容器连接起来

删掉刚刚启动的 mobile 容器

docker stop mobile
docker rm xxxxxxxxxxxx

重新构建 mobile 容器, 与 mongodb 联结: –link plugin_name:alias

docker run -p 127.0.0.1:18403:18403 --link mongodb:mongodb -t --name mobile -d mobile

PS: 联结好之后, 如果想在 mobile 中访问 mongodb, 直接使用 IP 地址是不行的,
因为 mongodb 的 IP 地址是无法确定的, 但是在做联结的时候, 会在 mobile 的/etc/hosts 目录中,
增加一个记录例如
10.1.12.6 mongodb
含义是增加了访问 mongodb 的 hosts, 现在在 mobile 中访问 mongodb: mongodb://mongodb:27017/dbname 即可~

所以, 要提前在 mobile 中, 将数据库地址”127.0.0.1”更改为”mongodb”.

Donate - Support to make this site better.
捐助 - 支持我让我做得更好.