您的位置:首页 > 运维架构 > Docker

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

2017-05-08 16:11 931 查看
摘要: 这是我司Docker服务的脚本,和大家共享

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



接下来在发布任务中选择

源码管理: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

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

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

扩展阅读

官网:https://docs.mongodb.com/manual/tutorial/enable-authentication/

MongoDB 用户角色授权与AUTH启用:http://www.tuicool.com/articles/fMZbUzu

http://blog.csdn.net/meihuabo/article/details/48040745

http://stackoverflow.com/questions/39967117/restart-mongodb-docker-with-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错误

http://www.cnblogs.com/orzlin/p/5569604.html

10.6. 容器访问容器网络问题

10.6.1. 给容器加执行特权

docker run -i -t --privileged=true -v /home/docs:/src waterchestnut/nodejs:0.12.0


https://zhidao.baidu.com/question/2077398218946429308.html

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,有愿意提供场地的公司也可以联系我,会有优惠
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息