docker高级篇(mysql主从,redis主从搭建,Dockerfile解析及docker-compose编排)

2023-11-16

本篇主要是mysql主从,redis主从搭建,Dockerfile解析及docker-compose编排、轻量化可视化工具Portainer、重量级工具CAdvisor+InfluxDB+Granfana的使用。
docker的安装、配置、卸载,自定义镜像和搭建公有和私有镜像仓库,以及常规软件安装示例见另一篇:docker基础篇-docker的安装、配置、卸载,自定义镜像和搭建公有和私有镜像仓库

docker高级篇

一、docker集群安装

1. mysql主从服务器搭建(一主一从)

1.1. 新建主服务器容器实例 3307
docker run -d -p 3307:3306 --privileged=true -v /home/mydata/mysql-master/log:/var/log/mysql -v /home/mydata/mysql-master/data:/var/lib/mysql -v /home/mydata/mysql-master/conf:/etc/mysql --name=mysql-master  -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

在这里插入图片描述

1.2. 进入/home/mydata/mysql-master/conf目录下新建my.cnf

/home/mydata/mysql-master/conf为自己配置文件映射到宿主机的相应目录下
在这里插入图片描述

my.cnf配置文件:

[mysqld]
##设置server_id,同一局域网中唯一
server_id=101
##指定不需要同步的数据库的名称
binlog-ignore-db=mysql
##开启二进制日志功能
log-bin=mall-mysql-bin
##设置二进制日志使用的内存大小(事务)
binlog_cache_size=1M
##设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
##二进制日志过期清理时间,默认为0,表示不自动清理
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
1.3. 修改玩配置后重启master实例
docker restart mysql-master

在这里插入图片描述

1.4. 进入mysql-master容器
docker exec -it mysql-master /bin/bash
mysql -u root -p

在这里插入图片描述

1.5. master容器实例内创建数据同步用户
create user 'slave'@'%' identified by '123456';
grant replication slave,replication client on *.* to 'slave'@'%';

在这里插入图片描述

1.6. 新建从服务器容器实例3308
docker run -d -p 3308:3306 --privileged=true -v /home/mydata/mysql-slave/log:/var/log/mysql -v /home/mydata/mysql-slave/data:/var/lib/mysql -v /home/mydata/mysql-slave/conf:/etc/mysql --name=mysql-slave  -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

在这里插入图片描述

1.7. 进入/home/mydata/mysql-slave/conf目录下新建my.cnf

在这里插入图片描述

my.cnf配置文件:

[mysqld]
##设置server_id,同一局域网中唯一
server_id=102
##指定不需要同步的数据库的名称
binlog-ignore-db=mysql
##开启二进制日志功能,以备slave作为其他数据库实例的master
log-bin=mall-mysql-slave1-bin
##设置二进制日志使用的内存大小(事务)
binlog_cache_size=1M
##设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
##二进制日志过期清理时间,默认为0,表示不自动清理
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
##relay_log配置中继日志
relay_log=mall-mysql-relay-bin
##log_slave_updates表示slave将复制事件写进自己的二进制文件
log_slave_updates=1
##slave设置为只读(具有super权限的用户除外)
read_only=1
1.8. 修改完配置后重启slave实例
docker restart mysql-slave

在这里插入图片描述

1.9. 在主数据库中查看主从同步状态
show master status;

在这里插入图片描述

1.10. 进入mysql-slave容器
docker exec -it mysql-slave /bin/bash
mysql -u root -p

在这里插入图片描述

1.11. 在从数据库中配置主从复制
change master to master_host='宿主机ip',master_user='slave',master_password='123456',master_port=3307,master_log_file='mall-mysql-bin.000005',master_log_pos=617,master_connect_retry=30;

参数说明:

  • master_host:主数据库的ip
  • master_user:在主数据库中创建的用于同步数据的用户账号
  • master_password:在主数据库中创建的用于同步数据的用户密码
  • master_port:主数据库的运行端口
  • master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据库的状态(见上方1.9),获取File参数
  • master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据库状态(见上方1.9),获取Position参数
  • master_connect_retry:连接失败重试的时间间隔,单位秒

在这里插入图片描述

1.12. 在从数据库中查看主从复制状态
# \G可不加,不加就是默认以列表的形式展示,如(上方1.9章节)查询主数据库状态。
#加上\G表示以K-V键值对的形式展示。
show slave status \G; 

