目录
2.6 CAdvisor+InfluxDB+Granfana
前言
1.1 问题
docker部署固然越来越简单,但是当系统拆分出N多个子系统、缓存、数据库、消息等各种中间件儿,docker部署起来也变得麻烦,有没有一种方式可以一键部署和管理?
1.2 解决
compose容器编排应运而生,简单说就是将你所需要部署的docker,在这个文件描述清楚,然后执行如下命令:
docker-compose up -d
docker 会按照我们定义的方式进行部署,达到一键管理 。
1.3 学习计划
docker network:容器间需要网络通信,搞清楚docker 的通信机制
docker compose:基本语法
docker 监控:图形化工具
测试工程Git地址:docker-maven 实战项目
开始
2.1 docker network 运行机制
2.1.1 介绍
启动docker
# 启动docker systemctl start docker
docker启动后,网络情况
解释:docker 进程启动后,会分配一个docker0的默认桥接模式的网桥,
所有docker容器都会在这个网桥上进行通信
加深理解:
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,此时两个容器的网络是互通的。
2.1.2 存在啥问题
自动分配:每个运行的docker容器内部ip是由docker0自动分配,ip不固定。
假如我的一个web项目调用mysql容器,mysql容器ip不固定,我该如何连接myql数据库?
2.2 docker network 学习
2.2.1 解决问题
容器间的互联和通信以及端口映射
容器IP变动时候可以通过服务名直接网络通信而不受到影响
2.2.2 介绍
1.默认的网络模式
docker network ls
2.会出现如下三种模式,(我自己新增啦一个)
网络模式 | 简介 | 使用方式 |
bridge | 为每一个容器分配、设置IP等,并将容器连接到一个 虚拟网桥,默认为该模式 |
|
host | 容器将不会虚拟出自己的网卡、配置自己的IP等,而是使用宿主机的IP和端口 |
|
none | 容器有独立的 Network namespace,但并没有对齐进行任何网络设置,如分配 和 网桥连接、IP等 |
|
container | 新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等 |
|
3.查看容器的网络模式
# 通过inspect获取容器信息,最后20行即为容器的网络模式信息
docker inspect 容器ID | tail -n 20
2.2.3 网络模式
2.2.3.1 docker0
Docker 服务默认会创建一个
docker0
网桥默认指定了
docker0
接口的IP地址和子网掩码,让主机和容器之间可以通过网桥互相通信# 查看bridge信息 docker network inspect bridge | grep name
2.2.3.2 bridge
详情看上图解析
bridge模式:使用--network bridge指定,默认使用docker0
2.2.3.3 host
直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行 NAT 转换。
容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network space。
容器将不会虚拟出自己的网卡,而是直接使用宿主机的 IP 和端口。
host模式:使用--network host指定
2.2.3.4 none
禁用网络功能
在
none
模式下,并不为docker容器进行任何网络配置。进入容器内,使用
ip addr
查看网卡信 息,只能看到lo
(本地回环网络127.0.0.1
网卡)。none模式:使用--network none指定
2.2.3.5 container
新建的容器和已经存在的一个容器共享网络IP配置,而不是和宿主机共享。
新创建的容器不会创建自己的网卡、IP,而是和一个指定的容器共享IP、端口范围。
两个容器除了网络共享,其他的如文件系统、进程列表依然是隔离的。
container模式:使用--network container:NAME或者容器ID指定
# Alpine操作系统是一个面向安全的轻型 Linux发行版
docker run -it --name alpine /bin/sh
# 指定和 alpine1 容器共享网络
docker run -it --network container:alpine1 --name alpine2 alpine /bin/sh
此时使用
ip addr
查看两台容器的网络,会发现两台容器的eth0
网卡内的IP等信息完全相同。如果关掉了
alpine1
容器,因为alpine2
的网络使用的alpine1
共享网络,所以关掉alpin1
后,alpine2
的eth0
网卡也随之消失了。
2.2.4 自定义网络
1.解决问题
容器间的互联和通信以及端口映射。
容器 IP 变动时候可以通过服务名直接网络通信而不受影响。
(类似Eureka,通过服务名直接互相通信,而不是写死IP地址)。
2.自定义桥接网络(自定义网络默认使用的是桥接网络
bridge
)创建一个网络
# 创建一个网络 docker network create asia-net
查看网络列表
docker network ls
创建容器时,指定加入我们自定义的网络中
docker run -d -p 8081:8080 --network asia-net--name tomcat1 tomcat:8.5-jdk8-corretto docker run -d -p 8082:8080 --network asia-net--name tomcat2 tomcat:8.5-jdk8-corretto
测试结果
# 安装ifconfig命令 yum install -y net-tools # 安装ip addr命令 yum install -y iproute # 安装ping命令 yum install -y iputils # 直接ping容器名,不需要ping IP地址 ping tomcat2
问题结论
自定义网络本身就维护好了主机名和ip的对应关系(ip和域名都能通)
3. link连接(已标记过时)
# 启动一台mysql容器 # --name 为容器指定一个别名 docker run --name mysql-matomo -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.28 # 启动另一个容器,通过--link连接到mysql容器 # --link 容器名称:本容器连接对方时的别名 docker run -d -p 8888:80 --link mysql-matomo:db --name matomo matomo:4.9.0 # 此时,在matomo容器中,便可以通过 db 这个hostname连接到mysql-matomo容器,而无须再通过ip # 连接地址:db:3306
2.3 docker-compose容器编排
2.3.1 概念
Docker-Compose是Docker官方的开源项目, 负责实现对Docker容器集群的快速编排。
Docker-Compose
可以管理多个Docker容器组成一个应用。 需要定义一个yaml格式的配置文件docker-compose.yml
,配置好多个容器之间的调用关系,然后只需要一个命令就能同时启动/关闭这些容器。Docker建议我们每个容器中只运行一个服务,因为Docker容器本身占用资源极少,所以最好是将每个服务单独的分割开来。但是如果我们需要同时部署多个服务,每个服务单独构建镜像构建容器就会比较麻烦。所以 Docker 官方推出了
docker-compose
多服务部署的工具。Compose允许用户通过一个单独的
docker-compose.yml
模板文件来定义一组相关联的应用容器为一个项目(project
)。可以很容易的用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。核心概念:
- 服务(
service
):一个个应用容器实例(每一个docker容器)
- 工程(
project
):由一组关联的应用容器实例组成的一个完整业务单元,在docker-compose.yml
中定义(就是一个个关联的服务构成了一个工程)
2.3.2 配置环境
基本语法:官网基本语法介绍
安装:
# 例如从github下载 2.5.0版本的docker-compose # 下载下来的文件放到 /usr/local/bin目录下,命名为 docker-compose curl -L https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose # 添加权限 chmod +x /usr/local/bin/docker-compose # 验证 docker-compose version
2.3.3 步骤
Compose使用的三个步骤:
编写 Dockerfile 定义各个应用容器,并构建出对应的镜像文件
编写
docker-compose.yml
,定义一个完整的业务单元,安排好整体应用中的各个容器服务
执行命令,其创建并运行整个应用程序,完成一键部署上线
docker-compose up
2.3.4 基本命令
# 查看帮助 docker-compose -h # 启动 docker-compose up # 后台运行 docker-compose up -d # 停止并删除容器、网络、卷、镜像:(类似 docker stop + docker rm) docker-compose down # 进入容器实例内部 docker-compose exec <yml里面的服务id> /bin/bash # 展示当前docker-compose编排过的运行的所有容器: docker-compose ps # 展示当前docker-compose编排过的运行的所有容器: docker-compose ps # 展示当前docker-compose编排过的容器进程: docker-compose top # 查看容器输出日志 docker-compose log <yml里面的服务id> # 检查配置 docker-compose config # 有问题才输出 docker-compose config -q # 重启工程 docker-compose restart # 启动工程(类似 docker start) docker-compose start # 停止工程 docker-compose stop
2.4 compose实战
准备一个maven项目,maven工程配置了redis和mysql,
用docker-compose方式,将maven工程、mysql、redis一键部署
2.4.1 分析
1.maven项目制作镜像
docker之Dockerfile文章我们制作了一个含jdk环境的镜像:mycentosjava8
将maven工程打成jar包 :docker_maven.jar
mycentosjava8 +docker_mavenar = new images(docker-boot)
( docker之Dockerfile文章 讲述具体的实现过程)
2.准备一个MySQL镜像(5.7)
docker pull mysql:5.7
3.准备一个redis镜像
docker pull redis
4.镜像之间的通信问题 --network 可以用上了
docker network -create ms01-net
注意:
这里maven 工程我放入git,有兴趣可以自己拉下来体验体验打镜像
Git 地址 docker-maven
这里要把Dockerfile和jar包放入同一个目录 然后执行docker build -t 命令,(脚本放入git)
# 基础镜像(之前创建好的镜像,内含有jdk环境) FROM mycentosjava8:1.0 # 定义作者 MAINTAINER wangtc@15299095124@163.com # 定义环境变量 ENV base_path /usr/local/java-maven # 定义进入目录 WORKDIR $base_path # 执行命令 将jar包考入工程 这里不解压 COPY . $base_path/ # 执行命令 进入工程目录 RUN cd $base_path/ EXPOSE 8081 # 运行工程命令 ENTRYPOINT ["java","-jar","./docker_maven-0.0.1-SNAPSHOT.jar"]
查看镜像 准备工作就绪
2.4.2 开始
如果有docker基础 这个地方也能看懂,
docker run 命令后面的参数用yml文件的形式输出而已
vi cocker-compose.yml (脚本放入git)
# docker-compose文件版本号 version: "3" # 配置各个容器服务 services: microService: image: docker-boot:1.0 container_name: ms01 # 容器名称,如果不指定,会生成一个服务名加上前缀的容器名 ports: - "6001:6001" volumes: - /app/microService:/data networks: - ms01_net depends_on: # 配置该容器服务所依赖的容器服务 - redis - mysql redis: image: redis ports: - "6379:6379" volumes: - /app/redis/redis.conf:/etc/redis/redis.conf - /app/redis/data:/data networks: - ms01_net command: redis-server /etc/redis/redis.conf mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: 'root' MYSQL_ALLOW_EMPTY_PASSWORD: 'no' MYSQL_DATABASE: 'db2025' MYSQL_USER: 'master' MYSQL_PASSWORD: 'root' 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: - ms01_net command: --default-authentication-plugin=mysql_native_password # 解决外部无法访问 networks: # 创建 ms01_net 网桥网络 ms01_net:
结果如下 先检查格式 没问题就执行compose
2.4.3 测试
1.输入Swagger UI地址 一般是:http://localhost:你的微服务端口/swagger-ui.html#/
2.测试接口 数据库存在相应数据,则算部署成功,
msyql:
redis :
3.如果报错 执行docker logs -f 容器 查看实时日志 建表语句放入Git,自行下载建表
2.5 容器监控(轻量级)
2.5.1 简介
Portainer是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机环境和集群环境。
Portainer分为开源社区版(CE版)和商用版(BE版/EE版)。
2.5.1 下载
官网 :Kubernetes and Docker Container Management Software
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
第一次登录需创建admin,访问地址:xxx.xxx.xxx.xxx:9000
设置admin用户和密码后首次登陆
选择local选项卡后本地docker详细信息展示
上一步的图形展示,能想得起对应命令吗?
2.6 CAdvisor+InfluxDB+Granfana
重量级监控,了解即可,反正我没学
2.6.1 CIG
通过
docker stats
命令可以很方便的查看当前宿主机上所有容器的CPU、内存、网络流量等数据,可以满足一些小型应用。但是
docker stats
统计结果只能是当前宿主机的全部容器,数据资料是实时的,没有地方存储、没有健康指标过线预警等功能。CAdvisor(监控收集) + InfluxDB(存储数据) + Granfana(展示图表),合称
CIG
。
结束
晚安 各位!!!