1 docker复杂安装详情
mysql一主一丛集群搭建
mysql搭建主服务器
docker run -p 3307:3306 --name=mysql-master -v zzq/mysql-master/log:/var/log/mysql -v /zzq/mysql-master/data:/var/lib/mysql -v /zzq/mysql-master/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
在/zzq/mysql-master/config下创建my.cnf,内容如下
[client]
#设置客户端字符集
default_character_set=utf8
[mysqld]
#开启定时任务
event_scheduler=ON
#允许最大连接数
max_connections=300
#最大等待时间单位s
wait_timeout = 28800
max_allowed_packet=500M
#服务端使用的字符集默认为8比特编码的latin1字符集
character_set_server=utf8
#设置服务端字符排序规则
collation_server=utf8_general_ci
#创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
#开启查询缓存
explicit_defaults_for_timestamp=true
#skip-grant-tables
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
#设置mysql连接数
max_connections=151
#设置不区分大小写
lower_case_table_names=1
#设置server_id,同一局域网中需要唯一
server_id=101
#指定不需要同步的数据库名称
binlog-ignore-db=mysql
#开启二进制日志功能,开启二进制日志,并指定日志文件的前缀为mysql-bin。
log-bin=mysql-master-bin
#设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
#设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
#二进制日志过期清理时间,默认为0;表示不清理
expire_logs_days=7
#跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制终端,如:1062错误是值一些主键重复,10323错误是主从数据库数据不一致
slave_skip_errors=1062
在mysql-master上登入mysql设置和备份机的关系
create user ‘slave’@‘%’ identified by ‘123456’;
授权
grant replication slave,replication client on . to ‘slave’ @ ‘%’;
mysql搭建从服务器
docker run -p 3308:3306 --name=mysql-slave -v zzq/mysql-slave/log:/var/log/mysql -v /zzq/mysql-slave/data:/var/lib/mysql -v /zzq/mysql-slave/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
在/zzq/mysql-slave/config下创建my.cnf,内容如下
[client]
#设置客户端字符集
default_character_set=utf8
[mysqld]
#开启定时任务
event_scheduler=ON
#允许最大连接数
max_connections=300
#最大等待时间单位s
wait_timeout = 28800
max_allowed_packet=500M
#服务端使用的字符集默认为8比特编码的latin1字符集
character_set_server=utf8
#设置服务端字符排序规则
collation_server=utf8_general_ci
#创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
#开启查询缓存
explicit_defaults_for_timestamp=true
#skip-grant-tables
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
#设置mysql连接数
max_connections=151
#设置不区分大小写
lower_case_table_names=2
#设置server_id,同一局域网中需要唯一
server_id=101
#指定不需要同步的数据库名称
binlog-ignore-db=mysql
#开启二进制日志功能,开启二进制日志,并指定日志文件的前缀为mysql-bin。
log-bin=mysql-slave-bin
#设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
#设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
#二进制日志过期清理时间,默认为0;表示不清理
expire_logs_days=7
#跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制终端,如:1062错误是值一些主键重复,10323错误是主从数据库数据不一致
slave_skip_errors=1062
#配置中继日志
relay_log=mysql-relay-bin
#log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
#slave设置只读(具有super权限用户除外)
read_only=1
在mysql-slaver上登入mysql,在从数据库中配置主从复制
在master进入mysql执行show master status;查看file和position,拿到从哪开始同步的信息
change master to master_host=‘宿主机ip’,master_user=‘slave’,master_password=‘123456’,master_port=3307,master_log_file=‘mysql-master-bin.000001’,masster_log_pos=617,master_connect_retry=30;
在从数据库中查看主从同步状态
show slave status \G;
在从数据库中开启主从同步
start slave;
redis集群搭建
启动docker,新建6台redis实例,三主三从集群搭建
docker run -d --name redis-node-1 --net host --privileged=true -v /zzq/redis/share/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 /zzq/redis/share/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 /zzq/redis/share/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 /zzq/redis/share/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 /zzq/redis/share/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 /zzq/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
进入docker容器,构建主从关系
redis-cli --cluster create 172.16.64.21:6381 172.16.64.21:6382 172.16.64.21:6383 172.16.64.21:6384 172.16.64.21:6385 172.16.64.21:6386 --cluster-replicas 1
–cluster-replicas 1 表示为每个master创建一个slave节点
产看集群状态
cluster info
cluster nodes
主从容错切换迁移案例
主机宕机,从机会不会变成主机
上面连接方式后面需要加上-c代表集群方式连接
查看集群信息
redis-cli --cluster check 172.16.64.21:6381
重启6381机器,6385还是主节点,6381是从节点
主从扩容案列
从三主三从变成四主四从(槽位如何重新分配)
docker run -d --name redis-node-7 --net host --privileged=true -v /zzq/redis/share/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 /zzq/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388
进入到node-7容器里面
docker exec -it redis-node-7 /bin/bash
将新增的6387节点(空槽号)作为master节点加入原集群(6381是原来集群的领路人)
redis-cli --cluster add-node 自己实际IP地址:6387 自己实际ip地址:6381
检查集群节点情况
redis-cli --cluster check 172.16.64.21:6381
重新分配槽位
redis-cli --cluster reshard ip地址:端口号
查看重新分配的槽位信息
redis-cli --cluster check 172.16.64.21:6381
发现结果:不是重新洗牌分配,而是前面三个都给了6387一点槽位,为什么6387是3个新的区间,以前的还是连续?重新分配成本太高,所以前3家各自匀出来一部分,从6381/6382/6383三个旧节点分别匀出1364个坑位给新节点6387
给6387添加从节点
redis-cli --cluster add-node 172.16.64.21:6388 172.16.64.21:6387 --cluster-slave --cluster-master-id 6387的id号
主从缩容案列
dcoker stop redis-node-7
查看集群状态获取6387和6388的节点id
redis-cli --cluster check 172.16.64.21:6388
redis-cli --cluster del-node ip:从机端口 从机6388节点id
重新分配槽点(6381作为突破点,重置集群槽点)
redis-cli --cluster reshard 172.16.64.21:6381
2 dockerFile解析
Dcokerfile是用来构建docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本
关键字 | 解释 |
from | 基本出现第一行,继承的父类/源头 |
maintainer | 维护者,镜像维护者的姓名和邮箱地址 |
run | 容器构建时需要运行的命令,另种格式sehll和exec格式,run是在docker build时运行;比如yum install |
expose | 当前容器对外暴漏的端口 |
workdir | 指定在创建容器后,终端默认登录的进来的工作目录,一个落脚点 |
user | 指定该镜像以仕么杨的用户去执行,如果不指定默认是root,一般不指定 |
env | 运行时的环境变量 ,用来设置构建镜像过程中的设置环境 变量 |
add | 将宿主机目录下的文件拷贝进镜像且会自动处理url和解压tar压缩包 |
copy | 类似于add,拷贝文件和目录到镜像中,将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>的位置 |
volume | 容器数据卷,用于数据保存和持久化工作 |
cmd | 只当的格式和run类似,两种格式,shell和exec格式;shell格式:cmd<命令>;exec格式:cmd[“可执行文件”,“参数1”…];只有最后一条生效 |
entrypoint | 类似鱼cmd,但是不会被docker run后面的命令覆盖,而且这些命令的参数被当作参数送给entrypoint指定的程序 |
构建镜像命令
docker build -t 新镜像名字:TAG .
删除虚悬镜像/没有tag和名字的镜像
docker image prune
3 docker微服务实战
1 将微服务jar包上传到指定目录
2 创建Dockerfile文件和jar目录在一起,内容如下
#基础镜像使用java
FROM java:8
#作者
MAINTAINER zhaozhiqiang
#volume指定临时文件目录为/tmp,在主机/zzq/project-info/volume-data目录下创建要给临时文件并链接到容器的/tmp
VOLUME /tmp
#将jar包添加到容器中并更名
ADD jeecg-cloud-nacos-2.4.6.jar pe-nacos.jar
#运行jar包
RUN bash -c 'touch /pe-nacos.jar'
ENTRYPOINT ["java","-jar","/pe-nacos.jar"]
#暴露8848端口作为微服务
EXPOSE 8848
3 构建Dockerfile
docker build -t pe-nacos:2.6 .
4运行容器
docker run -d -p 8848:8848 pe-nacos:2.6
4 docker网络
docker网络作用;1容器间的互联和通讯以及端口映射;2容器ip变动的时候可以通过服务名直接网络通讯而不受影响
查看网络 docker network ls
查看网络源数据 docker network inspect bridge/host/none
删除网络 docke network rm xxx网络名称
查看服务网络 docker inspect 网络名称
查看虚拟网桥(每个容器一个ip分配)
结论
docker容器内部ip是会变动的,服务名称固定但ip不固定
1 bridge网桥模式
2 host模式直接使用宿主机的ip地址与外界进行通讯,不在需要额外进行NAT转化
比如下:
docker run -d -p 8080:8080 --network host --name mytomcat83 billygoo/tomcat8-jdk8
![在这里插入图片描述](
问题:docker启动时指定了 --network=host或-net=host,如果还指定了-p端口映射,钠这个时候就会报警告,并且通过-p设置的参数将不会起到任何作用,端口号会以主机端口号为主,重复时则递增
解决:使用docker的其他网络模式,列如 --network=bridge,这样就可以解决问题了,或者直接无视
3 自定义网络
docker run -d -p 8082:8080 --name=tomcat82 billygoo/tomcat8-jdk8
docker run -d -p 8083:8080 --name=tomcat83 billygoo/tomcat8-jdk8
按照上面演示,互ping可以通
互ping服务名
结论:容器之间ip可以互相通讯,但服务名成不能互通,这在微服务中网关调用是不行的
解决方案:使用自定义网络让服务名互通
#创建自定义网络
docker network create zzq_test
#新建容器加入新建的zzq_test网络当中
docker run -d -p 8082:8080 --network=zzq_test --name=tomcat82 billygoo/tomcat8-jdk8
docker run -d -p 8084:8080 --network=zzq_test --name=tomcat84 billygoo/tomcat8-jdk8
默认情况下docker容器访问不了宿主机/etc/hosts里面配置的域名映射,解决方案如下
1 在docker-compose.yml中增加域名
extra_hosts:
pe-mysql: 172.16.64.21
如果是docker build就是
docker run -d --name container_name --add-host zjq.com:172.2.3.4 image_name:tag;
2 在容器中的hosts增加配置(不推荐)
172.16.64.21 pe-mysql
3 在容器编排中自定义网络段,让业务服务器和redis/mysql映射到同一网段
services:
#业务服务器
pe-nacos:
networks:
- zzq_net
mysql:
networks:
- zzq_net
redis:
networks:
- zzq_net
networks:
zzq_net:
4 容器创建使用network host,和宿主机保持一致
network_mode: host
5 docker-compose容器编排
定义 (docker-compose.yml)
是docker官方的开源项目,负责实现对docker容器集群的快速编排
作用
一键部署,意见启动/停止,顺序编排
安装步骤
curl -SL https://github.com/docker/compose/releases/download/v2.15.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
卸载步骤
rm /usr/local/bin/docker-compose
docker-compose常用命令
docker-compose -h //查看帮助
docker-compose up //启动所有docker-compose服务
docker-compose up -d //启动所有docker-compose服务并后台运行
docker-compose down //停止并删除容器/网络/卷/镜像
docker-compose exec yml里面的服务id //进入容器实例内部yml文件中写的服务id /bin/bash
docker-compose ps //展示当前docker-compose编排过去的运行的所有容器
docker-compose top //展示当前docker-compose编排过的容器进程
docker-compose logs yml里面的服务id //产看容器输出日志
docker-compose config -q //检查配置,有问题才由输出,不加-q所有输出
docker-compose restart //重启服务
docker-compose start //启动服务
docker-compose stop //停止服务
docker-compose编排微服务
version: "版本号"
services:
#服务名称
microService:
image: 服务名称:版本号
#容器名称指定的话,docker ps 容器名称就是指定的,不写的话容器名称有docker-compose.yml上一次目录_容器名称_n构成
container_name: 容器名称
#为容器设置主机名映射域名
#hostname: xxx
ports:
- "6001:6001"
volumes:
- /zzq/services:/data
networks:
- zzq_net
depends_on:
- redis
- mysql
redis:
image: redis:6.0.8
ports:
- "6379:6379"
volumes:
- /zzq/redis/redis.conf:/etc/redis/redis.conf
- /zzq/redis/data:/data
networks:
#自定义网络相当于 docker run --network=zzq_net
- zzq_net
command: redis-server /etc/redis/redis.conf
mysql:
image: mysql:5.7
enviroment:
MYSQL_ROOT_PASSWORD: '123456'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'pe-boot'
MYSQL_USER: 'root'
MYSQL_PASSWORD: '123456'
ports:
- "3306:3306"
volumes:
- /zzq/mysql/log:/var/log/mysql
- /zzq/mysql/data:/var/lib/mysql
- /zzq/mysql/conf:/etc/mysql/conf.d
networks:
- zzq_net
command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
networks: #自定网络名称,让多个网桥容器能ping通服务名,在同一的网络名称下相当于 docker network create zzq_net
zzq_net:
docker-compose语法大全
语法 | 解释 |
build | ./使用当前目录下的dockerfile进行构建; |
images | 指定运行容器使用的镜像名称 |
container_name | 容器名 |
command | 覆盖容器启动后默认执行的命令(Dockerfile定义的CMD)。当Dockerfile定义了entrypoint的时候,docker-comose.yml定义的command会被覆盖。 |
entrypoint | 可以覆盖Dockerfile中定义的entrypoint命令。 |
env_file | 定义了在docker-compose.yml中使用的变量, 封装变化,提高docker-compose.yml文件的灵活性。 |
environment | enviroment定义的变量会覆盖.env文件中定义的重名环境变量 |
ports | 将容器的端口映射到宿主机的端口 |
volumes | 挂载一个目录或者一个已存在的数据卷容器,HOST:CONTAINER 格式定义共享的目录;HOST:CONTAINER:RO 定义容器只读的目录。 |
networks | 加入指定网络 |
version | 版本信息,定义关乎于docker的兼容性,Compose 文件格式有3个版本,分别为1, 2.x 和 3.x |
context | context 选项可以是 Dockerfile 的文件路径,也可以是到链接到 git 仓库的 url |
dockerfile | 使用此 dockerfile 文件来构建,必须指定构建路径 |
args | 添加构建参数,这些参数是仅在构建过程中可访问的环境变量。 |
cache_from | 编写缓存解析镜像列表,此选项是v3.2中的新选项。 |
labels | 使用 Docker标签 将元数据添加到生成的镜像中,可以使用数组或字典。 |
shm_size | 设置容器 /dev/shm 分区的大小,值为表示字节的整数值或表示字符的字符串 |
target | 根据对应的 Dockerfile 构建指定 Stage |
cap_add,cap_drop | 添加或删除容器功能 |
configs | 使用服务 configs 配置为每个服务赋予相应的访问权限,支持两种不同的语法 |
depends_on | 容器中服务之间的依赖关系 |
deploy | 指定与部署和运行服务相关的配置。 |
devices | 设置映射列表,与 Docker 客户端的 --device 参数类似 |
dns | 自定义 DNS 服务器 |
dns_search | 自定义 DNS 搜索域,可以是单个值或列表 |
expose | 暴露端口 |
init | 在容器内运行init,转发信号并重新获得进程。将此选项设置true是为服务启用此功能。 |
links | 链接到其它服务的中的容器,可以指定服务名称也可以指定链接别名(SERVICE:ALIAS),与 Docker 客户端的 --link 有一样效果,会连接到其它服务中的容器。 |
logging | 配置日志服务 |
network_mode | 网络模式,用法类似于 Docke 客户端的 --net 选项,格式为:service:[service name],可以指定使用服务或者容器的网络。 |
extra_hosts | 域名映射 |
重点区别links,depends_on,extra_hosts,networks
depends_on:重点是依赖关系
links:它允许一个容器能够访问另一个容器的网络连接信息(如IP地址和端口),微服务中常用到gateway需要连接到nacos中,ip:port
extra_hosts:相当于域名/服务名和ip的映射
networks:同意网络容器间能胡同域名/服务名
6 docker轻量级可视化工具portainer(轻量级监控)
安装
docker pull portainer/portainer
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /zzq/portainer_data:/data --privileged=true portainer/portainer
访问http://172.16.64.21:8088/,
7 docker容器监控之CAdvisor+influxDB+granfana(重量级监控)
查看docker使用情况
docker stats
在/zzq/cig中编排三剑客CAdvisor+influxDB+granfana一件部署脚本
version: '3.1'
volumes:
grafana_data: {}
services:
influxdb:
image: tutum/influxdb:0.9
restart: always
environment:
- PRE_CREATE_DB=cadvisor
ports:
- "8083:8083"
- "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
restart: always
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
grafana:
user: "104"
image: grafana/grafana
user: "104"
restart: always
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
启动三剑客
docker-compose up -d
查看三个服务容器是否启动
收集服务CAdvisor: http://ip:8080/
存储服务inifluxdb: http://ip:8083/
展现服务grafana: http://ip:3000
配置数据源