在这里插入图片描述

1.13. 在从数据库中开启主从同步
start slave;

在这里插入图片描述

1.14. 查看从数据库状态发现已同步
show slave status \G; 

在这里插入图片描述

1.15. 主从复制测试
  1. 主机新建库-使用库-新建表-插入数据
    在这里插入图片描述

  2. 从机使用库-查看数据
    在这里插入图片描述

2. redis集群搭建

2.1 亿级数据需要缓存?

答:肯定是需要进行分布式集群部署的。3种方案,从易到难

  1. 哈希取余分区
  • 概述
      假设有3台redis节点,在存数据时使用公式hash(key)/3,计算出余数决定放入哪一个节点,在取数据时,也是用hash(key)/3计算出余数决定到哪一个节点去取出数据。
  • 优点
      简单粗暴,直接有效,只需要预估好数据、规划好节点,例如3台,6台,10台等,就能保证一段时间的数据支撑,使用hash算法让固定的一部分请求落在同一个服务器上,这样每台服务器固定的处理一部分请求,起到了负载均衡+分而治之的作用。
  • 缺点
      原来规划好的节点,进行扩容和缩容比较麻烦,不管扩缩,每次数据变动导致节点有变动,映射关系需要重新进行计算。在服务器个数不变的情况下没问题,如果需要弹性扩缩或故障停机的情况下,原来的取模公式就会发生变化:hash(key)/?。此时地址经过取余运算的结果将发生很大的变化,根据公式获取的服务器也会变得不可控。
  1. 一致性哈希算法分区
  • 概述
      为了解决分布式缓存数据变动和映射问题,当服务器个数发生变化时,尽量减少影响客户端到服务器的映射关系。
  • 实现方式
    ① 算法构建一致性哈希环:有一个hash函数算法产生一个0~232-1 的hash圆环。
    ② 服务器IP节点映射:将集群中的节点根据hash函数算法映射到环上的某一个位置。
    ③ key落到服务器的落键规则:计算出key的hash值,确定key在环上的位置,然后按顺时针的方向找到第一个节点,然后将该键值对存储在这个节点上。
  • 优点
      具有容错性和扩展性。容错性:当出现宕机时,只会影响出错位置到逆时针上一个节点的一段数据,将其存入顺时针的下一个节点上存储;扩展性:计算出新加节点的hash落点,影响落点到逆时针的上一个节点的数据,不会导致全部数据重新洗牌。
  • 缺点
      数据倾斜问题:当节点数量太少时,容易因为节点的分布不均造成数据倾斜(缓存的大部分数据集中在同一台服务器上)。
  1. 哈希槽分区
      为了解决数据倾斜问题,hash槽实质上就是一个数组0~214-1 形成hash slot空间。解决了均匀分配的问题,就是在数据和节点之间加了一层,把这层叫做哈希槽(slot),用于管理数据和节点的关系,相当于节点上放的是槽,槽里面放的数据。
      槽解决的是粒度的问题,相当于放大了粒度,便于数据移动。
      哈希解决的是映射问题,使用key的哈希值来计算所在的槽,便于数据分配。
      一个集群中只能有16384个槽,编号0~16383(2^14^-1)。将这些槽分配给集群中的所有主节点,分配策略没有要求。可以指定哪些编号的槽分配给哪些主节点。集群会记录节点和槽的对应关系。然后计算键值对的key落在那个槽中,slot=CRC16(key)%16384。以槽为单位移动数据,因为槽是固定的,处理起来很容易,这样数据的移动问题就解决了。
      redis集群中内置了16384个哈希槽,redis会根据节点数量大致均等的将哈希槽映射到不同的节点
2.2 3主3从redis集群搭建
  1. 新建六个docker容器实例
docker run -d  --name=redis-node-1 --net host --privileged=true -v /home/redis/data/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
docker run -d  --name=redis-node-2 --net host --privileged=true -v /home/redis/data/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
docker run -d  --name=redis-node-3 --net host --privileged=true -v /home/redis/data/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
docker run -d  --name=redis-node-4 --net host --privileged=true -v /home/redis/data/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
docker run -d  --name=redis-node-5 --net host --privileged=true -v /home/redis/data/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
docker run -d  --name=redis-node-6 --net host --privileged=true -v /home/redis/data/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386

