Docker进阶

  • 三、Docker发布微服务
  • 四、Docker网络
    • 4.1、Docker 网卡
    • 4.2、docker网络命令
    • 4.3、Docker 网络模式
      • 4.3.1、bridge模式
      • 4.3.2、host模式
      • 4.3.3、none模式
      • 4.3.4、container模式
      • 4.3.5、自定义网络
  • 五、Docker-compose容器编排
    • 5.1、Docker-compose
    • 5.2、compose安装
    • 5.3、常用命令
    • 5.4、compose编排实例
  • 六、Portainer轻量级图形化监控
    • 6.1、安装
  • 七、CIG重量级监控
    • 7.1、CIG
      • 7.1.1、CAdvisor
      • 7.1.2、InfluxDB
      • 7.1.3、Granfana
    • 7.2、安装部署
    • 7.3、Grafana配置
      • 7.3.1、添加数据源
      • 7.3.2、添加工作台

三、Docker发布微服务

  1. 将项目jar包上传到服务器
  2. 编写Dockerfile
FROM openjdk:8-oracle
MAINTAINER NaCl# 在主机 /var/lib/docker目录下创建一个临时文件,并链接到容器的 /tmp
VOLUME /tmp# 将jar包添加到容器中,并命名为 springboot_docker.jar
ADD docker_boot-1.0-SNAPSHOT.jar /springboot_docker.jar
# 运行jar包
RUN bash -c 'touch /springboot.jar'
ENTRYPOINT ["java", "-jar", "/springboot.jar"]# SpringBoot项目配置的端口号为6001,需要将6001暴露出去
EXPOSE 6001

四、Docker网络

4.1、Docker 网卡

docker安装并启动服务后,会在宿主机中添加一个虚拟网卡。

在Docker服务启动前,使用 ifconfig 或 ip addr 查看网卡信息:

  • ens33eth0:本机网卡
  • lo:本机回环网络网卡
  • 可能有virbr0(CentOS安装时如果选择的有相关虚拟化服务,就会多一个以网桥连接的私网地址的virbr0网卡,作用是为连接虚拟网卡提供NAT访问外网的功能。如果要移除该服务,可以使用 yum remove libvirt-libs.x86_64

使用 systemctl start docker启动Docker服务后,会多出一个 docker0 网卡。

作用:

  • 容器间的互联和通信以及端口映射
  • 容器IP变动时候可以通过服务名直接网络通信而不受到影响

Docker容器的网络隔离,是通过Linux内核特性namespacecgroup实现的。

4.2、docker网络命令

查看Docker网络模式:

docker network ls#如果没有修改过docker network,则默认有3个网络模式:
#- bridge
#- host
#- none

添加Docker网络:

docker network add xxx

查看Docker网络模式:

docker network ls

删除Docker网络:

docker network rm xxx

查看网络元数据:

docker network inspect xxx

删除所有无效的网络:

docker network prune

4.3、Docker 网络模式

网络模式 简介 使用方式
bridge 为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,默认为该模式 --network bridge
host 容器将不会虚拟出自己的网卡、配置自己的IP等,而是使用宿主机的IP和端口 --network host
none 容器有独立的 Network namespace,但并没有对齐进行任何网络设置,如分配 veth pari 和 网桥连接、IP等 --network none
container 新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等 --network container:NAME或者容器ID

查看某个容器的网络模式:

# 通过inspect获取容器信息,最后20行即为容器的网络模式信息
docker inspect 容器ID | tail -n 20

4.3.1、bridge模式

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

docker run的时候,没有指定–network的话,默认使用的网桥模式就是bridge,使用的就是docker0。在宿主机ifconfig就苦役看到docker0和自己create的network。

网桥docker0创建一对对的虚拟设备接口,一个叫veth,另一个叫eth0,成对匹配:

整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫 veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫做 veth pair)。

每个容器实例内部也有一块网卡,容器内的网卡接口叫做eth0。

docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。

4.3.2、host模式

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

容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network space。

容器将不会虚拟出自己的网卡,而是直接使用宿主机的 IP 和端口。


