docker run -p 3307:3306 \
-v /bf/mysql-master/log:/var/log/mysql \
-v /bf/mysql-master/data:/var/lib/mysql \
-v /bf/mysql-master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql-master \
-d mysql:5.7
docker run -p 3308:3306 \
-v /bf/mysql-slave/log:/var/log/mysql \
-v /bf/mysql-slave/data:/var/lib/mysql \
-v /bf/mysql-slave/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql-slave \
-d mysql:5.7
master节点编辑my.cnf配置文件
[mysqld]
server_id=101
binlog-ignore-db=mysql
log-bin=mall-mysql-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
docker exec -it mysql-master /bin/bash
mysql -uroot -p
create user 'slave'@'%' identified by '123456';
grant replication slave, replication client on *.* to 'slave'@'%';
docker restart 59931682b155
docker ps
docker exec -it mysql-slave /bin/bash
mysql -uroot -p
change master to master_host='192.168.17.128',master_user='slave',master_password='123456',master_port=3307,master_log_file='mall-mysql-bin.000001',master_log_pos=617,master_connect_retry=30;
show slave status \G;
slave_io_running 和 slave_sql_running 为 NO
slave_io_running 和 slave_sql_running 为 NO变为 YES
操作数据库工具连接主库,并写入记录,切换到从库发现对应数据已经同步。
经过测试,如果不按照初级篇修改对应编码,在centos上会出现乱码
所以我这里配置文件根据初级篇做了修改,完全版本如下所示。
[client]
default_character_set=utf8
[mysqld]
collation_server=utf8_general_ci
character_set_server=utf8
server_id=101
binlog-ignore-db=mysql
log-bin=mall-mysql-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
哈希取余分区
缺点:扩缩容问题
一致性哈希算法分区
缺点:数据倾斜问题,节点太少时,节点分布不均匀,
哈希槽分区
yibaoti
数据 -> 槽 -> redis
docker run -d \
--name redis-node-1 \
--net host \
--privileged=true \
-v /data/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 /data/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 /data/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 /data/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 /data/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 /data/redis/share/redis-node-6:/data \
redis:6.0.8 \
--cluster-enabled yes \
--appendonly yes \
--port 6386
redis-cli --cluster create
192.168.17.128:6381
192.168.17.128:6382
192.168.17.128:6383
192.168.17.128:6384
192.168.17.128:6385
192.168.17.128:6386
--cluster-replicas 1
redis-cli -p 6381
cluster nodes
单机方式连接6381节点
k1和k4所占用槽位超过了6381所分配的 5460 范围,所以存储失败
redis-cli -p 6381 -c
redis-cli --cluster check 192.168.17.128:6381
关闭1号节点,观察集群主从状态。
可以发现可以顺利取出之前存的4个key
将node1启动回来,发现主从关系没有重新改变,从节点升为主节点,之前的主节点变为从节点
操作步骤
docker run -d \
--name redis-node-7 \
--net host \
--privileged=true \
-v /data/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 /data/redis/share/redis-node-8:/data \
redis:6.0.8 \
--cluster-enabled yes \
--appendonly yes \
--port 6388
redis-cli --cluster add-node 192.168.17.128:6387 192.168.17.128:6381
redis-cli --cluster check 192.168.17.128:6381
redis-cli --cluster reshard 192.168.17.128:6381
redis-cli --cluster check 192.168.17.128:6381
redis-cli --cluster add-node 192.168.17.128:6388 192.168.17.128:6387 --cluster-slave --cluster-master-id a03199891da62047b7bbc3f6889acb655f468356
redis-cli --cluster check 192.168.17.128:6381
操作步骤
redis-cli --cluster del-node 192.168.17.128:6388 90eecc6d32f52c19e460979eeb6c32194bcfeb8f
本例将6387的slot全部分给6382节点
redis-cli --cluster reshard 192.168.17.128:6381
查看集群状态
redis-cli --cluster del-node 192.168.17.128:6387 a03199891da62047b7bbc3f6889acb655f468356
一定要注意 $ 不要是#,否则java -version可能会出不来
一定要注意 $ 不要是#,否则java -version可能会出不来
一定要注意 $ 不要是#,否则java -version可能会出不来
FROM centos
MAINTAINER lzy<1033649766@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
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 "success ----- ok "
CMD /bin/bash
docker build -t centosjdk8:1.1 .
docker run -it b6c2b0d80d28 /bin/bash
第一个坑 由于Dockerfile比照视频手打的,所以将 $ 打成了 # ,java -version配置失败
第二个坑 虚拟机复制的jdk文件大小只有 2.5M,而源文件有180M,因而报错,一定要查看复制过来的文件大小是否缺失。
failed to copy files: Error processing tar file(exit status 1): unexpected EOF
通过Dockerfile产生一个虚悬镜像,虚悬镜像是错误的,理应删除
运行后产生虚悬镜像
虚悬镜像的查看和删除
docker image ls -f dangling=true
docker image prune
编写一个微服务,并使用maven打包成jar包,测试一下能否启动
Dockerfile文件内容
FROM java:8
MAINTAINER lzy
VOLUME /tmp
ADD mic-io-0.0.1-SNAPSHOT.jar a.jar
ENTRYPOINT ["java","-jar","a.jar"]
EXPOSE 8080
docker build -t aaa:1.1 .
docker run -d -p 8080:8080 b73f7d27485e
原因Dockerfile编写的时候多加了 ’
Docker Error :Invalid or corrupt jarfile .jar
产生原因: 虚拟机导入jar包大小不正确,导致缺失文件,重新导入后即可。
docker network ls
容器间的互联和通信以及端口映射,容器ip变动的时候通过服务名直接通信而不是ip
docker network inspect bridge
docker network inspect host
docker network inspect none
docker network inspect container
目的: 一键启动N个容器实例或关闭N个实例,配置不同容器间的调用关系。
compose file
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
service部分代码如下
@Service
public class DockerUserServiceImpl extends ServiceImpl<DockerUserMapper, DockerUser> implements DockerUserService {
public static final String PREFIX = "user:";
private final DockerUserMapper dockerUserMapper;
private final RedisTemplate redisTemplate;
public DockerUserServiceImpl(DockerUserMapper dockerUserMapper, RedisTemplate redisTemplate) {
this.dockerUserMapper = dockerUserMapper;
this.redisTemplate = redisTemplate;
}
@Override
public void addUser() {
DockerUser dockerUser = new DockerUser();
dockerUser.setAge(10);
dockerUser.setAddress("sdsdadsad");
dockerUser.setName("zzx");
dockerUser.setSex(1);
int i = dockerUserMapper.insert(dockerUser);
if (i > 0) {
dockerUser = dockerUserMapper.selectById(dockerUser.getId());
String key = PREFIX + dockerUser.getId();
redisTemplate.opsForValue().set(key, dockerUser);
}
}
@Override
public DockerUser findUserById(Integer id) {
DockerUser user = null;
String key = PREFIX + id;
user = (DockerUser) redisTemplate.opsForValue().get(key);
if (user == null) {
user = dockerUserMapper.selectById(id);
if (user == null) {
return user;
}
redisTemplate.opsForValue().set("key", user);
}
return user;
}
}
配置文件注意要把mysql和redis的路径更换为虚拟机ip
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
server:
port: 8080
spring:
application:
name: micDocker
datasource:
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://localhost:3306/demo01?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
url: jdbc:mysql://192.168.17.128:3306/demo01?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
redis:
database: 0
# host: 192.168.17.128
host: 192.168.17.128
lettuce:
pool:
max-active: 8
max-idle: 8
max-wait: -1
min-idle: 0
password:
port: 6379
timeout: 30000
操作步骤:
注意jar包大小要和容器外保持一致。
后台启动 redis、mysql、jar 三个容器,查看是否启动成功
测试容器8080能否访问
插入用户报错,查看容器日志 docker logs + 容器id。
将redis中protected_mode改为no后重启实例
mysql成功插入数据
测试 redis 成功获取
数据库记录
测试获取用户接口
根据日志,没有select记录,成功在redis中获取用户信息。
总结 当微服务变多,手动启动容器的难度就会加大,同时也会增加出错概率,这个时候使用compose进行一文件多容器的启动和停止就十分的有必要
docker-compose.yml文件内容如图所示
version: "3"
services:
microService:
image: yyds:1.0
container_name: ms01
ports:
- "8080:8080"
volumes:
- /bf/usecmps/microService:/data
networks:
- lzy_net
depends_on:
- redis
- mysql
redis:
image: redis:6.2.6
ports:
- "6379:6379"
volumes:
- /bf/usecmps/redis/redis.conf:/etc/redis/redis.conf
- /bf/usecmps/redis/data:/data
networks:
- lzy_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: 'demo01'
MYSQL_USER: 'admin'
MYSQL_PASSWORD: '123456'
ports:
- "3306:3306"
volumes:
- /bf/usecmps/mysql/db:/var/lib/mysql
- /bf/usecmps/mysql/conf/my.cnf:/etc/my.cnf
- /bf/usecmps/mysql/init:/docker-entrypoint-initdb.d
networks:
- lzy_net
command: --default-authentication-plugin=mysql_native_password
networks:
lzy_net:
compose文件检查
第一个原因: version拼写错误
第二个原因: redis挂载的容器数据卷重复
第三个: 无输出代表正常
启动redis和mysql之前,把redis.conf和my.cnf文件复制到相应位置,不然会启动会创建目录
redis.conf和my.cnf目录,虽然不会报错,但是读取不到配置文件。
启动命令如下
docker-compose up -d
访问swagger测试insert
进入redis容器内容,尝试获取user:2的值
测试查询接口,可以看到成功获取到id=3的用户
通过这个命令可以查看日志
docker-compose logs microService
通过查看日志得出查询id=3走的redis,测试成功
docker-compose -h #查看帮助
docker-compose up
docker-compose up -d #后台启动
docker-compose down
docker-compose exec +服务id
docker-compose ps
docker-compose top
docker-compose logs + 服务id
docker-compose config
docker-compose config-q
docker-compose restart
docker-compose start
docker-compose stop
–restart=always 参数补充说明,docker重启后容器仍然存活
-------https
docker run -d -p 8000:8000 -p 9443:9443 --name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:2.11.0
------ http
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:2.11.0
docker system df
查看容器状态,存在问题,只能查看实时数据,没有以往数据,不适合大公司的使用。
docker stats
企业上云之容器监控利器-cAvisor
InfluxDB(时序数据库),常用的一种使用场景:监控数据统计 influxDB官网
可视化监控指标展示工具-Grafana https://grafana.com/
docker-compose.yml
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:
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 config -q
docker-compose up
启动效果如图所示
使用portainer查看启动状态
8083 influxdb
8080 cadvisor
3000 grafana 默认账号密码 admin/admin
配置grafana数据源
保存并测试
添加面板
配置完成后面板如图所示