参数说明

  • --net host :使用宿主机的ip和端口,默认
  • --privileged=true :获取宿主机root用户权限
  • --cluster-enabled yes :开启redis集群
  • --appendonly yes :开启持久化
  • --port 6386 :redis端口号

在这里插入图片描述
2. 进入redis-node-1并为6台机器构建集群关系

#可以进入任意节点,只是以redis-node-1为例
docker exec -it redis-node-1 /bin/bash
#然后执行下面的命令,注意更换ip地址
redis-cli --cluster create 192.168.64.128:6381 192.168.64.128:6382 192.168.64.128:6383 192.168.64.128:6384 192.168.64.128:6385 192.168.64.128:6386 --cluster-replicas 1

参数说明

  • --cluster-replicas 1 :表示为每一个master创建一个slave节点

主从对应关系随机,由系统分配
在这里插入图片描述
在这里插入图片描述
3. 连接进入6381位切入点,查看集群状态

#进入6381端口的redis
redis-cli -p 6381
cluster info
cluster nodes

在这里插入图片描述
主从对应关系随机,由系统分配
在这里插入图片描述

2.3 主从容错切换迁移案例
  1. 数据的读写存储
    注:防止路由失效,在进入redis指令后加参数 -c,不加-c时,只有当新增的key满足当前节点哈希槽才能成功,否则会失败,不会自动路由切换。
docker exec -it redis-node-1 /bin/bash
redis-cli -p 6381 -c

在这里插入图片描述
查看集群信息:

redis-cli --cluster check 192.168.64.128:6381

在这里插入图片描述

  1. 容错切换迁移

模拟主从切换:停止6381主机,发现6386主机成为master,再次启动6381主机后,6381成为了6386的从机slave。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.4 主从扩容案例
  1. 新建6387、6388两个节点,并启动两个节点
docker run -d  --name=redis-node-7 --net host --privileged=true -v /home/redis/data/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387
docker run -d  --name=redis-node-8 --net host --privileged=true -v /home/redis/data/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388

在这里插入图片描述

  1. 进入6387容器实例,将6387节点(空槽号)作为master节点加入集群
docker exec -it redis-node-7 /bin/bash
# 6387就是要作为master的新增节点
# 6381就是原来集群节点中的领路人,相当于6387拜拜6381的码头找到组织加入集群
redis-cli --cluster add-node 192.168.64.128:6387  192.168.64.128:6381

在这里插入图片描述

  1. 检查集群情况1
redis-cli --cluster check 192.168.64.128:6381

在这里插入图片描述

  1. 重新分配槽号:
redis-cli --cluster reshard 192.168.64.128:6382

在这里插入图片描述

  1. 检查集群情况2
redis-cli --cluster check 192.168.64.128:6381

在这里插入图片描述

  1. 为主节点6387分配从节点6388
redis-cli --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新master节点的ID

在这里插入图片描述

  1. 检查集群情况3
redis-cli --cluster check 192.168.64.128:6382

在这里插入图片描述

2.5 主从缩容案例
  1. 先删除从节点6388
redis-cli --cluster check 192.168.64.128:6382
redis-cli --cluster del-node ip:从节点端口 从节点ID

在这里插入图片描述
2. 检查集群情况:发现已删除6388节点

redis-cli --cluster check 192.168.64.128:6382

在这里插入图片描述

  1. 将6387主节点的槽号重新分配:
redis-cli --cluster reshard 192.168.64.128:6383

在这里插入图片描述
4. 检查集群情况:发现6387节点的槽位全部分配给了6386

redis-cli --cluster check 192.168.64.128:6382

在这里插入图片描述

  1. 删除6387主节点
redis-cli --cluster del-node ip:主节点端口  主节点ID

在这里插入图片描述

  1. 检查集群情况:恢复之前的3主3从
redis-cli --cluster check 192.168.64.128:6382

在这里插入图片描述

二、dockerFile解析