如果在 docker run 命令中同时使用了 --network host 和 -p端口映射

docker run -p 8082:8080 --network host tomcat
# 那么会出现一个警告:
#WARNING: Published ports are discarded when using host network mode

因为此时已经使用了host模式,本身就是直接使用的宿主机的IP和端口,此时的-p端口映射就没有了意义,也不会生效,端口号还是会以主机端口号为主。

正确做法是:不再进行-p端口映射,或者改用bridge模式

4.3.3、none模式

禁用网络功能。

在none模式下,并不为docker容器进行任何网络配置。进入容器内,使用ip addr查看网卡信息,只能看到 lo(本地回环网络127.0.0.1网卡)。

4.3.4、container模式

新建的容器和已经存在的一个容器共享网络IP配置,而不是和宿主机共享。

新创建的容器不会创建自己的网卡、IP,而是和一个指定的容器共享IP、端口范围。两个容器除了网络共享,其他的如文件系统、进程列表依然是隔离的。

docker run -it --name alpine1 alpine /bin/sh
# 指定和 alpine1 容器共享网络
docker run -it --netrowk container:alpine1 --name alpine2 alpine /bin/sh

4.3.5、自定义网络

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

容器 IP 变动时候可以通过服务名直接网络通信而不受影响。(类似Eureka,通过服务名直接互相通信,而不是写死IP地址)。

自定义桥接网络(自定义网络默认使用的是桥接网络 bridge):

docker network create tomcat_network

查看网络列表

docker network ls

创建容器时,指定加入我们自定义的网络中

docker run -d -p 8081:8080 --network tomcat_network --name tomcat1 tomcat:8.5-jdk8-correttodocker run -d -p 8082:8080 --network tomcat_network --name tomcat2 tomcat:8.5-jdk8-corretto

此时进入tomcat1中,使用ping命令测试连接tomcat2容器名,发现可以正常连通

# 安装ifconfig命令
yum install -y net-tools
# 安装ip addr命令
yum install -y iproute
# 安装ping命令
yum install -y iputils# 直接ping容器名,不需要ping IP地址
ping tomcat2

五、Docker-compose容器编排

5.1、Docker-compose

Docker-Compose是 Docker 官方的开源项目,负责实现对Docker容器集群的快速编排。

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

Docker建议我们每个容器中只运行一个服务,因为Docker容器本身占用资源极少,所以最好是将每个服务单独的分割开来。但是如果我们需要同时部署多个服务,每个服务单独构建镜像构建容器就会比较麻烦。所以 Docker 官方推出了 docker-compose 多服务部署的工具。

Compose允许用户通过一个单独的docker-compose.yml模板文件来定义一组相关联的应用容器为一个项目(project)。可以很容易的用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。

5.2、compose安装

官网
官网下载
安装时需要到官网找到Docker引擎版本对应的compose:

# 查看Docker版本
docker version# 下载下来的文件放到 /usr/local/bin目录下,命名为 docker-compose
curl -L https://github.com/docker/compose/releases/download/v2.12.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose# 添加权限
chmod +x /usr/local/bin/docker-compose# 验证
docker-compose version

卸载Compose:直接删除 sudo rm usr/local/bin/docker-compose文件即可

5.3、常用命令

执行命令时,需要在对应的docker-compose.yml文件所在目录下执行。

创建并启动docker-compose服务:(类似 docker run)

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 top

查看容器输出日志:

docker-compose log <yml里面的服务id>

检查配置:

docker-compose config# 有问题才输出
docker-compose config -q

重启服务:

docker-compose restart

启动服务:(类似 docker start)

docker-compose start

停止服务:

docker-compose stop

5.4、compose编排实例

