从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

相关文章
相关标签/搜索