1. 常用关键字指令

  • FROM:基础镜像。指定一个已经存在的镜像作为模板,第一条必须是FROM。
  • MAINTAINER:镜像维护者的姓名和邮箱。
  • RUN:容器构建时执行的命令,在docker build时运行。有两种格式:shell命令格式和exec格式。
  • EXPOSE:当前容器对外暴露的端口。
  • WORKDIR:指定在创建容器后,终端默认登录进来的工作目录,一个落脚点。
  • USER:指定该镜像以什么样的用户去执行,如果不指定,默认是root。
  • EVN:用于在构建镜像过程中设置环境变量。如:ENV MY_PATH /use/local,可以其他地方使用 $MY_PATH
  • ADD:将宿主机目录下的文件拷贝进镜像且会自动清理URL和解压tar压缩包。
  • COPY:类似于ADD,拷贝文件和目录到镜像中。COPY src dest
  • VOLUME:容器数据卷,用于数据保存和持久化工作。
  • CMD:指定容器启动后要干的事情,但只有最后一个生效,CMD会被docker run之后的参数替换。有两种格式:shell命令格式和exec格式。
  • ENTRYPOINT:指定容器启动时要运行的命令,不会被覆盖,而是将docker run 后面的命令行作参数,当做参数送给ENTRYPOINT指令。

2. 自定义centosjdk8镜像

给centos7添加vim+ifconfig+jdk8

2-1. jdk镜像下载:https://www.oracle.com/java/technologies/downloads/
2-2. 编写DockerFile文件
  1. 新建 myfile文件夹,上传jdk-8u371-linux-x64.tar.gz
    在这里插入图片描述
    2.新建Dockerfile文件
    在这里插入图片描述

Dockerfile文件

FROM centos:7
MAINTAINER gongl<********@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装jdk8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD是相对路径jar,把jdk-8u371-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一个位置
ADD jdk-8u371-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_371
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH


EXPOSE 80
CMD echo $MYPATH
CMD echo 'sucess-------------------ok'
CMD /bin/bash
2-3. 构建
#注意TAG后面有个空格和点.
docker build -t 新镜像的名字:TAG .

在这里插入图片描述
在这里插入图片描述

2-4. 运行
docker run -it centos7jdk8:1.1 /bin/bash

在这里插入图片描述

3. 虚悬镜像

  1. 编写一个Dockerfile文件
from ubuntu
CMD echo'action is sucess'
  1. docker build .
    在这里插入图片描述
  2. 只查看虚悬镜像指令
docker image  ls -f dangling=true

在这里插入图片描述
4. 删除虚悬镜像

docker image prune

在这里插入图片描述

三、docker微服务实战

  1. 将java项目打成jar包上传到服务器:如 test.jar
  2. 编写Dockerfile文件:将Dockerfile文件和jar包放在同一目录下
#基础镜像使用java8
FROM java:8
#作者信息
MAINTAINER gongl<********@qq.com>
# VOLUME 指定临时文件目录/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
#将jar包添加到容器中并命名为 aaaaa_test.jar
ADD test.jar aaaaa_test.jar
#运行jar
ENTRYPOINT ["java","-jar","aaaaa_test.jar"]
#暴露端口9561作为微服务的端口
EXPOSE 9561
  1. docker build -t aaaaa_test:1.4 . 生成镜像
  2. 运行容器并测试
    • 直接浏览器访问接口测试
    • curl指令测试

四、docker网络

  1. 作用
  • 容器间的互联和通信以及端口映射
  • 容器IP变动时候可以通过服务名直接网络通信而不受IP地址变更影响
  1. docker 运行时,会产生一个名为docker0的网桥
    在这里插入图片描述
  2. 常用指令 :docker network [OPTIONS]
  • connect:连接
  • create:创建
  • disconnect:中断
  • inspect:查看
  • ls:列表
  • prune:删除所有无效网络
  • rm:删除

在这里插入图片描述
4. 网络模式
在这里插入图片描述

  • bridge:虚拟网桥,默认模式。为每个容器分配IP。--network bridge
  • host:直接使用宿主机的IP和端口,所以-p参数会无效 ,如上图给出的警告。--network host
  • none:用自己的network namespace,但是没有任何的网络配置。 --network none
  • container:新建的容器不创建自己的网卡和IP,而是和一个指定的容器共享IP、端口等,当指定容器停止后,新建的容器也无法使用网络--network container:指定的容器名
  • 自定义桥接网络:使用指令docker network create 自定义网络名创建。将服务设置同一个自定义网络,可以通过容器的服务名直接通信。自定义网络本身就维护好了主机名和ip的对应关系。 --network 自定义网络名

五、docker-compose容器编排

