【Docker】Docker进阶(二)
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发布微服务
- 将项目jar包上传到服务器
- 编写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 查看网卡信息:
ens33
或eth0
:本机网卡lo
:本机回环网络网卡- 可能有virbr0(CentOS安装时如果选择的有相关虚拟化服务,就会多一个以网桥连接的私网地址的
virbr0
网卡,作用是为连接虚拟网卡提供NAT访问外网的功能。如果要移除该服务,可以使用yum remove libvirt-libs.x86_64
)
使用 systemctl start docker
启动Docker服务后,会多出一个 docker0
网卡。
作用:
- 容器间的互联和通信以及端口映射
- 容器IP变动时候可以通过服务名直接网络通信而不受到影响
Docker容器的网络隔离,是通过Linux内核特性namespace
和cgroup
实现的。
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进阶(二)相关推荐
- docker学习(十二)docker secret 的使用
目录 前言 一.docker secret 命令 二.secret 的使用 1.容器中的使用 2.mysql容器中的使用 3.docker-compose中的使用 前言 manager节点保持状态的一 ...
- Docker:(二)docker安装部署及优化详解
目录 一:docker安装步骤详解 1.1关闭防火墙 1.2安装依赖包 1.3设置阿里云镜像源 1.4安装 Docker-CE并设置为开机自动启动 1.5查看 docker 版本信息 二:设置镜像加速 ...
- Docker系列(二十三)——Docker实例五Docker安装MongoDB实例
< Docker实例三Docker安装MongoDB实例 > 前言 在前面一篇文章种,完成了 < Docker安装MySQL实例 >,本篇将继续镜像安装教程,并完成Docker ...
- Docker系列(二十一)——Docker实例三Docker安装Tomcat实例
< Docker实例三Docker安装Tomcat实例 > 前言 在前面一篇文章种,完成了 < Docker安装Nginx实例 >,本篇将继续镜像安装教程,并完成Docker安 ...
- 调音台docker教程_威联通Docker教程 篇二:三分钟安装精美的音乐播放器 MusicPlayer!Container Station系列教程!...
威联通Docker教程 篇二:三分钟安装精美的音乐播放器 MusicPlayer!Container Station系列教程! 2020-04-15 11:01:02 67点赞 529收藏 47评论 ...
- Docker系列(二十四)——Docker实例六Docker安装Redis实例
< Docker实例三Docker安装Redis实例 > 前言 在前面一篇文章种,完成了 < Docker安装MongoDB实例 >,本篇将继续镜像安装教程,并完成Docker ...
- Docker概述(二)(标贝科技)
标贝科技 https://ai.data-baker.com/#/?source=qwer12 填写邀请码fwwqgs,每日免费调用量还可以翻倍 Docker概述(二) 文章目录 Docker概述(二 ...
- Docker基本命令(二)之 容器卷使用、DockerFile
目录 相关阅读 前言 容器数据卷 使用容器数据卷 挂载 查询 具名和匿名挂载 权限 使用Dockerfile实现挂载 实战:mysql挂载容器卷 实战:mysql容器间共享数据 DockerFile ...
- Docker学习之二------基础命令(镜像、容器)
Docker基础命令 配置文件路径: /etc/sysconfig/docker docker镜像及容器目录 docker主目录:/var/lib/docker 存放容器目录:/var/lib/doc ...
- Docker容器基础(二) - Docker公司的入场
一天天的,PaaS深入人心,Cloud Foundry为首的传统PaaS,开始蓄力基础设施领域的 平台化和PaaS化,于是发现了PaaS中的问题 1 如何给应用打包 Cloud Foundry/Ope ...
最新文章
- 常用排序算法的C++实现
- 基于PowerShell 3.0的web接口测试
- oracle+system空间满了,oracle审计导致system表空间爆满的处理方法
- 2016 年Adobe设计成就奖作品征集
- java inputtools_Java后台开发常用工具类
- VS2022+.NET6+C#10,.NET开发起飞
- linux系统搭建监控,Linux系统搭建zabbix监控系统实例讲解
- Java实现opendir的api_api代码生成
- python 纵向输出字符串_Python(五)字符串
- Java面试应该准备的知识点系列一
- python open gbk_python3 open txt的UnicodeDecodeError: 'gbk' codec问题解决方案
- 什么,缺“Java项目经验”找不到工作?锋哥送你80个“项目经验”
- 华硕服务器安装系统安装教程,华硕u盘安装系统教程
- oracle recover datafile,recover datafile和alter database recover datafile;
- 解决Strokeit在win8下的图标问题和开机启动问题
- javascript中获取非行间样式的方法
- windows电脑上架app store的软件
- 直播带货如何选品;抖音直播带货选品7大要素;丨国仁网络资讯
- ccs dat数据 matlab,详解CCS中的.dat文件
- 提取.txt文件内的指定内容