DevOps系列——公司Docker测试,打版,发布实战

Stella981
• 阅读 563

1. 公司服务器结构图和发布流程介绍

DevOps系列——公司Docker测试,打版,发布实战

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-client

  • Dockerfile

    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-server

  • Dockerfile

    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服务,输入发布服务器的用户名和密码

DevOps系列——公司Docker测试,打版,发布实战

  • 接下来在发布任务中选择
    • 源码管理:none
    • 构建:send Files or execute commands over SSH

DevOps系列——公司Docker测试,打版,发布实战

  • 这样就相当于在远端服务器中执行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. 在构建的时候的权限问题

10.2. jenkins在执行的时候如果有docker stop name

  • 如果不存在这个镜像会报错

  • http://blog.csdn.net/xian312854159/article/details/41118245

  • ⭐️⭐️⭐️⭐️下面的东西要注意得有空格,不能多不能少⭐️⭐️⭐️⭐️

  • ⭐️⭐️⭐️⭐️注意加不加-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. 给容器加执行特权

10.6.2. 提示no route to host错误的问题

11. 特别感谢

12. 免责说明

  • 本文档中的部分内容摘自网上的众多博客,仅作为自己知识的补充和整理,并分享给其他需要的coder,不会用于商用。
  • 因为很多博客的地址看完没有及时做保存,所以很多不会在这里标明出处,非常感谢各位大牛的分享,也希望大家理解。
  • 如果原文作者感觉不适,可以及时联系我shiguoqing999@163.com,我将及时删除争议部分内容

13. 追责声明

  • 如有大段引用超过全文50%的内容,请在文档结尾标明原文出处:龙马行空-石国庆-https://my.oschina.net/u/1416844/blog,否则将视为抄袭,予以法律追究,请各位尊重个人知识产权。

个人公众号

  • 大家可以关注我的公众号,我会举办线下代码操练活动

    DevOps系列——公司Docker测试,打版,发布实战

  • 本人提供所有前端知识的付费咨询服务,本咨询可提升企业核心竞争力
    • Html5和Css3系列
    • Vue全家桶系列
    • JS面向对象系列
    • 微信开发系列(完善中)
    • RN开发系列(完善中)
    • DevOps系列
  • 价格请邮箱联系:shiguoqing999@163.com,有愿意提供场地的公司也可以联系我,会有优惠
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
2年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
待兔 待兔
2个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
8个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这