实现对docker集群的快速编排
下载地址:https://docs.docker.com/compose/install/
安装文档:https://docs.docker.com/compose/install/other/
compose版本对应文档地址:https://docs.docker.com/compose/compose-file/compose-file-v3/

#下载
curl -SL https://github.com/docker/compose/releases/download/v2.17.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
#添加权限
chmod +x /usr/local/bin/docker-compose
#测试安装
docker-compose --version
#卸载
rm /usr/local/lib/docker/cli-plugins/docker-compose
  1. compose常用命令
docker-compose  -h   				#查看帮助
docker-compose	up					#启动所有docker-compose服务
docker-compose	up -d				#启动所有docker-compose服务并后台运行
docker-compose	down				#停止并删除容器、网络、卷、镜像
docker-compose	exec yml中的服务id	#进入容器实例内部 docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
docker-compose	ps					#展示当前docker-compose编排过的运行的所有容器
docker-compose	top					#展示当前docker-compose编排过的容器进程
docker-compose	logs yml中的服务id	#查看容器输出日志
docker-compose	config				#检查配置
docker-compose	config -q			#检查配置,有问题才输出
docker-compose	restart				#重启服务
docker-compose	start				#启动服务
docker-compose	stop				#停止服务
  1. 举例编排上线微服务
    2.1 编写docker-compose.yml文件
version: "3"  #版本

services:	#所有的服务
 microService:	#服务名,自定义,不重复即可					
  image: aaaaa_test:1.4	#镜像名称:TAG
  container_name: ms01	#容器名称,自定义。不加该参数默认生成带前缀和后缀的容器名
  ports:					#端口映射
   - "9561:9561"		
  volumes:			#数据卷
   - /app/microService:/data
  networks:	#自定义网络,为了直接使用 服务名 进行容器间通信
   - test_net
  depends_on:		#当前服务依赖于哪些服务
   - redis1
   - mysql
			
 reids1:		#服务名,自定义,不重复即可	
  image: redis:6.0.8	#镜像名称:TAG
  ports:		#端口映射
   - "6379:6379"
  volumes:			#数据卷
   - /app/redis/redis.conf:/etc/redis/redis.conf
   - /app/redis/data:/data
  networks:
   - test_net
  command: redis-server /etc/redis/redis.conf
		
 mysql:
  image: mysql:5.7
  environment:
   MYSQL_ROOT_PASSWORD: '123456'
   MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
   MYSQL_DATABASE: 'db2023'
   MYSQL_USER: 'root'
   MYSQL_PASSWORD: '123456'
  ports:
   - "3306:3306"
  volumes:
   - /app/mysql/db:/var/lib/mysql
   - /app/mysql/conf/my.cnf:/etc/my.cnf
   - /app/mysql/init:/docker-entrypoint-initdb.d
  networks:
   - test_net
  command: --default-authentication-plugin=mysql_native_password	#解决外部无法访问
		
networks:
 test_net:

2.2 将java项目中的ip地址修改为对应的服务名(如:redis的ip修改为上面配置文件的redis1)。打包并生成镜像:具体实现查看上面 三、docker微服务实战
2.3 docker-compose config -q检查docker-compose.yml文件
在这里插入图片描述
2.4 docker-compose up 或者docker-compose up -d启动服务

2.5 进入mysql容器完成数据库初始化等操作

2.6 docker-compose stop 可停止所有的服务

六、docker轻量化可视化工具Portainer

Portainer是一款轻量级的应用,提供了图形化界面,用于方便的管理Docker环境,包括单机和集群环境。

  1. 安装
    官网地址:https://www.portainer.io/
docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

--restart=always 表示docker启动时同时启动该容器
在这里插入图片描述
2. 第一次登录需要创建admin,访问地址:ip:9000
在这里插入图片描述

  1. 设置admin用户名和密码后首次登录:设置密码8位即可
  2. 选择local选项卡后查看本地docker详细信息

七、docker容器监控之CAdvisor+InfluxDB+Granfana(重量级工具)

  1. CAdvisor:收集服务,2分钟的数据,访问地址:http://ip:8080。首次访问很慢
  2. InfluxDB:时序数据库,存储服务,访问地址:http://ip:8083
  3. Granfana:展现服务,默认账号密码 admin/admin,访问地址:http://ip:3000
  4. 编写docker-compose.yml文件
