DevOps系列——公司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. 在構建的時候的權限問題

# 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在哪裏,根目錄就在哪裏javascript

10.4. 爲mongo鏡像添加auth

// 一、經過node啓動一個鏡像
docker run --name mongo -d -v /var/mongo/data/db:/data/db -p 27017:27017 mongo

// 二、設置一些可視化工具支持連接
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)

// 三、建立第一個管理員
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


// 四、對第一個用戶的管理員進行認證和受權,注意管理員通常只負責管理,不負責增刪改查,因此須要不一樣數據庫的用戶
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()


// 五、爲數據庫設置用戶和密碼
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


// 六、將修改變爲增量鏡像,方便之後的使用,此時建立的鏡像就已經有auth了
docker commit mongo mongo-auth
docker stop mongo            #中止mongodb容器
docker rm mongo              #刪除mongodb容器

// 七、第一次啓動mongo-auth
docker run --name mongo -d -v /var/mongo/data/db:/data/db -p 27017:27017  mongo-auth mongod -—auth




// 八、其餘
// 構建出來一個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,有願意提供場地的公司也能夠聯繫我,會有優惠
相關文章
相關標籤/搜索