# docker-compose文件版本号
version: "3"# 配置各个容器服务
services:microService:image: springboot_docker:1.0container_name: ms01  # 容器名称,如果不指定,会生成一个服务名加上前缀的容器名ports:- "6001:6001"volumes:- /app/microService:/datanetworks:- springboot_networkdepends_on:  # 配置该容器服务所依赖的容器服务- redis- mysqlredis:image: redis:6.0.8ports:- "6379:6379"volumes:- /app/redis/redis.conf:/etc/redis/redis.conf- /app/redis/data:datanetworks:- springboot_networkcommand: redis-server /etc/redis/redis.confmysql:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: '123456'MYSQL_ALLOW_EMPTY_PASSWORD: 'no'MYSQL_DATABASE: 'db_springboot'MYSQL_USER: 'springboot'MYSQL_PASSWORD: 'springboot'ports:- "3306:3306"volumes:- /app/mysql/db:/var/lib/mysql- /app/mysql/conf/my.cnf:/etc/my.cnf- /app/mysql/init:/docker-entrypoint-initdb.dnetworks:- springboot_networkcommand: --default-authentication-plugin=mysql_native_password # 解决外部无法访问networks:# 创建 springboot_network 网桥网络springboot_network:

编写完成docker-compose.yml后,进行语法检查:

# 进行语法检查
docker-compose config -q

如果语法检查没有任何问题,进行创建、启动:

# 进行语法检查
docker-compose up -d

六、Portainer轻量级图形化监控

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

Portainer分为开源社区版(CE版)和商用版(BE版/EE版)。

6.1、安装

Portainer也是一个Docker镜像,可以直接使用Docker运行。
官网

# 下载
docker pull portainer/portainer-ce# --restart=always 如果Docker引擎重启了,那么这个容器实例也会在Docker引擎重启后重启,类似开机自启
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

启动之后,便可以在浏览器中进行访问:http://xxx.xxx.xxx.xxx:9000
首次进来时,需要创建 admin 的用户名(默认admin)、密码(必须满足校验规则,例如portainer.io123)。
选择 local管理本地docker,即可看到本地Docker的详细信息,包括其中的镜像(images)、容器(containers)、网络(networks)、容器卷(volumes)、compose编排(stacks)等等。

七、CIG重量级监控

7.1、CIG

通过docker stats 命令可以很方便的查看当前宿主机上所有容器的CPU、内存、网络流量等数据,可以满足一些小型应用。

但是 docker stats 统计结果只能是当前宿主机的全部容器,数据资料是实时的,没有地方存储、没有健康指标过线预警等功能。

CAdvisor(监控收集) + InfluxDB(存储数据) + Granfana(展示图表),合称 CIG。

7.1.1、CAdvisor

CAdvisor是一个容器资源监控工具,包括容器的内存、CPU、网络IO、磁盘IO等监控,同时提供了一个Web页面用于查看容器的实时运行状态。

CAdvisor默认存储2分钟的数据,而且只是针对单物理机。不过CAdvisor提供了很多数据集成接口,支持 InfluxDB、Redis、Kafka、Elasticsearch等集成,可以加上对应配置将监控数据发往这些数据库存储起来。

CAdvisor主要功能:

  • 展示Host和容器两个层次的监控数据
  • 展示历史变化数据

7.1.2、InfluxDB

InfluxDB是用Go语言编写的一个开源分布式时序、事件和指标数据库,无需外部依赖。

CAdvisor默认只在本机保存2分钟的数据,为了持久化存储数据和统一收集展示监控数据,需要将数据存储到InfluxDB中。InfluxDB是一个时序数据库,专门用于存储时序相关数据,很适合存储 CAdvisor 的数据。而且 CAdvisor本身已经提供了InfluxDB的集成方法,在启动容器时指定配置即可。

InfluxDB主要功能:

  • 基于时间序列,支持与时间有关的相关函数(如最大、最小、求和等)
  • 可度量性,可以实时对大量数据进行计算
  • 基于事件,支持任意的事件数据

7.1.3、Granfana

Grafana是一个开源的数据监控分析可视化平台,支持多种数据源配置(支持的数据源包括InfluxDB、MySQL、Elasticsearch、OpenTSDB、Graphite等)和丰富的插件及模板功能,支持图表权限控制和报警。

Granfana主要功能:

  • 灵活丰富的图形化选项
  • 可以混合多种风格
  • 支持白天和夜间模式
  • 多个数据源

