[TOC]
## 一 容器数据持久化和共享方案
### A.为什么要使用docker数据持久化
正常情况下,删除容器,容器中所有的文件也会被删除。所以需要能持久化容器中数据的方法,也就是数据卷
**数据卷(Data Volume)的作用:**
1. 持久化容器运行过程中产生的数据文件
2. 实现多个容器间的文件共享。
3. 实现多个主机间有状态容器的迁移
### B.docker数据卷的分类
在集群环境下,数据卷分为:
1. 单机内容器间的数据持久化和共享
* 数据卷[Data Volume]
* 绑定挂载[bind mount]
* 容器管理卷[docker managed volume]
* 容器卷[volume container]
2. 跨主机容器间的数据持久化和共享
* 使用分布式文件系统(如NFS)
* 使用volume driver实现跨主机存储
* Rex-Ray插件
* [更多官方插件](https://docs.docker.com/engine/extend/legacy_plugins/#volume-plugins)
### C.容器间互连的方式
容器互联大体有以下三种方式:
* 基于volume的互联
* 基于link的互联
* 基于网络的互联
> 其中基于网络的互连会在网络部分单独写,基于volume的互连和基于link的互连会在本节详细说明
## 二 数据卷的使用详情
数据卷[Data Volume]就是将宿主机中的一个文件或目录挂载到容器中,供容器使用,分为绑定卷[bind mount]和容器管理卷[docker managed volume],区别是
| 区别点 | bind mount | docker managed volume |
| --- | --- | --- |
| volume 位置 | 可任意指定 | /var/lib/docker/volumes/... |
| 对已有mount point 影响 | 隐藏并替换为 volume | 原有数据复制到 volume |
| 是否支持单个文件 | 支持 | 不支持,只能是目录 |
| 权限控制 | 可设置为只读,默认为读写权限 | 无控制,均为读写权限 |
| 移植性 | 移植性弱,与 host path 绑定 | 移植性强,无需指定 host 目录 |
### A.常见的docker数据卷命令
* 创建一个数据卷
`docker volume create
xxx`
* 查看数据卷列表
`docker volume ls
`
* 删除一个数据卷
`docker volume rm
`
* 查看一个数据卷的属性
`docker volume inspect
`
### B.`-v`参数挂载数据卷的语法
1. 挂载数据卷语法
` -v 挂载源:挂载目的[:其他选项]
`
* 使用举例:
` docker run -d -p 80:80 -v /data/test/:/usr/share/nginx/html nginx`
>其他选项一般只有一个`ro`只读选项常用,不举例了
2. -v参数用法详解
| `-v`参数所跟选项 | 举例 | 导致的结果 |
| --- | --- | --- |
| A:不跟任何选项 | -v | 根据创建镜像的dockerfiled的配置进行挂载 |
| B:只写一个目录 | -v /data | 表示只有挂载目的,会自动创建挂载源 |
| C:源目都有[四种] | -v xxx:/test | 又如下分四种情况 |
| C1:源目都是目录 | -v /data/:/test | 将主机的data目录挂载到容器的test目录 |
| C2:源目都是文件 | -v ~/f.txt:/test/b.txt | 用主机文件f.txt文件替代容器b.txt文件 |
| C3:源是容器管理卷[已建] | -v noah:/test | 挂载容器管理卷noah为容器目录/test |
| C4:源是容器管理卷[未建] | -v noah:/test | 创建并挂载容器管理卷,并用容器目录中的数据初始化容器管理卷 |
### C.绑定挂载[bind mount]的使用
先创建好一个目录和里面的测试文件,然后创建实例的时候,直接加参数挂载到相应的目录即可
1. **准备数据**
```sh
mkdir -p /data/test/
echo 'this is test ----------> bind mount' >/data/test/index.html
```
2. **创建`bind mount`的容器**
```sh
docker run -d -p 80:80 -v /data/test/:/usr/share/nginx/html nginx
```
3. **验证结果**
```sh
[root@docker01 ~]# curl 127.0.0.1
this is test ----------> bind mount
[root@docker01 ~]# echo 'this is new change pag' >/data/test/index.html
[root@docker01 ~]# curl 127.0.0.1
this is new change pag
#可见已经将目录成功挂载到容器中,并且可以实时更新
```
4. **用`inspect `查看镜像信息**
```sh
[root@docker01 ~]# docker container inspect 9c5e35343873|grep -A 4 Mounts
"Mounts": [
{
"Type": "bind",
"Source": "/data/test",
"Destination": "/usr/share/nginx/html",
```
### D.容器管理卷[docker managed volume]的使用
1. 手动创建卷"noah-v1"并写入文件
```
docker volume create noah-v1
echo 'this is noah-v1 vol' >/var/lib/docker/volumes/noah-v1/_data/index.html
```
2. 分别用三种方式创建含容器管理卷的容器
```sh
docker run -d -p 180:80 -v /usr/share/nginx/html nginx
docker run -d -p 280:80 -v noah:/usr/share/nginx/html nginx
docker run -d -p 380:80 -v noah-v1:/usr/share/nginx/html nginx
[root@docker01 ~]# curl 127.0.0.1:380
this is noah-v1 vol
[root@docker01 ~]# docker volume ls
DRIVER VOLUME NAME
local 95b29d4a729017510df9fdc1753ebeb117a7464c24af9657913130c7e6ef2f01
local noah
local noah-v1
```
>针对第一条命令,未指定挂载源时,自动创建一个卷
>针对第二条命令,指定的挂载源不存在时,自动创建卷并命名
>针对第三条命令,指定的挂载源存在时,直接挂载该卷
3. 分别curl三个端口看结果
```
[root@docker01 ~]# curl 127.0.0.1:180
......
[root@docker01 ~]# curl 127.0.0.1:280
......
[root@docker01 ~]# curl 127.0.0.1:380
this is noah-v1 vol
```
## 四 容器卷[volume container]的使用详情
volume container 是专门为其他容器提供 volume 的容器。它提供的卷可以是 bind mount,也可以是 docker managed volume。
### A.volume container 的特点:
1. **实现了容器与 host 的解耦**
与 bind mount 相比,不必为每一个容器指定 host path,所有 path 都在 volume container 中定义好了,容器只需与 volume container 关联。
2. 有利于配置的规范和标准化
使用 volume container 的容器其 mount point 是一致的,有利于配置的规范和标准化,但也带来一定的局限,使用时需要综合考虑。
### B. 容器卷实操演示
创建一个名为`vc_data`的容器, mount 了1个`docker managed volume`,其他容器可以通过`--volumes-from`使用`vc_data`这个 volume container:
>注意这里执行的是`docker create`命令,这是因为 volume container 的作用只是提供数据,它本身不需要处于运行状态。
1. 创建容器卷容器
```sh
docker volume create noah-v2
echo 'this is noah-v2 vol' >/var/lib/docker/volumes/noah-v2/_data/index.html
docker create --name vc_data -v noah-v2:/usr/share/nginx/html busybox
```
2. 通过`docker inspect`可以查看到信息
```sh
[root@docker01 ~]# docker inspect vc_data |grep -A 4 Mounts
"Mounts": [
{
"Type": "volume",
"Name": "noah-v2",
"Source": "/var/lib/docker/volumes/noah-v2/_data",
```
3. 其他容器挂载`vc_data`
```sh
docker run -d -p 801:80 --volumes-from vc_data nginx
docker run -d -p 802:80 --volumes-from vc_data nginx
```
4. 查看结果验证
```sh
[root@docker01 ~]# curl 127.0.0.1:801
this is noah-v2 vol
[root@docker01 ~]# curl 127.0.0.1:802
this is noah-v2 vol
```
5. 修改数据验证共享
```sh
echo 'change data info is now' >/var/lib/docker/volumes/noah-v2/_data/index.html
[root@docker01 ~]# curl 127.0.0.1:801
change data info is now
[root@docker01 ~]# curl 127.0.0.1:802
change data info is now
```
可见,两个容器已经成功共享了 volume container 中的 volume。
## 五 volume的备份和恢复
### A. 备份和恢复
volume 实际上是 host 文件系统中的目录和文件,而我们所有的本地镜像都存在 host 指定目录的
1. 无私有registry时,在`/var/lib/docker/volumes/`目录
2. 有私有registry时,在registry创建时指定的目录
我们要做的就是定期备份这个目录,如果数据损坏了,直接用之前备份的数据拷贝到 对应目录就可以了。
### B. 仓库迁移
如果我们想使用更新版本的 Registry,这就涉及到数据迁移,步骤是:
1. docker stop 停止当前 Registry 容器。
2. 启动新版本容器并 mount 原有 volume。
`docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry:latest
`
当然,在启用新容器前要确保新版本的默认数据路径是否发生变化。
### C. 销毁
docker 不会销毁 bind mount,删除数据的工作只能由 host 负责。
对于 docker managed volume,在删除容器时可以带上 -v 参数,会将容器使用到的 volume 一并删除(前提是没有其他容器 mount 该 volume)
如果删除容器时没有带 -v ,就会产生孤儿 volume,对于孤儿volume:
1. 用 `docker managed volume` 进行维护。
2. 删除孤儿volume `docker volume rm` .
3. 批量删除孤儿 volume,`docker volume rm $(docker volume ls -q)`
## 六 link连接容器进行互连
### A. link基本功能演示
`--link`参数格式为`--link name:alias`,其中name是要链接的容器名称,alias是这个连接的别名。
Docker通过**环境变量**和**更新/etc/hosts文件**两种方式为容器公开连接信息
1. 用link方式创建容器
```sh
docker run -d --name web01 -e DBNAME=demo nginx:latest
docker run -it --link web01:test01 centos:6.9
```
2. 在test01容器中验证
```sh
[root@142f76fd54d1 /]# curl -sL -w "%{http_code}\n" web01 -o /dev/null
200
```
3. 查看hosts文件和env环境变量
```sh
[root@142f76fd54d1 /]# tail -2 /etc/hosts
172.17.0.2 test01 a641de6f2ea3 web01
172.17.0.3 142f76fd54d1
[root@142f76fd54d1 /]# env|grep DBNAME
TEST01_ENV_DBNAME=demo
```
### B. link方式快速部署zabbix
通过用容器方式快速部署zabbix的案例,来说明link在实际使用中的应用
```sh
docker run --name mysql-server -t \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-d mysql:5.7 \
--character-set-server=utf8 --collation-server=utf8_bin
docker run --name zabbix-java-gateway -t \
-d zabbix/zabbix-java-gateway:latest
docker run --name zabbix-server-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
--link mysql-server:mysql \
--link zabbix-java-gateway:zabbix-java-gateway \
-p 10051:10051 \
-d zabbix/zabbix-server-mysql:latest
docker run --name zabbix-web-nginx-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
--link mysql-server:mysql \
--link zabbix-server-mysql:zabbix-server \
-p 80:80 \
-d zabbix/zabbix-web-nginx-mysql:latest
```
- shell编程
- 变量1-规范-环境变量-普通变量
- 变量2-位置-状态-特殊变量
- 变量3-变量子串
- 变量4-变量赋值三种方法
- 变量5-数组相关
- 计算1-数值计算命令和案例
- 计算2-expr命令举例
- 计算3-条件表达式和各种操作符
- 计算4-条件表达式和操作符案例
- 循环1-函数的概念与作用
- 循环2-if与case语法
- 循环3-while语法
- 循环4-for循环
- 其他1-判断传入的参数为0或整数的多种思路
- 其他2-while+read按行读取文件
- 其他3-给输出内容加颜色
- 其他4-shell脚本后台运行知识
- 其他5-6种产生随机数的方法
- 其他6-break,continue,exit,return区别
- if语法案例
- case语法案例
- 函数语法案例
- WEB服务软件
- nginx相关
- 01-简介与对比
- 02-日志说明
- 03-配置文件和虚拟主机
- 04-location模块和访问控制
- 05-status状态模块
- 06-rewrite重写模块
- 07-负载均衡和反向代理
- 08-反向代理监控虚拟IP地址
- nginx与https自签发证书
- php-nginx-mysql联动
- Nginx编译安装[1.12.2]
- 案例
- 不同客户端显示不同信息
- 上传和访问资源池分离
- 配置文件
- nginx转发解决跨域问题
- 反向代理典型配置
- php相关
- C6编译安装php.5.5.32
- C7编译php5
- C6/7yum安装PHP指定版本
- tomcxat相关
- 01-jkd与tomcat部署
- 02-目录-日志-配置文件介绍
- 03-tomcat配置文件详解
- 04-tomcat多实例和集群
- 05-tomcat监控和调优
- 06-Tomcat安全管理规范
- show-busy-java-threads脚本
- LVS与keepalived
- keepalived
- keepalived介绍和部署
- keepalived脑裂控制
- keepalived与nginx联动-监控
- keepalived与nginx联动-双主
- LVS负载均衡
- 01-LVS相关概念
- 02-LVS部署实践-ipvsadm
- 03-LVS+keepalived部署实践
- 04-LVS的一些问题和思路
- mysql数据库
- 配置和脚本
- 5.6基础my.cnf
- 5.7基础my.cnf
- 多种安装方式
- 详细用法和命令
- 高可用和读写分离
- 优化和压测
- docker与k8s
- docker容器技术
- 1-容器和docker基础知识
- 2-docker软件部署
- 3-docker基础操作命令
- 4-数据的持久化和共享互连
- 5-docker镜像构建
- 6-docker镜像仓库和标签tag
- 7-docker容器的网络通信
- 9-企业级私有仓库harbor
- docker单机编排技术
- 1-docker-compose快速入门
- 2-compose命令和yaml模板
- 3-docker-compose命令
- 4-compose/stack/swarm集群
- 5-命令补全和资源限制
- k8s容器编排工具
- mvn的dockerfile打包插件
- openstack与KVM
- kvm虚拟化
- 1-KVM基础与快速部署
- 2-KVM日常管理命令
- 3-磁盘格式-快照和克隆
- 4-桥接网络-热添加与热迁移
- openstack云平台
- 1-openstack基础知识
- 2-搭建环境准备
- 3-keystone认证服务部署
- 4-glance镜像服务部署
- 5-nova计算服务部署
- 6-neutron网络服务部署
- 7-horizon仪表盘服务部署
- 8-启动openstack实例
- 9-添加计算节点流程
- 10-迁移glance镜像服务
- 11-cinder块存储服务部署
- 12-cinder服务支持NFS存储
- 13-新增一个网络类型
- 14-云主机冷迁移前提设置
- 15-VXALN网络类型配置
- 未分类杂项
- 部署环境准备
- 监控
- https证书
- python3.6编译安装
- 编译安装curl[7.59.0]
- 修改Redhat7默认yum源为阿里云
- 升级glibc至2.17
- rabbitmq安装和启动
- rabbitmq多实例部署[命令方式]
- mysql5.6基础my.cnf
- centos6[upstart]/7[systemd]创建守护进程
- Java启动参数详解
- 权限控制方案
- app发包仓库
- 版本发布流程
- elk日志系统
- rsyslog日志统一收集系统
- ELK系统介绍及YUM源
- 快速安装部署ELK
- Filebeat模块讲解
- logstash的in/output模块
- logstash的filter模块
- Elasticsearch相关操作
- ES6.X集群及head插件
- elk收集nginx日志(json格式)
- kibana说明-汉化-安全
- ES安装IK分词器
- zabbix监控
- zabbix自动注册模板实现监控项自动注册
- hadoop大数据集群
- hadoop部署
- https证书
- certbot网站
- jenkins与CI/CD
- 01-Jenkins部署和初始化
- 02-Jenkins三种插件安装方式
- 03-Jenkins目录说明和备份
- 04-git与gitlab项目准备
- 05-构建自由风格项目和相关知识
- 06-构建html静态网页项目
- 07-gitlab自动触发项目构建
- 08-pipelinel流水线构建项目
- 09-用maven构建java项目
- iptables
- 01-知识概念
- 02-常规命令实战
- 03-企业应用模板
- 04-企业应用模板[1键脚本]
- 05-企业案例-共享上网和端口映射
- SSH与VPN
- 常用VPN
- VPN概念和常用软件
- VPN之PPTP部署[6.x][7.x]
- 使用docker部署softether vpn
- softEther-vpn静态路由表推送
- SSH服务
- SSH介绍和部署
- SSH批量分发脚本
- 开启sftp日志并限制sftp访问目录
- sftp账号权限分离-开发平台
- ssh配置文件最佳实践
- git-github-gitlab
- git安装部署
- git详细用法
- github使用说明
- gitlab部署和使用
- 缓存数据库
- zookeeper草稿
- mongodb数据库系列
- mongodb基本使用
- mongodb常用命令
- MongoDB配置文件详解
- mongodb用户认证管理
- mongodb备份与恢复
- mongodb复制集群
- mongodb分片集群
- docker部署mongodb
- memcached
- memcached基本概念
- memcached部署[6.x][7.x]
- memcached参数和命令
- memcached状态和监控
- 会话共享和集群-优化-持久化
- memcached客户端-web端
- PHP测试代码
- redis
- 1安装和使用
- 2持久化-事务-锁
- 3数据类型和发布订阅
- 4主从复制和高可用
- 5redis集群
- 6工具-安全-pythonl连接
- redis配置文件详解
- 磁盘管理和存储
- Glusterfs分布式存储
- GlusterFS 4.1 版本选择和部署
- Glusterfs常用命令整理
- GlusterFS 4.1 深入使用
- NFS文件存储
- NFS操作和部署
- NFS文件系统-挂载和优化
- sersync与inotify
- rsync同步服务
- rsyncd.conf
- rsync操作和部署文档
- rsync常见错误处理
- inotify+sersync同步服务
- inotify安装部署
- inotify最佳脚本
- sersync安装部署
- 时间服务ntp和chrony
- 时间服务器部署
- 修改utc时间为cst时间
- 批量操作与自动化
- cobbler与kickstart
- KS+COBBLER文件
- cobbler部署[7.x]
- kickstart部署[7.x]
- kickstar-KS文件和语法解析
- kickstart-PXE配置文件解析
- 自动化之ansible
- ansible部署和实践
- ansible剧本编写规范
- 配置文件示例
- 内网DNS服务
- 压力测试
- 压测工具-qpefr测试带宽和延时