這篇是 npm私有庫 + API Mock服務搭建 + docker-compose快速部署以前的全部服務javascript
建議先看自動部署篇css
一條龍!CI / CD 打造一個小前端團隊工程化服務環境html
做爲一個積極上進的小開發團隊,固然必需要有本身的npm私有庫啊前端
這裏咱們選擇了verdaccio,一個開源輕量的npm私服,他還有官方的docker鏡像vue
# 查看官方的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
從剛纔的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
複製代碼
詳細的配置文件能夠查看官網的教程
storage: /verdaccio/storage/data
複製代碼
plugins: /verdaccio/plugins
複製代碼
htpasswd
而且是內置的。您能夠經過plugins來修改此行爲auth:
htpasswd:
file: /verdaccio/storage/htpasswd
#max_users : 10000
複製代碼
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
複製代碼
htpasswd
中便可。爲了方便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
複製代碼
#查看源
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
複製代碼
咱們先進入數據庫
#進入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 接管])那會用這種方式
用戶權限列表
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()
複製代碼
這個鏡像得咱們來製做,這裏咱們只是作個最簡單的套子,讓你們知道怎麼簡單的用Dockerfile 製做鏡像
這裏主要是建立一個鏡像,而後還須要本身進入容器運行可視化部署,這裏先入個門嘛,後面在[docker-compose 接管](#docker-compose 接管]) 咱們用稍微複雜點的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
...
------------------------------------------------------------------------------------------
複製代碼
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 從入門到實踐,萬字詳解! 好文啊,推薦
這裏咱們先不用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 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
複製代碼
設置好了,咱們還得去作一下域名解析才能範圍
解析好了咱們把構建後的代碼放到相應的目錄就能範圍了
前面咱們一共用了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
複製代碼
#centos7的話,yum的源有這個
sudo yum install -y python-pip
#centos8,yum的源沒有pip,咱們本身安裝
sudo dnf install python3
sudo pip3 install --upgrade pip
複製代碼
sudo pip install docker-compose
複製代碼
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:
複製代碼
Docker version 19.03.12
,因此對應的3.8由於篇幅不想太長,這裏之說配置文件上涉及到的配置哈,更具體的能夠查看這一篇文章 docker-compose 編排指南 (v3.8)
該選項被用於構建,yapi 和 verdaccio 兩個服務咱們只作根據dockerfile 製做的鏡像,就須要用這個,jenkins 和 mongo服務是採用網上的鏡像就不須要
build,指定上下文的目錄目錄下的 dockerfile文件來構建 固然你也能夠本身指定上下文,和 dockerfile的別名等等等
這裏的yapi 和verdaccio鏡像的構建跟以前的不同哈,
build的鏡像指定的名字,或者倉庫的鏡像名字(本地沒有會自動去線上拉取的)
這個就是容器的名字啦
暴露端口到宿主機,格式 HOST:CONTAINER
添加環境變量。可使用一個數組或者一個字典。任何布爾量:true, false, yes, no 等等都必須用引號包圍爲字符串字面量,也會覆蓋dockerfile中的ENV
特別注意:
在mongo服務裏面這樣設置,就會建立一個root管理員用戶,會自動開啓了驗證
environment:
# 在這裏輸入 MongoDB 的 root 用戶與密碼,若是使用了此項,則不須要 --auth 參數
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=root123456
複製代碼
掛載宿主機路徑或者命名卷,在頂級 volumes
中定義一個命名卷,並在一個服務的 volumes
列表中引用它。
特別注意一下:在mongo服務的volumes這裏
./mongo/:/docker-entrypoint-initdb.d/:ro
複製代碼
咱們是吧 ./mongo的 initdb.js 掛載到 mongo容器的/docker-entrypoint-initdb.d 目錄(是官方的容器提供的哈),容器初始化的時候調用裏面的文件去初始化數據庫,根據文件名的排序先後調用運行,支持 .sh 和 js,相比以前的進入容器去在建立用戶數據庫什麼的方便多了吧
覆蓋容器內默認的 command
覆蓋 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(初次是部署,接下來是啓動)
表示服務之間的依賴關係。服務依賴引起以下的行爲:
好比咱們的yapi 依賴 mongo服務,當咱們用docker-compose 啓動yapi的時候會先啓動mongo服務,在啓動yapi,關閉的時候先關閉yapi,在關閉mongo,注意啓動只是容器的啓動,並非容器內應用和數據的啓動,因此咱們須要用到 wait-for-it.sh 來輔助
要加入的網絡。目標網絡是在 docker-compose.yml
頂級的 networks
項中定義的。
no
是默認的重啓策略。此時不管容器怎麼退出、怎麼失敗也不會被自動重啓。
指定 always
時任何狀況下容器都會被重啓。
這個是用來定義數據卷給 服務services用的,若是同名的volume存在,就只是使用它,不存在就建立,
但若是隻是這樣定義:
volumes:
jenkins:
複製代碼
你會發現生成的volumes名字是 env-docker-compose_jenkins,就想咱們docker-compose.yaml的所在的目錄名+ "_"+jenkins,
這裏咱們用 name 來命名它爲:jenkins,和咱們最開始建立jenkins容器使用的volume同名,會自動去引用這個卷,這樣就不用從新去安裝插件配置什麼的啦,固然你想折騰的話隨你
volumes:
jenkins:
name: jenkins
複製代碼
頂級章節 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不是固定的,會變的。
這裏只作用到的一點基礎命令,其餘的能夠看官網的說明
格式:docker-compose up -d
,加-d
是後臺運行
會根據當前目錄下的docker-compose.yaml,構建鏡像,建立服務
格式:docker-compose down
此命令將會中止 up
命令所啓動的容器,並移除網絡
格式爲 docker-compose start [SERVICE...]
啓動已經存在的服務容器。
格式爲 docker-compose stop [options] [SERVICE...]
中止已經處於運行狀態的容器,但不刪除它。經過 docker-compose start
能夠再次啓動這些容器。
選項:
-t, --timeout TIMEOUT
中止容器時候的超時(默認爲 10 秒)。格式爲 docker-compose restart [options] [SERVICE...]
。
重啓項目中的服務。
選項:
-t, --timeout TIMEOUT
指定重啓前中止容器的超時(默認爲 10 秒)。格式爲 docker-compose logs [options] [SERVICE...]
。
查看服務容器的輸出。默認狀況下,docker-compose 將對不一樣的服務輸出使用不一樣的顏色來區分。能夠經過 --no-color
來關閉顏色。
該命令在調試問題的時候十分有用。
那麼問題來了,咱們要去其餘的服務器部署這一套服務,有了docker-compose 能夠快速部署應用,那以前的數據呢?怎麼搞過來???
別慌,幾步就能搞定
查看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,並掛載了兩個目錄:
這樣就是把 /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主題來看大概這樣↓:
最後是很是很是的但願能獲得大家的關注啦~~
大家小小關注就是咱們大大的動力啊,咱們會給大家持續地推送原創和好文
這個是咱們公衆號的二維碼