ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Docker 高级篇

2022-01-22 17:02:55  阅读:193  来源: 互联网

标签:容器 -- redis 高级 mysql docker Docker


文章目录

Docker 高级篇

一、安装Mysql主从复制

1.1 新建主机 3307

docker run -p 3307:3306 --name mysql-master \
-v C:/Users/jonk/mysql/mysql-master/log:/var/log/mysql \
-v C:/Users/jonk/mysql/mysql-master/data:/var/lib/mysql \
-v C:/Users/jonk/mysql/mysql-master/conf:/etc/mysql \
-v C:/Users/jonk/mysql/mysql-master/mysql-files:/var/lib/mysql-files \
-e MYSQL_ROOT_PASSWORD=root  \
-d mysql

注意:需要将目录放在当前用户目录下,这样docker 挂在目录之后就不是root权限了。

否则会发现:

[Warning] World-writable config file ‘/etc/mysql/conf.d/docker.cnf’ is ignored’

解决方法:

chmod 644 /etc/mysql/*.cnf

image-20220116171044868

1.2. 新建my.cnf

cd C:/Users/jonk/mysql/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

docker exec -it mysql-master /bin/bash
mysql -uroot -p

image-20220116171219948

1.5 添加数据同步用户

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

1.6 新建从机3308

docker run -p 3308:3306 --name mysql-slave \
-v C:/Users/jonk/mysql/mysql-slave/log:/var/log/mysql \
-v C:/Users/jonk/mysql/mysql-slave/data:/var/lib/mysql \
-v C:/Users/jonk/mysql/mysql-slave/conf:/etc/mysql \
-v C:/Users/jonk/mysql/mysql-slave/mysql-files:/var/lib/mysql-files \
-e MYSQL_ROOT_PASSWORD=root  \
-d mysql

1.7 新建从机配置文件my.cnf

cd C:/Users/jonk/mysql/mysql-slave/conf
[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配置中继日志

添加完配置文件之后重启下服务

docker restart mysql-slave

image-20220116171837820

# 显示mysql 主机 状态
show master status;

image-20220116171943054

1.8 进入从机

docker exec -it mysql-slave /bin/bash
mysql -uroot -p

1.9 配置从服务器

mysql-slave 中执行命令

change master to master_host='192.168.3.80', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000003', master_log_pos=710, master_connect_retry=30;
  • master_host:主数据库的IP地址(Docker容器宿主机ip);
  • master_port:主数据库的运行端口;
  • master_user:在主数据库创建的用于同步数据的用户账号;
  • master_password:在主数据库创建的用于同步数据的用户密码;
  • master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
  • master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
  • master_connect_retry:连接失败重试的时间间隔,单位为秒。

查看从机状态:

mysql>  show slave sataus;

image-20220116172906169

在从数据库中开启主从同步:

mysql > start slave;

如果出现错误:

Authentication plugin ‘caching_sha2_password’ reported error: Authentication requires secure connection.

image-20220116173620685

那么在主机执行:

mysqll> ALTER USER slave@'%' IDENTIFIED WITH mysql_native_password BY '123456';
mysqll> FLUSH PRIVILEGES;

如果出现:

Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).

image-20220116174024496

mysql 出于安全考虑,不允许同一个网络中service_id 一致;

二、Redis 集群搭建

哈希槽分区

1 为什么出现

哈希槽实质就是一个数组,数组[0,2^14 -1]形成hash slot空间。

2 能干什么
解决均匀分配的问题,在数据和节点之间又加入了一层,把这层称为哈希槽(slot),用于管理数据和节点之间的关系,现在就相当于节点上放的是槽,槽里放的是数据。

槽解决的是粒度问题,相当于把粒度变大了,这样便于数据移动。
哈希解决的是映射问题,使用key的哈希值来计算所在的槽,便于数据分配。

3 多少个hash槽
一个集群只能有16384个槽,编号0-16383(0-2^14-1)。这些槽会分配给集群中的所有主节点,分配策略没有要求。可以指定哪些编号的槽分配给哪个主节点。集群会记录节点和槽的对应关系。解决了节点和槽的关系后,接下来就需要对key求哈希值,然后对16384取余,余数是几key就落入对应的槽里。slot = CRC16(key) % 16384。以槽为单位移动数据,因为槽的数目是固定的,处理起来比较容易,这样数据移动问题就解决了。

Redis 集群中内置了 16384 个哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,也就是映射到某个节点上。如下代码,key之A 、B在Node2, key之C落在Node3上

搭建三主三从Redis集群

  1. 启动集群

    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
    

    image-20220116190542036

  2. 构建主从关系

    # 进入容器
    docker exec -it redis-node-1 /bin/bash
    
    # 构建主从关系
    redis-cli --cluster create 192.168.111.147:6381 192.168.111.147:6382 192.168.111.147:6383 192.168.111.147:6384 192.168.111.147:6385 192.168.111.147:6386 --cluster-replicas 1
    
    # 查看集群状态
    redis-cli> cluster info
    redis-cli> cluster nodes
    
    # 查看集群信息
    redis-cli --cluster check 192.168.111.147:6381
    
    # 新增集群节点
    redis-cli --cluster add-node 自己实际IP地址:6387 自己实际IP地址:6381
    # 6387 就是将要作为master新增节点
    # 6381 就是原来集群节点里面的领路人,相当于6387拜拜6381的码头从而找到组织加入集群
    
    # 重新分配槽
    redis-cli --cluster reshard 192.168.111.147:6381
    
    # 添加从节点
    redis-cli --cluster add-node 192.168.111.147:6388 192.168.111.147:6387 --cluster-slave --cluster-master-id e4781f644d4a4e4d4b4d107157b9ba8144631451-------这个是6387的编号,按照自己实际情况
    
    # 集群删除节点
    redis-cli --cluster del-node ip:从机端口 从机6388节点ID
    # 例如:redis-cli --cluster del-node 192.168.111.147:6388 5d149074b7e57b802287d1797a874ed7a1a284a8
    
    # 重新分配槽
    redis-cli --cluster reshard 192.168.111.147:6381
    

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

三、DockerFie 解析

Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。

官网:https://docs.docker.com/engine/reference/builder/

1. Dockerfile内容基础知识

1:每条保留字指令都必须为大写字母且后面要跟随至少一个参数

2:指令按照从上到下,顺序执行

3:#表示注释

4:每条指令都会创建一个新的镜像层并对镜像进行提交

2. Docker执行Dockerfile的大致流程

(1)docker从基础镜像运行一个容器

(2)执行一条指令并对容器作出修改

(3)执行类似docker commit的操作提交一个新的镜像层

(4)docker再基于刚提交的镜像运行一个新容器

(5)执行dockerfile中的下一条指令直到所有指令都执行完成

从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,

  • Dockerfile是软件的原材料
  • Docker镜像是软件的交付品
  • Docker容器则可以认为是软件镜像的运行态,也即依照镜像运行的容器实例
    Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。

1 Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;

2 Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时会真正开始提供服务;

3 Docker容器,容器是直接提供服务的。

3. DockerFile常用保留字指令

  1. FROM 基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from

  2. MAINTAINER 镜像维护者的姓名和邮箱地址

  3. RUN 容器构建时需要运行的命令

    shell格式: RUN yum -y install vim

    image-20220116195459137

    exec格式:

    image-20220116195513643

  4. EXPOSE:当前容器对外暴露出的端口

  5. WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点

  6. USER:指定该镜像以什么样的用户去执行,如果都不指定,默认是root

  7. ENV:用来在构建镜像过程中设置环境变量

    这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;
    也可以在其它指令中直接使用这些环境变量;

  8. ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包;

  9. COPY:类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置

  10. VOLUME:容器数据卷,用于数据保存和持久化工作

  11. CMD:指定容器启动后的要干的事情

    Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换;

    CMD是在docker run 时运行;

    RUN是在 docker build时运行。

  12. ENTRYPOINT:也是用来指定一个容器启动时要运行的命令

    类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序;

    ENTRYPOINT可以和CMD一起用,一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。

    当指定了ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行其命令而是将CMD的内容作为参数传递给ENTRYPOINT指令,他两个组合会变成 “CMD”

    image-20220116200027737

4、自定义CentOS Dockerfile

FROM centos
MAINTAINER zzyy<zzyybs@126.com>
 
ENV MYPATH /usr/local
WORKDIR $MYPATH
 
#安装vim编辑器
RUN yum -y install vim

#安装ifconfig命令查看网络IP
RUN yum -y install net-tools

#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java

#ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/

#配置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 builld -t 新镜像名字:TAG .

5、虚悬镜像

虚悬镜像是什么?

仓库名、标签都是的镜像,俗称dangling image

# 1. vim Dockerfile
from ubuntu
CMD echo 'action is success'

# 2 docker build .

image-20220116203422976

查看虚悬镜像:

docker image ls -f dangling=true

删除虚悬镜像:

docker image prune

四、Docker 微服务

  1. 生成Dockerfile文件

    # 基础镜像使用java
    FROM java:8
    # 作者
    MAINTAINER zzyy
    # VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
    VOLUME /tmp
    # 将jar包添加到容器中并更名为zzyy_docker.jar
    ADD docker_boot-0.0.1-SNAPSHOT.jar zzyy_docker.jar
    # 运行jar包
    RUN bash -c 'touch /zzyy_docker.jar'
    ENTRYPOINT ["java","-jar","/zzyy_docker.jar"]
    #暴露6001端口作为微服务
    EXPOSE 6001
    
  2. 构建镜像

    docker build -t zzyy_docker:1.6 .
    
  3. 运行镜像

    docker run -d -p 6001:6001 镜像Id
    

五、Docker 网络

默认三大网络模式

docker network ls

image-20220116205350283

常用命令

image-20220116205547212

docker 网络解决问题?

容器间的互联和通信以及端口映射;

容器IP变动时候可以通过服务名直接网络通信而不受到影响

docker网络模式

image-20220116205951103

  • bridge模式:使用–network bridge指定,默认使用docker0
  • host模式:使用–network host指定
  • none模式:使用–network none指定
  • container模式:使用–network container:NAME或者容器ID指定

docker容器内部的ip是有可能会发生改变的

1. bridge模式

Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信。

# 查看 bridge 网络的详细信息,并通过 grep 获取名称项
docker network inspect bridge | grep name

image-20220116234214133

image-20220116234227589

1 Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。

2 docker run 的时候,没有指定network的话默认使用的网桥模式就是bridge,使用的就是docker0。在宿主机ifconfig,就可以看到docker0和自己create的network(后面讲)eth0,eth1,eth2……代表网卡一,网卡二,网卡三……,lo代表127.0.0.1,即localhost,inet addr用来表示网卡的IP地址

3 网桥docker0创建一对对等虚拟设备接口一个叫veth,另一个叫eth0,成对匹配。
3.1 整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair);
3.2 每个容器实例内部也有一块网卡,每个接口叫eth0;
3.3 docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。
通过上述,将宿主机上的所有容器都连接到这个内部网络上,两个容器在同一个网络下,会从这个网关下各自拿到分配的ip,此时两个容器的网络是互通的。

image-20220116234316369

2. Host模式

直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行NAT 转换。

容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口。

image-20220117230200406

docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8
# 正确
docker run -d              --network host --name tomcat83 billygoo/tomcat8-jdk8

问题:
docke启动时总是遇见标题中的警告
原因:
docker启动时指定–network=host或-net=host,如果还指定了-p映射端口,那这个时候就会有此警告,
并且通过-p设置的参数将不会起到任何作用,端口号会以主机端口号为主,重复时则递增。
解决:
解决的办法就是使用docker的其他网络模式,例如–network=bridge,这样就可以解决问题,或者直接无视。。。。O(∩_∩)O哈哈~

3. None模式

在none模式下,并不为Docker容器进行任何网络配置。
也就是说,这个Docker容器没有网卡、IP、路由等信息,只有一个lo需要我们自己为Docker容器添加网卡、配置IP等。

docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8

进入容器内部查看

image-20220117230822230

在容器外部查看

image-20220117230854143

4. container⽹络模式

新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。

image-20220117230953624

docker run -d -p 8085:8080                                     --name tomcat85 billygoo/tomcat8-jdk8
docker run -d -p 8086:8080 --network container:tomcat85        --name tomcat86 billygoo/tomcat8-jdk8

image-20220117231046372

相当于tomcat86和tomcat85公用同一个ip同一个端口,导致端口冲突本案例用tomcat演示不合适。。。演示坑。。。。。。o(╥﹏╥)o

5. 自定义网络

案例:

docker run -d -p 8081:8080   --name tomcat81 billygoo/tomcat8-jdk8

docker run -d -p 8082:8080   --name tomcat82 billygoo/tomcat8-jdk8

上述成功启动并用docker exec进入各自容器实例内部

image-20220117231709841
image-20220117231719270

按照服务名ping结果???

image-20220117231741179
image-20220117231747239

自定义桥接网络,自定义网络默认使用的是桥接网络bridge

新建自定义网络
image-20220117231924162

新建容器加入上一步新建的自定义网络

docker run -d -p 8081:8080 --network zzyy_network  --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --network zzyy_network  --name tomcat82 billygoo/tomcat8-jdk8

互相ping测试??

image-20220117232031941
image-20220117232038812

说明:

  1. 自定义网络本身就维护好了主机名和ip的对应关系(ip和域名都能通)

六、Docker-compose 容器编排

Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器;

docker建议我们每一个容器中只运行一个服务,因为docker容器本身占用资源极少,所以最好是将每个服务单独的分割开来但是这样我们又面临了一个问题?

如果我需要同时部署好多个服务,难道要每个服务单独写Dockerfile然后在构建镜像,构建容器,这样累都累死了,所以docker官方给我们提供了docker-compose多服务部署的工具

例如要实现一个Web微服务项目,除了Web服务容器本身,往往还需要再加上后端的数据库mysql服务容器,redis服务器,注册中心eureka,甚至还包括负载均衡容器等等。。。。。。

Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。Docker-Compose 解决了容器与容器之间如何管理编排的问题。

官网:https://docs.docker.com/compose/compose-file/compose-file-v3/

核心:

  1. 文件: docker-compose.yml

  2. 要素:服务、工程

    服务:一个个应用容器实例,比如订单微服务、库存微服务、mysql容器、nginx容器或者redis容器

    工程:由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

Compose常用命令

# 查看帮助
docker-compose -h 
# 启动所有docker-compose服务
docker-compose up    
# 启动所有docker-compose服务并后台运行
docker-compose up -d      
# 停止并删除容器、网络、卷、镜像。
docker-compose down         
# 进入容器实例内部  docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
docker-compose exec  yml里面的服务id     
# 展示当前docker-compose编排过的运行的所有容器
docker-compose ps            
# 展示当前docker-compose编排过的容器进程
docker-compose top             
# 查看容器输出日志
docker-compose logs  yml里面的服务id   
 # 检查配置
docker-compose config          
# 检查配置,有问题才有输出
docker-compose config -q     
# 重启服务
docker-compose restart       
# 启动服务
docker-compose start       
# 停止服务
docker-compose stop                   

Compose编排微服务

官网地址:Overview of Docker Compose | Docker Documentation

version: "3"
 
services:
  microService:
    image: zzyy_docker:1.6
    container_name: ms01
    ports:
      - "6001:6001"
    volumes:
      - /app/microService:/data
    networks: 
      - atguigu_net 
    depends_on: 
      - redis
      - mysql
 
  redis:
    image: redis:6.0.8
    ports:
      - "6379:6379"
    volumes:
      - /app/redis/redis.conf:/etc/redis/redis.conf
      - /app/redis/data:/data
    networks: 
      - atguigu_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: 'db2021'
      MYSQL_USER: 'zzyy'
      MYSQL_PASSWORD: 'zzyy123'
    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:
      - atguigu_net
    command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
 
networks: 
   atguigu_net: 

七、Docker轻量级可视化工具Portainer

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

官网: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

访问:

http://127.0.0.1:9000/#/init/admin

第一次登录,进入设置密码

image-20220122161630664image-20220122161917627

image-20220122161929619

八、Docker容器监控之 CAdvisor + InfluxDB + Granfana

CAdvisor监控收集+InfluxDB存储数据+Granfana展示图表

image-20220122163123540

image-20220122163155524

image-20220122163213394

image-20220122163502224

image-20220122163540454

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

浏览cAdvisor收集服务,http://ip:8080/

浏览influxdb存储服务,http://ip:8083/

浏览grafana展现服务,http://ip:3000

标签:容器,--,redis,高级,mysql,docker,Docker
来源: https://blog.csdn.net/afgasdg/article/details/122639879

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有