1. 公司服务器结构图和发布流程介绍
2. node工具镜像的制作
有些东西在服务器上下载比较费劲,所有我们可以制作一个node工具镜像
在linux系统的任意位置新建
touch Dockerfile
文件内容
FROM node RUN npm install -g pomelo
RUN npm config set registry https://registry.npm.taobao.org
RUN npm install -g cnpm --registry=https://registry.npm.taobao.org
RUN npm install -g cnpm RUN npm install -g gulp RUN npm install -g web-pack RUN npm install -g nodemon
docker build -t node-tools
登录阿里Docker Hub上传镜像
sudo docker login --password=“8位密码.” --username=“龙马行空09” registry.cn-hangzhou.aliyuncs.com //sudo docker login --username=龙马行空09 registry.cn-hangzhou.aliyuncs.com sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/shiguoqing/node-tools:[镜像版本号] sudo docker push registry.cn-hangzhou.aliyuncs.com/shiguoqing/node-tools:[镜像版本号]
3. 纯静态网站发布
- 使用nginx镜像
4. 前段项目开发部署
4.1. 用nginx起服务
直接jenkins没有用Dockerfile
echo "正在构建静态网站”
&& docker run --name jupiter-install -v $(pwd):/home -w /home --rm node-tools npm install
&& docker run --name jupiter-build -v $(pwd):/home -w /home --rm node-tools npm run build \if [ "
docker ps -f name=jupiter -q
" ]; then echo "stop and rm jupiter” docker stop jupiter docker rm jupiter elif [ "docker ps -a -f name=jupiter -q
" ]; then echo "rm jupiter” docker rm jupiter else echo “jupiter 不存在" fi
&& docker run --name jupiter -d --restart always -v $(pwd)/dist:/usr/share/nginx/html:ro -p 5555:80 nginx
4.2. 用node起服务
jenkins
echo "正在构建"
&& cd web-server
&& docker build -t pomelo-dev-client . \if [ "
docker ps -f name=pomelo-dev-client -q
" ]; then echo "stop and rm pomelo-dev-client" docker stop pomelo-dev-client docker rm pomelo-dev-client elif [ "docker ps -a -f name=pomelo-dev-client -q
" ]; then echo "rm pomelo-dev-client" docker rm pomelo-dev-client else echo "pomelo-dev-client不存在" fi
&& docker run -d --name pomelo-dev-client --restart always -p 3001:3001 pomelo-dev-clientDockerfile
FROM node-pomelo MAINTAINER shiguoqing shiguoqing999@163.com
http://bitjudo.com/blog/2014/03/13/building-efficient-dockerfiles-node-dot-js/
use changes to package.json to force Docker not to use the cache
when we change our application's nodejs dependencies:
ADD package.json /tmp RUN cd /tmp && npm install RUN mkdir -p /home/pomelo/web-server && cp -a /tmp/node_modules /home/pomelo/web-server/ WORKDIR /home/pomelo/web-server ADD . /home/pomelo/web-server EXPOSE 3001 CMD ["nodemon", "app.js"]
5. 后端项目开发部署
jenkins
echo "正在构建"
&& cd game-server
&& docker build -t pomelo-dev-server . \if [ "
docker ps -f name=pomelo-dev-server -q
" ]; then echo "stop and rm pomelo—dev-server" docker stop pomelo-dev-server docker rm pomelo-dev-server elif [ "docker ps -a -f name=pomelo-dev-server -q
" ]; then echo "rm pomelo-dev-server" docker rm pomelo-dev-server else echo "pomelo—dev-server 不存在" fi
&& docker run -d --name pomelo-dev-server -e MONGOOSE_HOST=mongo -e MONGOOSE_AUTH=true --restart always -p 3010:3010 -p 3101:3101 -p 3102:3102 --link mongo:mongo pomelo-dev-serverDockerfile
FROM node-pomelo MAINTAINER shiguoqing shiguoqing@bimsop.com #http://bitjudo.com/blog/2014/03/13/building-efficient-dockerfiles-node-dot-js/
use changes to package.json to force Docker not to use the cache
when we change our application's nodejs dependencies:
RUN npm install -g cnpm --registry=https://registry.npm.taobao.org
ADD package.json /tmp RUN cd /tmp && npm install RUN mkdir -p /home/pomelo/game-server && cp -a /tmp/node_modules /home/pomelo/game-server/ WORKDIR /home/pomelo/game-server ADD . /home/pomelo/game-server
EXPOSE
EXPOSE 3010 EXPOSE 3101 EXPOSE 3102 CMD ["pomelo", "start"]
6. 项目打版
jenkins
- 这个时候代码也打包进去了
- 这个时候用主分支,其他时候用开发分支
code=0.2.9
&& cd game-server
&& echo "正在构建pomelo-server"
&& docker build -t pomelo-server-master .
&& cd ../web-server
&& echo "正在构建pomelo-client"
// —rm 运行完就删除 -v是映射目录 pwd当前路径 -w 工作目录 node 是镜像 && docker run --rm --name pomelo-client-master-install -v $(pwd):/home -w /home node npm install
&& docker run --rm --name pomelo-client-master-build -v $(pwd):/home -w /home node npm run build
&& ls
&& cp ../nginx.conf dist/nginx.conf
&& cp ../Dockerfile dist/Dockerfile
&& cd dist
&& ls
&& docker build -t pomelo-client-master . \&& echo “开始打版”
&& docker tag pomelo-client-master registry.cn-beijing.aliyuncs.com/pomelo/pomelo-client:${code}
&& docker tag pomelo-server-master registry.cn-beijing.aliyuncs.com/pomelo/pomelo-server:${code}
&& docker login --password=“密码密码密码.” --username=“石国庆”@b registry.cn-beijing.aliyuncs.com
&& docker push registry.cn-beijing.aliyuncs.com/pomelo/pomelo-client:${code}
&& docker push registry.cn-beijing.aliyuncs.com/pomelo/pomelo-server:${code}Dockerfile
- 该文件在项目根目录
FROM nginx MAINTAINER shiguoqing shiguoqing@bimsop.com RUN mkdir -p /home/app WORKDIR /home/app ADD . /home/app COPY ./nginx.conf /etc/nginx/conf.d/default.conf
nginx.conf
server { client_max_body_size 4G; listen 80; server_name localhost; root /home/app; gzip on; gzip_min_length 500; gzip_buffers 4 8k; gzip_types application/javascript application/x-javascript text/css application/xml image/gif image/jpeg image/PNG application/octet-stream; location ~ .*.(jpg|png|PNG|obj|map)$ { expires 30d; } location / {
autoindex on;
autoindex_exact_size on;
autoindex_localtime on;
index index.html; }
}
7. 发布准备工作
- 首先来到jenkins-系统管理-系统设置-下面的ssh服务,输入发布服务器的用户名和密码
- 接下来在发布任务中选择
- 源码管理:none
- 构建:send Files or execute commands over SSH
- 这样就相当于在远端服务器中执行shell脚本
- 发布的本就是将打版的镜像从远端服务器中拉下来,启动发布
8. 前段项目发布部署
jenkins
code=0.2.9
&& docker login --password="b8为密码.” --username="shiguoqing"@bimsop registry.cn-beijing.aliyuncs.com
&& docker pull registry.cn-beijing.aliyuncs.com/bimsop/sso-client:${code} \if [ "
docker ps -f name=sso-client -q
" ]; then echo "stop and rm sso-client" docker stop sso-client docker rm sso-client elif [ "docker ps -a -f name=sso-server -q
" ]; then echo "rm sso-client" docker rm sso-client else echo "sso-client 不存在" fi
&& docker run --name sso-client -d -p 1111:80 --restart always registry.cn-beijing.aliyuncs.com/bimsop/sso-client:${code}
9. 后端项目发布部署
jenkins
code=0.2.7
&& docker login --password="b8地方IM.” --username=“shiguoqing”@bimsop registry.cn-beijing.aliyuncs.com
&& docker pull registry.cn-beijing.aliyuncs.com/bimsop/sso-server:${code} \if [ "
docker ps -f name=sso-server -q
" ]; then echo "stop and rm sso-server" docker stop sso-server docker rm sso-server elif [ "docker ps -a -f name=sso-server -q
" ]; then echo "rm sso-server" docker rm sso-server else echo "sso-server 不存在" fi
&& docker run -d --link mongo:mongo --name sso-server --restart always -p 6699:6699 -e FRONTURL="accounts.bimsop.com" -e MONGOHOST="mongo" -e SSO_IP=accounts.bimsop.com registry.cn-beijing.aliyuncs.com/bimsop/sso-server:${code}
10. docker中出现的一些问题
10.1. 在构建的时候的权限问题
http://stackoverflow.com/questions/42104574/docker-build-in-jenkins
http://stackoverflow.com/questions/42104574/docker-build-in-jenkins
- 别忘了加sudo,因为有时候是root用户也不一定有管理员权限
代码
Add the docker group if it doesn't already exist.
$ sudo groupadd docker
Add jenkins user to docker group.
$ sudo gpasswd -a jenkins docker $ sudo gpasswd -a root jenkins $ sudo gpasswd -a ${USER} jenkins
Restart the Docker daemon.
$ sudo service docker restart $ sudo service jenkins restart
10.2. jenkins在执行的时候如果有docker stop name
如果不存在这个镜像会报错
⭐️⭐️⭐️⭐️下面的东西要注意得有空格,不能多不能少⭐️⭐️⭐️⭐️
⭐️⭐️⭐️⭐️注意加不加-n 无影响, 如果镜像不一样,比如做了一些修改,已经不是用一个镜像,同样会报重名的问题⭐️⭐️⭐️⭐️
echo "正在构建"
&& docker -v
&& cd game-server
&& docker build -t pomelo-server-dev . \if [ "
docker ps -f name=pomelo-server-dev -q
" ]; then echo "stop and rm pomelo-server-dev" docker stop pomelo-server-dev docker rm pomelo-server-dev elif [ "docker ps -a -f name=sso-server -q
" ]; then echo "rm pomelo-server-dev" docker rm pomelo-server-dev else echo "pomelo-server-dev 不存在" fi
&& docker run -d --name pomelo-server-dev --restart always -p 3010:3010 --link mongo:mongo pomelo-server-dev
10.3. 文件路径的问题
DockerFile在哪里,根目录就在哪里
10.4. 为mongo镜像添加auth
扩展阅读
官方mongo镜像的使用介绍实现不了,所以我总结了以下的用法和大家分享
// 1、通过node启动一个镜像 docker run --name mongo -d -v /var/mongo/data/db:/data/db -p 27017:27017 mongo
// 2、设置一些可视化工具支持链接 docker exec -it mongo /bin/bash mongo use admin var schema = db.system.version.findOne({"_id" : "authSchema"}) schema.currentVersion = 3 db.system.version.save(schema)
// 3、创建第一个管理员 db.createUser({user:”superAdmin",pwd:"abcdefgh",roles:[{role:'userAdminAnyDatabase',db:'admin'}]})
// 这一小段有可能不需要,不行就加上 exit cp -rf /etc/mongod.conf.orig /data/db
exit vi /var/mongo/data/db/mongod.conf.orig // authorization:'enabled' docker exec -it mongo /bin/bash cd /etc cp -rf /data/db/mongod.conf.orig .
exit// 4、对第一个用户的管理员进行认证和授权,注意管理员一般只负责管理,不负责增删改查,所以需要不同数据库的用户 docker stop mongo docker start mongo
docker exec -it mongo /bin/bash mongod --auth --port 27017 --dbpath /data/db mongo --port 27017 -u ‘superAdmin’ -p ‘abcdefgh’ --authenticationDatabase ‘admin’
use admin db.auth(‘superAdmin’,’abcd1234!’) db.system.users.find()
// 5、为数据库设置用户和密码 use peacock db.createUser( { user: “peacockDevelop”, pwd: “abcdefgh”, roles: [ { role: "readWrite", db: “peacock” }, { role: "readWrite", db: “users” } ] } )
use users db.createUser( { user: “peacockDevelop2”, pwd: “abcdefgh”, roles: [ { role: "readWrite", db: “peacock” }, { role: "readWrite", db: “users” } ] } )
use pomelo-vr db.createUser( { user: “pomeloDevelop”, pwd: “abcdefgh”, roles: [ { role: "readWrite", db: “pomelo-vr” }] } ) exit exit
// 6、将修改变为增量镜像,方便以后的使用,此时创建的镜像就已经有auth了 docker commit mongo mongo-auth docker stop mongo #停止mongodb容器 docker rm mongo #删除mongodb容器
// 7、第一次启动mongo-auth docker run --name mongo -d -v /var/mongo/data/db:/data/db -p 27017:27017 mongo-auth mongod -—auth
// 8、其他 // 构建出来一个mongo-auth镜像后就已经是开启权限的镜像了,再次启动的时候不需要加—-auth // 再增加新用户的时候直接进去就可以了,然后启动的时候不需要增加—auth,否则报找不到—-auth命令 docker exec -it mongo /bin/bash mongo --port 27017 -u ‘superAdmin’ -p ‘abcdefgh’ --authenticationDatabase ‘admin’
use admin db.system.users.find()
use peacock db.createUser( { user: “peacockDevelop”, pwd: “abcdefgh”, roles: [ { role: "readWrite", db: “peacock” }, { role: "readWrite", db: “users” } ] } ) docker run --name mongo -d -v /var/mongo/data/db:/data/db -p 27017:27017 mongo-auth mongod
10.5. No space left on device错误
10.6. 容器访问容器网络问题
10.6.1. 给容器加执行特权
docker run -i -t --privileged=true -v /home/docs:/src waterchestnut/nodejs:0.12.0
10.6.2. 提示no route to host错误的问题
- 该问题未解决
- http://www.cnblogs.com/performancetest/p/5716595.html
- http://dockone.io/question/400
- docker增加host:http://blog.csdn.net/yugongpeng_blog/article/details/47185109
11. 特别感谢
12. 免责说明
- 本文档中的部分内容摘自网上的众多博客,仅作为自己知识的补充和整理,并分享给其他需要的coder,不会用于商用。
- 因为很多博客的地址看完没有及时做保存,所以很多不会在这里标明出处,非常感谢各位大牛的分享,也希望大家理解。
- 如果原文作者感觉不适,可以及时联系我shiguoqing999@163.com,我将及时删除争议部分内容
13. 追责声明
- 如有大段引用超过全文50%的内容,请在文档结尾标明原文出处:龙马行空-石国庆-https://my.oschina.net/u/1416844/blog,否则将视为抄袭,予以法律追究,请各位尊重个人知识产权。
个人公众号
- 大家可以关注我的公众号,我会举办线下代码操练活动
- 本人提供所有前端知识的付费咨询服务,本咨询可提升企业核心竞争力
- Html5和Css3系列
- Vue全家桶系列
- JS面向对象系列
- 微信开发系列(完善中)
- RN开发系列(完善中)
- DevOps系列
- 价格请邮箱联系:shiguoqing999@163.com,有愿意提供场地的公司也可以联系我,会有优惠