version: '3.1'  
 
volumes:
  grafana_data: {}            #实现了grafana数据的挂载
 
services:                    #表示我们要启动的服务,即要docker run的内容,多个实例服务
 influxdb:                    
  image: tutum/influxdb:0.9
  restart: always
  environment:
    - PRE_CREATE_DB=cadvisor    #预先创建一个数据库
  ports:
    - "8083:8083"        #对外是8083
    - "8086:8086"        #内部即8086
  volumes:
    - ./data/influxdb:/data 
 
 cadvisor:
  image: google/cadvisor
  links:
    - influxdb:influxsrv
  command: -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086 #这就是相当于mysql选择的那个驱动
  restart: always
  ports:
    - "18080:8080"
  volumes:
    - /:/rootfs:ro    
    - /var/run:/var/run:rw
    - /sys:/sys:ro
    - /var/lib/docker/:/var/lib/docker:ro
 
 grafana:
  image: grafana/grafana
  user: "104"
  restart: always                            #随着docker启动,就启动
  links:
    - influxdb:influxsrv
  ports:
    - "3000:3000"
  volumes:
    - grafana_data:/var/lib/grafana
  environment:
    - HTTP_USER=admin
    - HTTP_PASS=admin
    - INFLUXDB_HOST=influxsrv
    - INFLUXDB_PORT=8086
    - INFLUXDB_NAME=cadvisor
    - INFLUXDB_USER=root
    - INFLUXDB_PASS=root

  1. docker-compose -q检查并执行 docker-compose up运行
  2. 登录3个软件的访问地址查看
  3. grafana图形界面的配置(略)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

docker高级篇(mysql主从,redis主从搭建,Dockerfile解析及docker-compose编排) 的相关文章

  • Redis+Docker+Django - 错误 111 连接被拒绝

    我正在尝试使用 Redis 作为使用 Docker Compose 的 Django 项目的 Celery 代理 我无法弄清楚我到底做错了什么 但尽管控制台日志消息告诉我 Redis 正在运行并接受连接 事实上 当我这样做时 docker
  • PHP-docker容器中的环境变量

    我想在我的 docker 容器中显示一个环境变量 PHP 脚本如下所示 我使用 OpenShift 来启动容器 PHP 容器显示 env is 现在我更改容器的 dc 配置 oc env dc envar USER Pieter deplo
  • jdbc4.MySQLSyntaxErrorException:数据库中不存在表

    我正在使用 SpringBoot 开发一个网络应用程序 这是我的application properties文件来指定访问数据库的凭据 spring datasource driverClassName com mysql jdbc Dri
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • 使用用户定义函数 MySql 时出错

    您好 请帮我解决这个问题 提前致谢 我在数据库中定义了这些函数 CREATE FUNCTION levenshtein s1 VARCHAR 255 s2 VARCHAR 255 RETURNS INT DETERMINISTIC BEGI
  • 使用什么框架来引导我的第一个生产 scala 项目?

    我正在第一次涉足 scala 的生产应用程序 该应用程序当前打包为 war 文件 我的计划是创建 scala 编译工件的 jar 文件 并将其添加到 war 文件的 lib 文件夹中 我的增强功能是通过 Jersey 公开的 mysql 支
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s
  • SSE:跨页边界的未对齐加载和存储

    我在页面边界旁边执行未对齐加载或存储之前读过某处 例如使用 mm loadu si128 mm storeu si128内在函数 代码应首先检查整个向量 在本例中为 16 个字节 是否属于同一页 如果不属于同一页 则切换到非向量指令 我知道
  • 将 jar 作为 Linux 服务运行 - init.d 脚本在启动应用程序时卡住

    我目前正在致力于在 Linux VM 上实现一个可运行的 jar 作为后台服务 我已经使用了找到的例子here https gist github com shirish4you 5089019作为工作的基础 并将 start 方法修改为
  • CakePHP 查找 - 按字符串到整数排序?

    我想使用 CakePHP 从数据库中提取照片数组 按照片标题排序 0 1 2 3 我的查询当前看起来像 ss photos this gt Asset gt find all array conditions gt array kind g
  • 如何使用 MySQL 选择有特定值的 2 个连续行?

    我正在构建一个系统 该系统应该显示学生何时连续缺席两天 例如 此表包含缺勤情况 day id missed 2016 10 6 1 true 2016 10 6 2 true 2016 10 6 3 false 2016 10 7 1 tr
  • jq中如何分组?

    这是 json 文档 name bucket1 clusterName cluster1 name bucket2 clusterName cluster1 name bucket3 clusterName cluster2 name bu
  • 在 MySQL 数据库中保持 TEXT 字段唯一的最佳方法

    我想让 TEXT 字段的值在我的 MySQL 表中唯一 经过小型研究 我发现由于性能问题 每个人都不鼓励在 TEXT 字段上使用 UNIQUE INDEX 我现在想用的是 1 创建另一个字段来包含 TEXT 值的哈希值 md5 text v
  • ftrace:仅打印trace_printk()的输出

    是否可以只转储trace printk 输出于trace文件 我的意思是过滤掉函数跟踪器 或任何其他跟踪器 中的所有函数 一般来说 您可以在选项目录中关闭选项 sys kernel debug tracing options Use ls显
  • 查找哪个程序运行另一个程序

    我有一个 NAS 运行在 Redhat Linux 的有限版本上 我按照指示破解了它 这样我就可以访问 shell 这很有帮助 我还做了一些修改 其他人也做过修改 除了一个问题之外 它们似乎都工作得很好 不知何故 每隔 22 天 系统就会关
  • 如何确保应用程序在 Linux 上持续运行

    我试图确保脚本在开发服务器上保持运行 它会整理统计数据并提供网络服务 因此它应该会持续存在 但一天中有几次 它会因未知原因而消失 当我们注意到时 我们只需再次启动它 但这很麻烦 并且某些用户没有权限 或专有技术 来启动它 作为一名程序员 我
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do
  • 选择获取与 MySQL Group 中 max 对应的整行

    当我使用Max使用后查找特定 MySQL 组中字段的最大值GROUP BY 是否可以获取包含最大值的整行 我在处理一些论坛代码时偶然发现了这个线程 我想获取每个线程的最新帖子并将其显示在特定板的线程列表中 Quassnoi上面的回答对我非常
  • 查询为空 Node Js Sequelize

    我正在尝试更新 Node js 应用程序中的数据 我和邮递员测试过 我的开发步骤是 从数据库 MySQL 获取ID为10的数据进行更新 gt gt 未处理的拒绝SequelizeDatabaseError 查询为空 我认识到 我使用了错误的
  • 如何使用 GOPATH 的 Samba 服务器位置?

    我正在尝试将 GOPATH 设置为共享网络文件夹 当我进入 export GOPATH smb path to shared folder I get go GOPATH entry is relative must be absolute

