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

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

090547_t6Bu_1416844.png

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

090548_IH1P_1416844.jpeg

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

090548_lnea_1416844.jpeg

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

# 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

  • 如果不存在这个镜像会报错
  • 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


// 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,否则将视为抄袭,予以法律追究,请各位尊重个人知识产权。

个人公众号

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

   

  • 本人提供所有前端知识的付费咨询服务,本咨询可提升企业核心竞争力
    • Html5和Css3系列
    • Vue全家桶系列
    • JS面向对象系列
    • 微信开发系列(完善中)
    • RN开发系列(完善中)
    • DevOps系列
  • 价格请邮箱联系:shiguoqing999@163.com,有愿意提供场地的公司也可以联系我,会有优惠

 

 

 

 

 

 

转载于:https://my.oschina.net/u/1416844/blog/894170

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值