前言
这篇是 npm私有库 + API Mock服务搭建 + docker-compose快速部署之前的所有服务
建议先看自动部署篇
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
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
详细的配置文件可以查看官网的教程
- 默认的储存目录:verdaccio默认使用内置本地文件模式存储
storage: /verdaccio/storage/data
- 插件存放的目录:
plugins: /verdaccio/plugins
- 认证 :默认的授权是基于
htpasswd
并且是内置的。您可以通过plugins来修改此行为
auth:
htpasswd:
file: /verdaccio/storage/htpasswd
#max_users : 10000
- 上行链路`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/
- 包的访问
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
表示只有匿名者可以进行对应操作
-
是否禁止用 npm adduser
如果是内网的话,一般就不需要,当然也随你,在认真的配置下面设置
auth:
htpasswd:
···
#禁止用户登陆
max_users: -1
- 添加账户
- 没有禁止用户登录的话,直接用 adduser 就好
- verdaccio 的认证是基于 verdaccio-htpasswd,可以通过官方提供的工具来生成 www.htaccesstools.com/htpasswd-ge…,将生成的段字符串添加到
htpasswd
中即可。
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 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可以看到(阿里云记得添加安全组)
等待安装部署
成功后可以看到哦这个网站默认的账号和密码,还有如何启动
初始化管理员账号成功,账号名:"eric-longming@163.com",密码:"ymfe.org"
#进入我们的部署路径
cd /my-yapi
node vendors/server/app.js
这样我们用ip:3000访问就能看到
成功啦,接下来我们再做一下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安装哈
#查看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
设置好了,我们还得去做一下域名解析才能范围
解析好了我们把构建后的代码放到相应的目录就能范围了
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来
安装
- 安装额外依赖包
sudo yum install -y epel-release
- 安装 python-pip
#centos7的话,yum的源有这个
sudo yum install -y python-pip
#centos8,yum的源没有pip,我们自己安装
sudo dnf install python3
sudo pip3 install --upgrade pip
- 安装 Docker Compose
sudo pip install docker-compose
- 升级 python 包
sudo yum upgrade python*
- 验证安装
docker-compose -v
- 如果需要卸载的话
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 可以快速部署应用,那之前的数据呢?怎么搞过来???
别慌,几步就能搞定
- 我们的数据都存在docker 管理的volume对吧,我们备份和回复需要这几步
- 把所有的volume打包好搞到新服务器
- 在新的服务器,创建同名的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操作的命令令清单慢点做好再给大家看
获取小手册
关注公众号:『前端小手册』,回复:小手册
就能获整篇的PDF版本资源的下载
markdown资源我慢点出来哈,配合typora的night主题来看大概这样↓:
感谢你们的关注
最后是非常非常的希望能得到你们的关注啦~~
你们小小关注就是我们大大的动力啊,我们会给你们持续地推送原创和好文
这个是我们公众号的二维码