7.2、安装部署

编写docker-compose.yml服务编排文件

version: '3.1'volumes:grafana_data: {}services:influxdb:# tutum/influxdb 相比influxdb多了web可视化视图。但是该镜像已被标记为已过时image: tutum/influxdb:0.9restart: alwaysenvironment:- PRE_CREATE_DB=cadvisorports:- "8083:8083"         # 数据库web可视化页面端口- "8086:8086"         # 数据库端口volumes:- ./data/influxdb:/datacadvisor:image: google/cadvisor:v0.32.0links:- influxdb:influxsrvcommand:- -storage_driver=influxdb- -storage_driver_db=cadvisor- -storage_driver_host=influxsrv:8086restart: alwaysports:- "8080:8080"volumes:- /:/rootfs:ro- /var/run:/var/run:rw- /sys:/sys:ro- /var/lib/docker/:/var/lib/docker:rografana:image: grafana/grafana:8.5.2user: '104'restart: alwayslinks:- influxdb:influxsrvports:- "3000:3000"volumes:- grafana_data:/var/lib/grafanaenvironment:- HTTP_USER=admin- HTTP_PASS=admin- INFLUXDB_HOST=influxsrv- INFLUXDB_PORT=8086

创建并启动容器

docker-compose up -d

容器启动之后:

1.在浏览器打开InfluxDB数据库的页面: http://xxx.xxx.xxx.xxx:8083,使用命令查看当前数据库中的数据库实例:
SHOW DATABASES

查看其中是否自动创建了我们在配置文件中配置的 cadvisor 数据库实例
2. 在浏览器打开CAdvisor页面:http://xxx.xxx.xxx.xxx8080/,查看当前docker中的cpu、内存、网络IO等统计信息
3. 在浏览器打开Grafana页面:http://xxx.xxx.xxx.xxx:3000/,默认用户名密码是:admin/admin。

7.3、Grafana配置

7.3.1、添加数据源

在Configuration(小齿轮)选项卡中,选择Data Sources,添加一个InfluxDB数据源:

  • name:自定义一个数据源名称,例如InfluxDB
  • Query Language:查询语言,默认InfluxQL即可
  • URL:根据compose中的容器服务名连接,http://influxdb:8086
  • database:我们在InfluxDB中创建的数据库实例,cadvisor
  • User:InfluxDB的默认用户,root
  • Password:root

保存并测试,可以连通即可

7.3.2、添加工作台

在Create(加号)选项卡中,选择创建 Dash Board工作台。右上角配置中可以配置创建出来的工作台的标题、文件夹等信息。

在创建出来的工作台中,选择Add panel中的Add a new panel添加一个新的面板。

在右上角Time series(时序图)位置可以切换展示的图表样式(柱状图、仪表盘、表格、饼图等等)
右侧边栏为该图表配置相关信息:标题、描述

图表下方可以配置该图表展示的数据的查询语句,例如:
FROM:cpu_usage_total(Grafana会自动获取InfluxDB数据库中的元数据,可以直接选择对应表名)
WHERE:添加一个条件,container_name=cig-cadvisor-1
ALIAS:配置一个别名,CPU使用情况汇总

