從0到1,打造小團隊前端工程化服務(3/3)

前言

這篇是 npm私有庫 + API Mock服務搭建 + docker-compose快速部署以前的全部服務javascript

建議先看自動部署篇css

一條龍!CI / CD 打造一個小前端團隊工程化服務環境html

progress-all-guide

Verdaccio

做爲一個積極上進的小開發團隊,固然必需要有本身的npm私有庫啊前端

這裏咱們選擇了verdaccio,一個開源輕量的npm私服,他還有官方的docker鏡像vue

1 docker 安裝 Verdaccio

# 查看官方的verdaccio鏡像源
docker search verdaccio
 # 看到官方鏡像源叫 verdaccio/verdaccio,咱們下載下來
docker pull verdaccio/verdaccio
 #咱們先在咱們用戶工做目錄下,新建一個verdaccio目錄
cd ~
mkdir verdaccio
cd verdaccio
mkdir conf
mkdir storage,
mkdir plugins
 #進入conf,建立verdaccio須要的配置文件
cd conf
vi config.yaml
複製代碼

config.yaml內容以下java

# # This is the config file used for the docker images.
# It allows all users to do anything, so don't use it on production systems.
# # Do not configure host and port under `listen` in this file
# as it will be ignored when using docker.
# see https://github.com/verdaccio/verdaccio/blob/master/wiki/docker.md#docker-and-custom-port-configuration
# # Look here for more config file examples:
# https://github.com/verdaccio/verdaccio/tree/master/conf
#  # path to a directory with all packages
storage: /verdaccio/storage

auth:
  htpasswd:
    file: /verdaccio/conf/htpasswd
    # Maximum amount of users allowed to register, defaults to "+inf".
    # You can set this to -1 to disable registration.
    #max_users: 1000
 # a list of other known repositories we can talk to
uplinks:
  npmjs:
    url: https://registry.npm.taobao.org

packages:
  
  '@*/*':
    # scoped packages
    access: $all
    publish: $all
    proxy: npmjs

  '**':
    # allow all users (including non-authenticated users) to read and
    # publish all packages
    #
    # you can specify usernames/groupnames (depending on your auth plugin)
    # and three keywords: "$all", "$anonymous", "$authenticated"
    access: $all

    # allow all known users to publish packages
    # (anyone can register by default, remember?)
    publish: $all

    # if package is not available locally, proxy requests to 'npmjs' registry
    proxy: npmjs
 # To use `npm audit` uncomment the following section
middlewares:
  audit:
    enabled: true
 # log settings
logs:
  - {type: stdout, format: pretty, level: trace}
 #- {type: file, path: verdaccio.log, level: info}
複製代碼

建立verdaccio容器應用node

# 建立+運行verdaccio容器
docker run \
  --name verdaccio \
  -d \
  -it \
  -p 4873:4873 \
  -v ~/verdaccio/storage:/verdaccio/storage \
  -v ~/verdaccio/conf:/verdaccio/conf \
  -v ~/verdaccio/plugins:/verdaccio/plugins \
  -v /etc/localtime:/etc/localtime:ro \
  verdaccio/verdaccio
複製代碼
  • docker run: 建立一個新容器python

  • --name verdaccio: 將這個容器命名爲jenkins(這個後面方便操做)nginx

  • **-d:**這個參數能讓容器到後臺運行git

  • -it: -i 以交互模式運行容器,-t 爲容器從新分配一個僞輸入終端

  • **-p:**端口映射,格式爲:主機(宿主)端口:容器端口

  • **-v:**在這裏是是掛載模式,規則是設置的宿主文件掛載到容器內部,容器內容無論有什麼內容都會被替換成宿主掛載目錄的文件

    並且設置的掛載目錄不能爲空

  • -v /etc/localtime:/etc/localtime:ro : 同步容器和主機的時間,ps:這玩意在mac上很差使

  • verdaccio/verdaccio: 這個是image鏡像文件,docker將以此鏡像文件建立一個容器,若是本地不存在會自動拉去線上最新的版本

    建立生成容器後咱們打印容器建立的信息能夠看到

#查看容器運行日誌
docker logs verdaccio
 warn --- config file  - /verdaccio/conf/config.yaml
 warn --- Verdaccio started
 ...
 ...
 ...
 warn --- Plugin successfully loaded: verdaccio-htpasswd
 warn --- Plugin successfully loaded: verdaccio-audit
 warn --- http address - http://0.0.0.0:4873/ - verdaccio/4.8.1
