从0到1,打造小团队前端工程化服务(3/3)

3,647 阅读20分钟

前言

这篇是 npm私有库 + API Mock服务搭建 + docker-compose快速部署之前的所有服务

建议先看自动部署篇

一条龙!CI / CD 打造一个小前端团队工程化服务环境

progress-all-guide

Verdaccio

作为一个积极上进的小开发团队,当然必须要有自己的npm私有库啊

这里我们选择了verdaccio,一个开源轻量的npm私服,他还有官方的docker镜像

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内容如下

#
# 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容器应用

# 创建+运行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: 创建一个新容器

  • --name verdaccio: 将这个容器命名为jenkins(这个后面方便操作)

  • **-d:**这个参数能让容器到后台运行

  • -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