【Docker】Docker进阶(二)相关推荐

  1. docker学习(十二)docker secret 的使用

    目录 前言 一.docker secret 命令 二.secret 的使用 1.容器中的使用 2.mysql容器中的使用 3.docker-compose中的使用 前言 manager节点保持状态的一 ...

  2. Docker:(二)docker安装部署及优化详解

    目录 一:docker安装步骤详解 1.1关闭防火墙 1.2安装依赖包 1.3设置阿里云镜像源 1.4安装 Docker-CE并设置为开机自动启动 1.5查看 docker 版本信息 二:设置镜像加速 ...

  3. Docker系列(二十三)——Docker实例五Docker安装MongoDB实例

    < Docker实例三Docker安装MongoDB实例 > 前言 在前面一篇文章种,完成了 < Docker安装MySQL实例 >,本篇将继续镜像安装教程,并完成Docker ...

  4. Docker系列(二十一)——Docker实例三Docker安装Tomcat实例

    < Docker实例三Docker安装Tomcat实例 > 前言 在前面一篇文章种,完成了 < Docker安装Nginx实例 >,本篇将继续镜像安装教程,并完成Docker安 ...

  5. 调音台docker教程_威联通Docker教程 篇二:三分钟安装精美的音乐播放器 MusicPlayer!Container Station系列教程!...

    威联通Docker教程 篇二:三分钟安装精美的音乐播放器 MusicPlayer!Container Station系列教程! 2020-04-15 11:01:02 67点赞 529收藏 47评论 ...

  6. Docker系列(二十四)——Docker实例六Docker安装Redis实例

    < Docker实例三Docker安装Redis实例 > 前言 在前面一篇文章种,完成了 < Docker安装MongoDB实例 >,本篇将继续镜像安装教程,并完成Docker ...

  7. Docker概述(二)(标贝科技)

    标贝科技 https://ai.data-baker.com/#/?source=qwer12 填写邀请码fwwqgs,每日免费调用量还可以翻倍 Docker概述(二) 文章目录 Docker概述(二 ...

  8. Docker基本命令(二)之 容器卷使用、DockerFile

    目录 相关阅读 前言 容器数据卷 使用容器数据卷 挂载 查询 具名和匿名挂载 权限 使用Dockerfile实现挂载 实战:mysql挂载容器卷 实战:mysql容器间共享数据 DockerFile ...

  9. Docker学习之二------基础命令(镜像、容器)

    Docker基础命令 配置文件路径: /etc/sysconfig/docker docker镜像及容器目录 docker主目录:/var/lib/docker 存放容器目录:/var/lib/doc ...

  10. Docker容器基础(二) - Docker公司的入场

    一天天的,PaaS深入人心,Cloud Foundry为首的传统PaaS,开始蓄力基础设施领域的 平台化和PaaS化,于是发现了PaaS中的问题 1 如何给应用打包 Cloud Foundry/Ope ...

最新文章

  1. 常用排序算法的C++实现
  2. 基于PowerShell 3.0的web接口测试
  3. oracle+system空间满了,oracle审计导致system表空间爆满的处理方法
  4. 2016 年Adobe设计成就奖作品征集
  5. java inputtools_Java后台开发常用工具类
  6. VS2022+.NET6+C#10,.NET开发起飞
  7. linux系统搭建监控,Linux系统搭建zabbix监控系统实例讲解
  8. Java实现opendir的api_api代码生成
  9. python 纵向输出字符串_Python(五)字符串
  10. Java面试应该准备的知识点系列一
  11. python open gbk_python3 open txt的UnicodeDecodeError: 'gbk' codec问题解决方案
  12. 什么,缺“Java项目经验”找不到工作?锋哥送你80个“项目经验”
  13. 华硕服务器安装系统安装教程,华硕u盘安装系统教程
  14. oracle recover datafile,recover datafile和alter database recover datafile;
  15. 解决Strokeit在win8下的图标问题和开机启动问题
  16. javascript中获取非行间样式的方法
  17. windows电脑上架app store的软件
  18. 直播带货如何选品;抖音直播带货选品7大要素;丨国仁网络资讯
  19. ccs dat数据 matlab,详解CCS中的.dat文件
  20. 提取.txt文件内的指定内容

热门文章

  1. 两种方法快速打开Chrome浏览器
  2. spring(春天)
  3. Buffon's Needle
  4. 如何生成EI检索报告
  5. ue4导入倾斜摄影_一种基于Smart3D倾斜摄影技术输出实际地形等高线的方法与流程...
  6. 鼠标dpi设置多少合适呢?查看鼠标dpi的方法
  7. 机器视觉(12)浅说机器视觉系统概述及其国内外的现状
  8. leetcode-数据结构-566. 重塑矩阵
  9. 一种基于Android、iOS平台的移动端车牌识别方法,能够在复杂背景下迅速识别多种车牌
  10. kindle 您的请求出错 联系z.cn