複製代碼

看到端口是4873,上面咱們生成容器的時候,咱們也是配置了4873的端口映射,去阿里雲配置了添加4873端口的安全組規則後,咱們打開網站 http://yourip:4873

verdaccio-web

2 配置和註冊

從剛纔的log 能夠看到docker的verdaccio容器的配置文件是指向 /verdaccio/conf/config.yaml

這個容器沒有 /bin/bash,只有sh,咱們進入容器看看配置文件

#進入docker容器,用sh作交互
docker exec -it verdaccio /bin/sh
#cd到配置目錄下
cd /verdaccio/conf
#查看默認的配置文件
cat config.yaml
複製代碼

詳細的配置文件能夠查看官網的教程

  1. 默認的儲存目錄:verdaccio默認使用內置本地文件模式存儲
storage: /verdaccio/storage/data
複製代碼
  1. 插件存放的目錄:
plugins: /verdaccio/plugins
複製代碼
  1. 認證 :默認的受權是基於htpasswd 而且是內置的。您能夠經過plugins來修改此行爲
auth:
  htpasswd:
    file:  /verdaccio/storage/htpasswd
    #max_users : 10000
複製代碼
  1. 上行鏈路`uplinks,這裏咱們作了幾個源的添加
uplinks:
  npmjs:
    url: https://registry.npmjs.org/
  yarn:
  	url: https://registry.yarnpkg.com/
  cnmp: 
  	url: http://r.cnpmjs.org/
  taobao:
  	url: https://registry.npm.taobao.org/
複製代碼
  1. 包的訪問
packages:
  'wild-fox-*':
  	access: $all
    publish: $authenticated
    unpublish: $authenticated
   '**':
    access: $all
    publish: $authenticated
    unpublish: $authenticated
    proxy:   taobao
複製代碼
  • wild-fox-*: 這個前綴的包都能下載,只有認證的用戶能發佈,不設置上行鏈路

  • "**": 全部的包都能下載,只有認證的用戶能發佈,本地若是沒有就到設置的上行鏈路 taobao 去獲取

  • access 表示哪一類用戶能夠對匹配的項目進行安裝(install)

  • publish 表示哪一類用戶能夠對匹配的項目進行發佈(publish)

  • unpublish 表示哪一類用戶能夠對匹配的項目進行下架(unpublish)

    權限類型

  • $all 表示全部人均可以執行對應的操做

  • $authenticated 表示只有經過驗證的人能夠執行對應操做

  • $anonymous 表示只有匿名者能夠進行對應操做

  1. 是否禁止用 npm adduser

    若是是內網的話,通常就不須要,固然也隨你,在認真的配置下面設置

auth:
  htpasswd:
     ···
    #禁止用戶登錄 
    max_users: -1 
複製代碼
  1. 添加帳戶

3 使用

爲了方便npm源的切換,咱們本地安裝nrm

npm install -g nrm
 #查看如今能夠的源, *表示如今使用源
nrm ls
---------------------------------------------------
* npm -------- https://registry.npmjs.org/
  yarn ------- https://registry.yarnpkg.com/
  cnpm ------- http://r.cnpmjs.org/
  taobao ----- https://registry.npm.taobao.org/
  nj --------- https://registry.nodejitsu.com/
  npmMirror -- https://skimdb.npmjs.com/registry/
  edunpm ----- http://registry.enpmjs.org/
---------------------------------------------------
 #咱們如今須要添加一個咱們剛剛搭建的源庫 
#nrm add <registry> <url>
nrm add verdaccio http://yourip:4873/
 #添加後咱們要使用它
nrm use verdaccio
複製代碼

切換到咱們的verdaccio後,咱們先來登錄咱們在這裏註冊的帳號,我這裏是 eric

#在個人用戶目錄下新建一個文件夾
mkdir npm-vue-ci
#初始化
npm init
#能夠添加一個README.md 和 .npmignore,.npmignore這個是能夠設計忽略須要上傳的文件
touch README.md
touch .npmignore
 #隨便寫點東西咱們測試一下發布
npm publish
複製代碼

發佈成功後咱們能夠在web界面上看到

npm-vue-ci

還要測試一下退出登陸後的下載和下架

#退出登陸
npm logout
 #不要在目錄npm-vue-ci,去其餘的目錄下
npm install npm-vue-ci
 #沒登陸的狀態下,這個曹操做必須是失敗
npm unpublish
複製代碼

固然咱們能用以前安裝的nginx來作個反向代理,咱們設置咱們的verdaccio域名爲 npm.wild-fox.cn,在步驟[pre-build](#2 pre-build 階段)的腳本中

- npm config set registry https://registry.npm.taobao.org
+ npm config set registry http://npm.wild-fox.cn
複製代碼

這裏有個要注意的🤣,我mac本地本身搭的verdaccio沒問題,多是由於服務器的網絡慢,因此代理私有服務器的下載的時候總會出現第一次安裝失敗,因此咱們在[pre-build](#2 pre-build 階段) 的安裝階段的npm i 都須要作點

- npm i || exit 1
+ npm i || npm i || exit 1
複製代碼

Mongo

1 docker 安裝 mongo

#查看源
docker search mongo
 #下載源
docker pull mongo
 # 建立+運行verdaccio容器
docker run \
  --name mongo \
  -u mongo \
  -d \
  -it \
  -p 27017:27017 \
	-v mongodb:/data/db \
  -v /etc/localtime:/etc/localtime:ro \
  mongo --auth

複製代碼

2 新建用戶和數據庫

咱們先進入數據庫

#進入admin
docker exec -it mongo mongo admin
複製代碼

建立admin用戶數據庫

#由於新的mongo 默認沒有admin數據庫,須要本身造一個還有管理員用戶
use admin
db.createUser({ user: 'admin', pwd: 'admin123456', roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] });
 #建立好後須要開啓驗證
db.auth("admin","admin123456");
 #由於這個數據庫,如今安裝是提供給yapi的,咱們須要新建一個數據庫和它的數據庫管理員用戶
use yapi
db.createUser({ user: 'eric', pwd: 'eric123456', roles: [ { role: "readWrite", db: "yapi" } ] });
#開啓驗證,一次驗證多個用戶可能會失敗,能夠退出後再進來先驗證admin,在從新驗證普通用戶
db.auth("eric","eric123456");
 #測試一下數據的寫入
db.test.save({name:"eric"});
db.test.find();
複製代碼

咱們mongo的鏡像還有一個路徑能夠放這些初始化用戶的腳本,後面在[docker-compose 接管](#docker-compose 接管])那會用這種方式

3 mongodb知識點

用戶權限列表

Read:容許用戶讀取指定數據庫

readWrite:容許用戶讀寫指定數據庫

dbAdmin:容許用戶在指定數據庫中執行管理函數,如索引建立、刪除,查看統計或訪問system.profile

userAdmin:容許用戶向system.users集合寫入,能夠找指定數據庫裏建立、刪除和管理用戶

clusterAdmin:只在admin數據庫中可用,賦予用戶全部分片和複製集相關函數的管理權限。

readAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的讀權限

readWriteAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的讀寫權限

userAdminAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的userAdmin權限

dbAdminAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的dbAdmin權限。

root:只在admin數據庫中可用。超級帳號,超級權限
複製代碼

操做

#查看系統用戶列表.pretty() 用這個方法美化列表
db.system.users.find().pretty()
 #刪除數據庫。
db.dropDatabase()
複製代碼

Yapi

這個鏡像得咱們來製做,這裏咱們只是作個最簡單的套子,讓你們知道怎麼簡單的用Dockerfile 製做鏡像

這裏主要是建立一個鏡像,而後還須要本身進入容器運行可視化部署,這裏先入個門嘛,後面在[docker-compose 接管](#docker-compose 接管]) 咱們用稍微複雜點的Dockerfile 和一些腳本完成快速部署

用Dockerfile 製做鏡像

咱們先連在環境服務器的工做目錄下新進一個文件存放 docker 的一些文件

#鏈接環境服務器
ssh env
 #進入用戶目錄,建立存放咱們的docker數據的目錄
cd ~
mkdir docker-data
 #進入docker數據目錄,建立yai目錄,在其目錄下新建Dockerfile文件
cd docker_data
mkdir yapi
cd yapi
vi Dockerfile
複製代碼

用 centos鏡像作基礎鏡像固然是熟悉,容易入手,

在後面會alpine 作基礎鏡像來構建能有效減小鏡像大小,不過步驟和方式會有些差別

#咱們建立的鏡像基於centos鏡像
FROM centos
 #鏡像的做者
LABEL MAINTAINER="longming@451904906@qq.com"
 #設置環境變量,這裏沒有用到哈哈哈
ENV WELCOME="Welcome to yapi"
 #yapi須要安裝git,和 node
RUN yum install -y git
RUN curl --silent --location https://rpm.nodesource.com/setup_10.x | bash -
RUN yum install -y nodejs
 # 安裝yapi
RUN npm install -g yapi-cli --registry https://registry.npm.taobao.org
複製代碼

如今咱們用Dockerfile來建立咱們的yapi鏡像吧

#要在~ /docker-data/yapi 目錄哈
# -t 指定鏡像的名字和tag,. 表示在當前目錄下須要Dockerfile
docker build -t="yapi/wild:latest" .
 #查看本地的鏡像
docker images
------------------------------------------------------------------------------------------
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
yapi/wild             latest              7198cf86d306        30 seconds ago      483MB
...
------------------------------------------------------------------------------------------

複製代碼

建立yapi的容器

docker run \
--name yapi \
-d \
-it \
-p 9090:9090 \
-p 3000:3000 \
-v yapi:/my-yapi \
-v /etc/localtime:/etc/localtime:ro \
yapi/wild
複製代碼
  • 9090端口是部署的界面

  • 3000端口是咱們將在部署界面設置的應用啓動端口

  • /my-yapi 是咱們將在部署界面設置的部署目錄

    咱們用 服務器的 ip:9090能夠看到(阿里雲記得添加安全組)

yapi-pre

等待安裝部署

yapi-success

成功後能夠看到哦這個網站默認的帳號和密碼,還有如何啓動

初始化管理員帳號成功,帳號名:"eric-longming@163.com",密碼:"ymfe.org"

#進入咱們的部署路徑
cd /my-yapi
node vendors/server/app.js
複製代碼

這樣咱們用ip:3000訪問就能看到

yapi-start

成功啦,接下來咱們再作一下nginx的反向代理就行了

3 . 建立docker network 進行容器的通訊

#建立一個網絡,默認是bridge類型的,這個也是docker網絡中最經常使用的
docker network create my-net 
 #將咱們須要的mongo容器和yapi容器加入此網絡
docker network connect my-net mongo
docker network connect my-net yapi
 #查看網絡的詳情
docker network inspect my-net
複製代碼

Nginx

咱們這裏只作最簡潔的安裝使用教程,具體Nginx學習能夠看這位大佬的文章 Nginx 從入門到實踐,萬字詳解! 好文啊,推薦

安裝

這裏咱們先不用docker安裝哈

  • 先建立有root權限的用戶 eric 。具體看 建立用戶
  • SSH配置 本地鏈接,方便本地鏈接操做嘛。具體看 SSH配置
#查看yum的nginx
yum list | grep nginx
 #yum安裝
sudo yum install -y nginx
 #設置開機啓動
sudo systemctl enable nginx
 #啓動nginx
sudo systemctl start nginx
 #查看nginx啓動狀態
sudo systemctl status nginx
 #中止你的nginx服務器
sudo systemctl stop nginx
 #修改了nginx的配置的話須要重載一下配置
sudo systemctl reload nginx
 #配置文件在這個目錄下
/etc/nginx/
/etc/nginx/nginx.conf
/etc/nginx/conf.d/
複製代碼
  • 通常服務器須要修改一下防火牆,使外部可以訪問,阿里的服務器則不用
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload
複製代碼

基本配置

vi /etc/nginx/nginx.conf
---------------------------------------------------------------------------------
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;                                            # 運行用戶,默認便是nginx,能夠不進行設置
worker_processes auto;                                 # Nginx 進程數,通常設置爲和 CPU 核數同樣
error_log /var/log/nginx/error.log;                    # Nginx 的錯誤日誌存放目錄
pid /run/nginx.pid;                                    # Nginx 服務啓動時的 pid 存放位置
 # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;    
 #配置影響 Nginx 服務器或與用戶的網絡鏈接
events {
    worker_connections 1024;                           # 每一個進程容許最大併發數
}
 # 配置使用最頻繁的部分,代理、緩存、日誌定義等絕大多數功能和第三方模塊的配置都在這裏設置
http {
 # 設置日誌模式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;      # Nginx訪問日誌存放位置

    sendfile            on;                           # 開啓高效傳輸模式
    tcp_nopush          on;                           # 減小網絡報文段的數量
    tcp_nodelay         on;
    keepalive_timeout   65;                           # 保持鏈接的時間,也叫超時時間,單位秒
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;        # 文件擴展名與類型映射表
    default_type        application/octet-stream;     # 默認文件類型

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;                 # 加載子配置項,我會把不少設置都放這裏
    
    # 配置虛擬主機的相關參數,一個 http 塊中能夠有多個 server 塊,一個server模塊能夠有多個location
    # 咱們將多個server放在/etc/nginx/conf.d/*.conf
    # 下面的server註釋掉是由於我將吧server單獨作成配置文件 include 進來
 # server {
 # listen 80;
 # server_name www.wild-fox.cn; # 這個是購買的域名
 # root /data/vueci/master/dist;
 # # # Load configuration files for the default server block.
 # include /etc/nginx/default.d/*.conf;
 # # location / {
 # }
 # # error_page 404 /404.html;
 # location = /40x.html {
 # }
 # # error_page 500 502 503 504 /50x.html;
 # location = /50x.html {
 # }
 # }


}
---------------------------------------------------------------------------------
複製代碼

咱們先就把全部環境都設置到 /etc/nginx/conf.d/*.conf

新建配置文件 :

  • **gzip.conf:**這個是用來開啓服務器 gzip 功能的配置
  • dev.wild-fox.cn.conf: 這個是用來配置dev 開發環境的
  • release.wild-fox.cn.conf: 這個是用來配置release 測試環境的
  • master.wild-fox.cn.conf: 這個是用來配置master 線上生產環境的
#gzip.conf
gzip on;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_static on;
gzip_proxied any;
gzip_vary on;
gzip_comp_level 6;
gzip_buffers 16 8k;
# gzip_min_length 1k;
gzip_http_version 1.1;
複製代碼
#dev.wild-fox.cn.conf
server {
        listen       80;
        server_name  dev.wild-fox.cn;
        root         /data/vueci/dev/dist;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
 }
複製代碼
#release.wild-fox.cn.conf
server {
        listen       80;
        server_name  release.wild-fox.cn;
        root         /data/vueci/release/dist;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
 }
複製代碼
#master.wild-fox.cn.conf
server {
        listen       80;
        server_name  www.wild-fox.cn;
        root         /data/vueci/master/dist;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
 }
複製代碼

配置好後咱們要從新reload一次

sudo systemctl reload nginx
複製代碼

設置好了,咱們還得去作一下域名解析才能範圍

DNS

解析好了咱們把構建後的代碼放到相應的目錄就能範圍了

Docker Compose 接管

簡介

​ 前面咱們一共用了jenkins、verdaccio、mongo、yapi等容器,可能後面會再加幾個,例如gitlab、nexus啊等等,一兩個還好,若是咱們要換服務器,還須要一個一個安裝的話那就有點麻煩了,因此咱們要藉助 docker-compose,幾個命令就能在新的服務器上快速部署以前全部應用容器

Compose 定位是 「定義和運行多個 Docker 容器的應用(Defining and running multi-container Docker applications)」

咱們先把以前的jenkins、verdaccio、mongo、yapi的容器全選刪了,以前容器掛載的數據卷就保留着 jenkins的吧

咱們先進入咱們的環境服務器,拉去docker-compose的代碼,啓動服務

ssh env
pwd
#把env-docker-compose的項目拉去下來
git clone git@gitee.com:eric-gm/env-docker-compose.git
 #目錄結構是這樣
├── docker-compose.yml
├── mongo
│   └── initdb.js
├── verdaccio
│   ├── config.yaml
│   └── Dockerfile
└── yapi
    ├── config.json
    ├── Dockerfile
    ├── entrypoint.sh
    └── wait-for-it.sh
 #進入項目,docker-compose啓動服務
cd env-docker-compose
docker-compose up -d
 #這樣就啓動和部署了以前的jenkins、verdaccio、mongo 和yapi來
複製代碼

安裝

  1. 安裝額外依賴包
sudo yum install -y epel-release
複製代碼
  1. 安裝 python-pip
#centos7的話,yum的源有這個
sudo yum install -y python-pip
 #centos8,yum的源沒有pip,咱們本身安裝
sudo dnf install python3
sudo pip3 install --upgrade pip
複製代碼
  1. 安裝 Docker Compose
sudo pip install docker-compose
複製代碼
  1. 升級 python 包
sudo yum upgrade python*
複製代碼
  1. 驗證安裝
docker-compose -v
複製代碼
  1. 若是須要卸載的話
sudo pip uninstall docker-compose
複製代碼

定義和運行容器

那具體是怎樣定義容器建立部署來着,咱們先介紹一下

先介紹一下docker-compose.yml

它容許用戶經過一個單獨的 docker-compose.yml 模板文件(YAML 格式)來定義一組相關聯的應用容器爲一個項目(project)。

Compose 中有兩個重要的概念:

  • 服務 (service):一個應用的容器,實際上能夠包括若干運行相同鏡像的容器實例。
  • 項目 (project):由一組關聯的應用容器組成的一個完整業務單元,在 docker-compose.yml 文件中定義。

具體來看一下咱們的docker-compose.yaml文件

version: "3.8"
services:
  jenkins:
    image: jenkinsci/blueocean
    container_name: jenkins
    ports:
      - 8080:8080
      - 50000:50000
    volumes:
      - jenkins:/var/jenkins_home
      - /private/etc/localtime:/etc/localtime:ro
      #- /private/etc/localtime:/etc/localtime:ro
    networks:
      - front-net
  verdaccio:
    build: ./verdaccio/
    image: verdaccio/wild:latest
    container_name: verdaccio
    ports:
      - 4873:4873
    volumes:
      - verdaccio:/verdaccio
      # - /private/etc/localtime:/etc/localtime:ro
    networks:
      - front-net
  yapi:
    build: ./yapi/
    image: yapi/wild:latest
    container_name: yapi
    restart: always
    ports:
      - 9090:9090
      - 3000:3000
    depends_on:
      - mongo
    volumes:
      - yapi:/my-yapi
      # - /private/etc/localtime:/etc/localtime:ro
    entrypoint: "bash /wait-for-it.sh mongo:27017 -- entrypoint.sh"
    networks:
      - back-net
  mongo:
    image: mongo:latest
    container_name: mongo
    restart: always
    environment:
      # 在這裏輸入 MongoDB 的 root 用戶與密碼,若是使用了此項,則不須要 --auth 參數
      - MONGO_INITDB_ROOT_USERNAME=root
      - MONGO_INITDB_ROOT_PASSWORD=root123456
    ports:
      - 27017:27017
    volumes:
      - mongodb:/data/db
      - ./mongo/:/docker-entrypoint-initdb.d/:ro
      # - /private/etc/localtime:/etc/localtime:ro
    command: mongod
    networks:
      - back-net
volumes:
  jenkins:
    name: jenkins
  verdaccio:
    name: verdaccio
  mongodb:
    name: mongodb
  yapi:
    name: yapi

networks:
  back-net:
  front-net:

複製代碼
  • version: 這個是對應 Docker Engine 的 ,咱們的docker是 Docker version 19.03.12,因此對應的3.8
  • services: 這個就是對應咱們的服務,這裏定義了這幾個服務jenkins、verdaccio、mongo、yapi等,這個是咱們重點要看的

services 配置解析

由於篇幅不想太長,這裏之說配置文件上涉及到的配置哈,更具體的能夠查看這一篇文章 docker-compose 編排指南 (v3.8)

1 build

該選項被用於構建,yapi 和 verdaccio 兩個服務咱們只作根據dockerfile 製做的鏡像,就須要用這個,jenkins 和 mongo服務是採用網上的鏡像就不須要

build,指定上下文的目錄目錄下的 dockerfile文件來構建 固然你也能夠本身指定上下文,和 dockerfile的別名等等等

這裏的yapi 和verdaccio鏡像的構建跟以前的不同哈,

  • yapi鏡像:是經過代碼構建自動部署的(以前是可視化部署)具體能夠看 ./yapi/Dockerfile
  • verdaccio是直接把配置文件拷貝到容器內部去初始建立的

2 image

build的鏡像指定的名字,或者倉庫的鏡像名字(本地沒有會自動去線上拉取的)

3 container_name

這個就是容器的名字啦

4 ports

暴露端口到宿主機,格式 HOST:CONTAINER

5 environment

添加環境變量。可使用一個數組或者一個字典。任何布爾量:true, false, yes, no 等等都必須用引號包圍爲字符串字面量,也會覆蓋dockerfile中的ENV

特別注意:

在mongo服務裏面這樣設置,就會建立一個root管理員用戶,會自動開啓了驗證

environment:
      # 在這裏輸入 MongoDB 的 root 用戶與密碼,若是使用了此項,則不須要 --auth 參數
      - MONGO_INITDB_ROOT_USERNAME=root
      - MONGO_INITDB_ROOT_PASSWORD=root123456
複製代碼

5 volumes

掛載宿主機路徑或者命名卷,在頂級 volumes 中定義一個命名卷,並在一個服務的 volumes 列表中引用它。

特別注意一下:在mongo服務的volumes這裏

./mongo/:/docker-entrypoint-initdb.d/:ro
複製代碼

咱們是吧 ./mongo的 initdb.js 掛載到 mongo容器的/docker-entrypoint-initdb.d 目錄(是官方的容器提供的哈),容器初始化的時候調用裏面的文件去初始化數據庫,根據文件名的排序先後調用運行,支持 .sh 和 js,相比以前的進入容器去在建立用戶數據庫什麼的方便多了吧

6 command

覆蓋容器內默認的 command

7 entrypoint

覆蓋 dockerfile 中定義的默認的 entrypoint 值

在yapi服務中的配置

entrypoint: "bash /wait-for-it.sh mongo:27017 -- entrypoint.sh"
複製代碼

wait-for-it.sh 是github上開源的,由於咱們這個yapi須要鏈接mongodb,因此咱們要檢測到 端口 mongo:27017 啓動能鏈接了,在執行

entrypoit.sh 去部署或啓動yapi(初次是部署,接下來是啓動)

8 depends_on

表示服務之間的依賴關係。服務依賴引起以下的行爲:

好比咱們的yapi 依賴 mongo服務,當咱們用docker-compose 啓動yapi的時候會先啓動mongo服務,在啓動yapi,關閉的時候先關閉yapi,在關閉mongo,注意啓動只是容器的啓動,並非容器內應用和數據的啓動,因此咱們須要用到 wait-for-it.sh 來輔助

9 network

要加入的網絡。目標網絡是在 docker-compose.yml 頂級的 networks 項中定義的。

10 restart

no 是默認的重啓策略。此時不管容器怎麼退出、怎麼失敗也不會被自動重啓。

指定 always 時任何狀況下容器都會被重啓。

volumes

這個是用來定義數據卷給 服務services用的,若是同名的volume存在,就只是使用它,不存在就建立,

但若是隻是這樣定義:

volumes:
	jenkins:
複製代碼

你會發現生成的volumes名字是 env-docker-compose_jenkins,就想咱們docker-compose.yaml的所在的目錄名+ "_"+jenkins,

這裏咱們用 name 來命名它爲:jenkins,和咱們最開始建立jenkins容器使用的volume同名,會自動去引用這個卷,這樣就不用從新去安裝插件配置什麼的啦,固然你想折騰的話隨你

volumes:
  jenkins:
    name: jenkins
複製代碼

network

頂級章節 networks 使得你能夠配置想要建立和使用的網絡(Compose內網)

咱們默認建立的網絡是bridge類型的,這個也是docker 容器最經常使用的網絡類型

它生產的名字跟volume同樣,不過咱們這裏不須要去自定義它的名字,固然你想也行啊老闆

networks:
  back-net:
  front-net:
複製代碼

例如咱們在yapi 和 mongo 兩個服務都加入了通個網絡 front-net,那咱們yapi容器直接能夠經過 ping mongo(服務名)鏈接到 mongo的容器,mongo容器內 ping yapi 也行

你能夠注意到 在yapi服務中,咱們就直接用了 mongo:27017去鏈接檢測 mongo服務端口的啓動,而不是 ip:27017

entrypoint: "bash /wait-for-it.sh mongo:27017 -- entrypoint.sh"
複製代碼

爲何不用ip呢,由於容器分配到的ip不是固定的,會變的。

compose 基本命令

這裏只作用到的一點基礎命令,其餘的能夠看官網的說明

1 up

格式:docker-compose up -d ,加-d是後臺運行

會根據當前目錄下的docker-compose.yaml,構建鏡像,建立服務

2 down

格式:docker-compose down

此命令將會中止 up 命令所啓動的容器,並移除網絡

3 start

格式爲 docker-compose start [SERVICE...]

啓動已經存在的服務容器。

4 stop

格式爲 docker-compose stop [options] [SERVICE...]

中止已經處於運行狀態的容器,但不刪除它。經過 docker-compose start 能夠再次啓動這些容器。

選項:

  • -t, --timeout TIMEOUT 中止容器時候的超時(默認爲 10 秒)。

5 restart

格式爲 docker-compose restart [options] [SERVICE...]

重啓項目中的服務。

選項:

  • -t, --timeout TIMEOUT 指定重啓前中止容器的超時(默認爲 10 秒)。

6 logs

格式爲 docker-compose logs [options] [SERVICE...]

查看服務容器的輸出。默認狀況下,docker-compose 將對不一樣的服務輸出使用不一樣的顏色來區分。能夠經過 --no-color 來關閉顏色。

該命令在調試問題的時候十分有用。

volume 備份 和 遷移

那麼問題來了,咱們要去其餘的服務器部署這一套服務,有了docker-compose 能夠快速部署應用,那以前的數據呢?怎麼搞過來???

別慌,幾步就能搞定

  1. 咱們的數據都存在docker 管理的volume對吧,咱們備份和回覆須要這幾步
  2. 把全部的volume打包好搞到新服務器
  3. 在新的服務器,建立同名的volumes,把打包的數據解壓後放對應的volume的目錄就行了

查看docker 存儲的volume都在哪

#查看現存有的volume 執行 docker volume inspect yapi 
docker volume inspect yapi 

-------------------------------------------
...
Mountpoint": "/var/lib/docker/volumes/yapi/_data",
...
-------------------------------------------
複製代碼

咱們發現docker 管理的 volumes都在 /var/lib/volumes 目錄下,還想什麼呢,打包他啊

docker run --rm -it \
-v ~/volume-backup:/backup \
-v /var/lib/docker:/docker \
busybox \
tar cfz /backup/volume.tgz  -C /docker/volumes/ .
複製代碼

上面這個命令中,咱們運行了一個輕量級的container——busybox,並掛載了兩個目錄:

  • (host) ~/volume-backup => (container) /backup
  • (host) /var/lib/docker/ => (container) /docker

這樣就是把 /var/lib/volumes目錄打包成 volume.tgz

新服務器下載打包後的 volume.tgz

cd ~
mkdir docker
cd docker 
mkdir volumes
scp env:~/volume-backup/volume.tgz ~/docker/volumes
複製代碼

下載好解壓縮

cd ~/docker/volumes
tar zxvf volume.tgz
#解壓後可能會有多餘的東西,咱們只須要 下面這幾個文件夾的文件,移動咱們歸檔到其餘文件夾吧
# jenkins mongodb verdaccio yapi
複製代碼

先運行docker-compose up -d ,這樣在新的服務器會構建鏡像和建立以前的volumes初始化數據卷

再運行 docker-compose down 或者 docker-compose stop

,在導入數據到相應的volumes中

docker run --rm -it \
-v /var/lib/docker:/docker \
-v ~/volume-backup:/volume-backup \
busybox \
cp -r /volume-backup/ /docker/volumes
複製代碼

這樣就把數據還原啦,最後再啓動docker-compose up 或者 docker-compose restart

附錄

git、 centos + shell、docker操做的命令令清單慢點作好再給你們看

獲取小手冊

docker

關注公衆號:『前端小手冊』,回覆:小手冊

就能獲整篇的PDF版本資源的下載

markdown資源我慢點出來哈,配合typora的night主題來看大概這樣↓:

handbook1

handbook2

handbook3

感謝大家的關注

最後是很是很是的但願能獲得大家的關注啦~~

大家小小關注就是咱們大大的動力啊,咱們會給大家持續地推送原創和好文

這個是咱們公衆號的二維碼

code2

相關文章
相關標籤/搜索