随机推荐

  • [vue3]判断存放在state里面的变量的返回值为proxy {}时为空

    先说判断方法 通过JSON stringify将返回的proxy数据转换成字符串 在判断是否为空 如果此时options value的返回值是proxy console log JSON stringify options value tr
  • 一键重装系统工具和U盘重装工具有什么区别?

    用户常用的系统重装方法就是一键重装系统和U盘装系统了吧 但是还有很多小白不清楚一键重装系统工具和U盘装系统工具有什么区别 自己重装时要选择哪款工具 下面小编就给大家讲讲 石大师U盘装系统大师下载 石大师U盘重装系统官方版下载 系统之家 U盘
  • 【自我提高】树莓派UART的几种语言控制方法 C 篇

    自我提高 树莓派UART的几种语言控制方法 C语言 篇 首先要安装wiringPi 具体安装过程见一下链接 https blog csdn net shileiwu0505 article details 106365588 对照树莓派 3
  • LaTeX中插入jpg图片

    documentclass a4paper article usepackage graphicx times usepackage subfigure usepackage natbib usepackage amssymb amsmat
  • 动态测试方法

    动态测试方法 通过实际执行代码去发现潜在代码错误的测试方法 人工动态方法 人工动态方法 可以真正检测代码的业务逻辑功能 其关注点是 什么样的输入 执行了什么代码 产生了什么样的输出 主要用于发现算法错误和部分算法错误 是最主要的代码级测试手
  • 腾讯xSCR平台源码部署

    腾讯xSCR平台源码部署 腾讯开源src平台 看上去很不错的样子 在docker部署成功后 再次尝试源码部署 1 环境部署 Centos 7 Apache Nginx 这里我选择的是Apache 个人喜好 yum y install htt
  • 利用spring的profile切换不同的环境

    1 profile简单实用 简单暴力才是最好的 我们就简单地用一下 先不考虑和maven的集成使用 就可以解决烦人的事情
  • Lattics:一款简单易用、好看强大的「类脑式」知识管理工具,笔记应用与写作软件二合一

    如何选择一款适合自己的知识管理工具 随着数字化时代的到来 越来越多的人意识到知识管理的重要性 笔记软件和写作软件作为一种常用的知识管理工具 一直以来备受关注 从最早的印象笔记 有道云 为知笔记 幕布mubu到近几年的思源 Siyuan 熊掌
  • 新的选择器+CSS变量

  • 对于System.out.println简单了解

    System out println很多人都是处于用的阶段 并没有深入的了解 我也是 之所以来了解这个东西是因为在本地开发的时候启动项目的时候发现内存不足了 这个问题就很纳闷 明明刚刚还是好好的 突然就内存不足了 想到在之前写了几个Syst
  • 预防H7N9

    传染源 目前尚不明确 根据以往经验及本次病例流行病学调查 推测可能为携带H7N9禽流感病毒 的禽类及其分泌物或排泄物 1 症状 病情表现为典型的病毒性肺炎 起病急 病程早期有高热 38度以上可给予物理降温 如冰敷 乙醇擦浴 降温毯等 儿童禁
  • 电路基础和电路模拟——复习

    目录 前言 一 第一章电路基础 1 参考方向 关联参考方向的物理意义 参考方向 关联参考方向 2 电压与电位的区别 3 在非关联参考方向下 欧姆定律 功率计算的表达式 4 电容中电流与电压关系式 5 电容储能公式和物理意义 电容储能公式 物
  • 数据挖掘案例实战:利用LDA主题模型提取京东评论数据(二)

    泰迪智能科技 数据挖掘平台 TipDM数据挖掘平台 最新推出的数据挖掘实战专栏 专栏将数据挖掘理论与项目案例实践相结合 可以让大家获得真实的数据挖掘学习与实践环境 更快 更好的学习数据挖掘知识与积累职业经验 专栏中每四篇文章为一个完整的数据
  • 基于Python的考研调配系统考试成绩招生调剂-爬虫可视化大屏计算机毕业设计

    更多项目资源 最下方联系我们 目录 一 项目技术介绍 二 项目配套文档 部分内容 资料获取 一 项目技术介绍 该项目含有源码 文档 PPT 配套开发软件 软件安装教程 项目发布教程 包运行成功以及课程答疑与微信售后交流群 送查重系统不限次数
  • 多层多输入的CNN-LSTM时间序列回归预测(卷积神经网络-长短期记忆网络)——附代码

    目录 摘要 卷积神经网络 CNN 的介绍 长短期记忆网络 LSTM 的介绍 CNN LSTM Matlab代码运行结果 本文Matlab代码 数据分享 摘要 本文使用CNN LSTM混合神经网络对时间序列数据进行回归预测 本模型的输入数据个
  • pandas set_index和reset_index

    mport pandas as pd df a pd DataFrame data A B C A1 B1 C1 columns first second third print df a df a set index first seco
  • [项目管理-28]:四象限法与任务的时间优先级管理

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 目录 前言 第1章 四象限法介绍 1 1 概述 1 2 四象限优先级顺序 1 3 详细说明 前言 在项目管理中 我们经常遇到对各种各样的任务
  • 让Layui的table模块支持动态表头

    layui自带的table js插件是不支持的 这里我们简单的加几个字符进去 就可以支持了 1 打开插件目录下的layui lay modules目录 用文本文件打开table js 然后搜索 item2 title 在table js将
  • idea中如何创建xml文件

    本人做java开发程序员已经三年多了 从进入企业至今一直使用idea 对此开发工具还算了解 本人使用的版本 我是一个比较守旧的人 在2020年的今天还是依然使用2017年的版本 还请光大网友见谅哈 今天想说的就是如何在idea中创建 xml
  • docker高级篇(mysql主从,redis主从搭建,Dockerfile解析及docker-compose编排)

    本篇主要是mysql主从 redis主从搭建 Dockerfile解析及docker compose编排 轻量化可视化工具Portainer 重量级工具CAdvisor InfluxDB Granfana的使用 docker的安装 配置 卸