docker之二----网络
docker
基础网络
四种基础网络类型
bridge
默认类型 NAT模式
当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上,所以有默认地址172.17.0.0/16的地址。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以ethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看.
D:\刘朋辉linux运维笔记\docker&K8s\Docker & K8s.assets\image-20201203180330377.png)
Host
host类型,使用宿主机网络,网络性能最高
Host模式,使用参数--network host指定,Host模式不支持端口映射,且容器无法启动。
启动的容器如果指定了使用host模式,那么新创建的容器不会创建自己的虚拟网卡(Network Namespace),而是直接使用宿主机的网卡和IP地址(Network Namespace),因此在容器里面查看到的IP信息就是宿主机的信息,访问容器的时候直接使用宿主机IP+容器端口即可,不过容器的其他资源们必须文件系统、系统进程等还是和宿主机保持隔离。此模式的网络性能最高,但是各容器之间端口不能相同,适用于运行容器端口比较固定的业务。
container
容器类型。使用其他容器共用网络,k8s中使用
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信
none
没有网络,上不了外网
使用none
模式,Docker容器拥有自己的Network Namespace
,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息,只有lo网络接口。需要我们自己为Docker容器添加网卡、配置IP等。
不参与网络通信,运行于此类容器中的进程仅能访问本地回环接口;仅适用于进程无须网络通信的场景中,例如:备份、进程诊断及各种离线任务等,此模式极少使用。
创建自定义网络
docker run -it --network host alpine:latest
docker run -it --network container:id号/主机名 alpine:latest 公用网络
nc -l -p 3000 #监听3000端口
docker run -it --network none alpine:3.9
ip addr
docker network create -d bridge --subnet 172.19.0.0/16 --gateway 172.19.0.1 oldqiang
docker run -it --network oldqiang alpine:3.9
ip addr
跨宿主机容器间的通讯之macvlan
macvlan
类似于虚拟机的桥接网络
注:ping不通自己的宿主机 虚拟机桥接,容器拥有和宿主机同一网段的ip地址,不能检测ip地址,手动管理IP地址分配
macvlan
创建网络
10.0.0.11
docker network create -d macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.2 -o parent=eth0 macvlan_1
10.0.0.12
docker network create -d macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.2 -o parent=eth0 macvlan_1
macvlan
启动容器
10.0.0.11
docker run -it --network macvlan_1 --ip 10.0.0.3 alpine:3.9
docker run -it --network macvlan_1 --ip 10.0.0.6 centos7_sshd:v4
ping 10.0.0.4
ping 10.0.0.7
10.0.0.12
docker run -it --network macvlan_1 --ip 10.0.0.4 alpine:3.9
docker run -it --network macvlan_1 --ip 10.0.0.7 centos7_sshd:v4
ping 10.0.0.3
ping 10.0.0.6
跨宿主机容器间的通讯之overlay
搭建consul集群
docker03:
下载
wget http://192.168.15.253/docker_images/docker_progrium_consul.tar.gz
启动容器
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
docker ps
注:-h 主机名
基于consul的10.0.0.11配置
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"cluster-store": "consul://10.0.0.13:8500",
"cluster-advertise": "10.0.0.11:2376"
}
systemctl restart docker
创建overlay网络
docker network create -d overlay --subnet 172.26.0.0/16 --gateway 172.26.0.1 ol1
启动容器测试
docker run -d -it --network ol1 --name oldboy01 alpine:3.9
docker run -d -it --network ol1 --name oldboy02 alpine:3.9
ifconfig docker_gwbridge
overlay:
注: ip地址存储在consol,使用该网络的容器,每个容器有两块网卡,eth0实现容器间的通讯,eth1实现容器访问外网,可以实现容器之间的双向通讯
基于consul的10.0.0.12配置
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"cluster-store": "consul://10.0.0.13:8500",
"cluster-advertise": "10.0.0.12:2376"
}
systemctl restart docker
创建overlay网络
docker network create -d overlay --subnet 172.26.0.0/16 --gateway 172.26.0.2 ol1
启动容器测试
docker run -d -it --network ol1 --name oldboy03 alpine:3.9
docker run -d -it --network ol1 --name oldboy04 alpine:3.9
ifconfig docker_gwbridge
每个容器有两块网卡:
- eth0实现容器间的通讯:可以使用 --name 指定的名字作为主机名通讯
- eth1实现容器访问外网:NAT模式
- 登录管理页面查看
查看 KEY/VALUE -- docker -- nodes/ ,docker01和docker02配好后会有两个节点
overlay
实现zabbix
容器安装
- 使用overlay网络
- 将
--name
改为--link
指定的名称 - 删除
--link
docker run --network ol1 --name mysql-server -it \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-d mysql:5.7 \
--character-set-server=utf8 --collation-server=utf8_bin
docker run --network ol1 --name zabbix-java-gateway -t \
-d zabbix/zabbix-java-gateway:latest
docker run --network ol1 --name zabbix-server-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
-p 10051:10051 \
-d zabbix/zabbix-server-mysql:latest
docker run --network ol1 --name zabbix-web-nginx-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-p 80:80 \
-d zabbix/zabbix-web-nginx-mysql:latest
docker exec -it zabbix-web-nginx-mysql /bin/sh
ping mysql-server
Docker容器监控
普罗米修斯 官网:https://prometheus.io/
监控工具
nagios
:不存储历史数据
cacti
:每5分钟同步一次,时间太长
zabbix
: 监控传统业务,模板
openfalcon
小米开发的监控工具
prometheus
: 监控容器业务
prometheus 主程序 数据集中处理
prometheus.yml
监控目标
target 自带 tsdb 时间序列数据库
注:可配置外部mysql数据库
配置其他的web界面
配置报警
alterManager
邮件报警
钉钉报警
微信报警
静态普罗米修斯(prometheus)docker03
cd /opt
tar xf prometheus-2.23.0.linux-amd64.tar.gz
cd prometheus-2.23.0.linux-amd64/
cat prometheus.yml
#修改
- job_name: 'prometheus'
static_configs:
- targets: ['10.0.0.13:9090']
- job_name: 'node-exporter'
static_configs:
- targets: ['10.0.0.11:9100','10.0.0.12:9100']
./prometheus --config.file="prometheus.yml" &
docker01
wget http://192.168.15.253/docker_monitor_node.tar.gz
docker load -i docker_monitor_node.tar.gz
#客户端节点
#启动node-exporter
docker run -d -p 9100:9100 -v "/:/host:ro,rslave" --name=node_exporter quay.io/prometheus/node-exporter --path.rootfs /host
#启动cadvisor
docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --publish=8080:8080 --detach=true --name=cadvisor google/cadvisor:latest #--detach -d后台运行
docker02
wget http://192.168.15.253/docker_monitor_node.tar.gz
docker load -i docker_monitor_node.tar.gz
#客户端节点
#启动node-exporter
docker run -d -p 9100:9100 -v "/:/host:ro,rslave" --name=node_exporter quay.io/prometheus/node-exporter --path.rootfs /host
#启动cadvisor
docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --publish=8080:8080 --detach=true --name=cadvisor google/cadvisor:latest #--detach -d后台运行
注:当时间不同步时可删除/opt/prometheus-2.23.0.linux-amd64/data目录文件重新搭建一遍
浏览器访问:http://10.0.0.13:9090/targets
动态普罗米修斯docker03
vim /opt/prometheus-2.23.0.linux-amd64/prometheus.yml
- job_name: 'cadvisor'
file_sd_configs:
- files:
- job/server.json
refresh_interval: 10s
mkdir job
vi /opt/prometheus-2.23.0.linux-amd64/job/server.json
[
{
"targets": ["10.0.0.11:8080","10.0.0.12:8080"]
}
]
ps -ef|grep prome
kill 8759 #PID进程号
./prometheus --config.file="prometheus.yml" &
浏览器访问:http://10.0.0.13:9090/targets
docker03:alter实现alterManager警报配置
wget http://192.168.15.253/alertmanager-0.21.0.linux-amd64.tar.gz
tar xf alertmanager-0.21.0.linux-amd64.tar.gz
cd alertmanager-0.21.0.linux-amd64/
vim alertmanager.yml
global:
resolve_timeout: 5m
smtp_from: '2543843664@qq.com'
smtp_smarthost: 'smtp.qq.com:465'
smtp_auth_username: '2543843664@qq.com'
smtp_auth_password: 'rmcfoclmkjpgeccf'
smtp_require_tls: false
smtp_hello: 'qq.com'
route:
group_by: ['alertname']
group_wait: 5s
group_interval: 5s
repeat_interval: 5m
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: '2543843664@qq.com'
send_resolved: true
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
./alertmanager --config.file="alertmanager.yml" &
netstat -tnulp
cd ../prometheus-2.23.0.linux-amd64/
vim prometheus.yml
- 10.0.0.13:9093 #打开报警
- "node_down.yml" #命名规则文件名称
vi /opt/prometheus-2.23.0.linux-amd64/node_down.yml
groups:
- name: node-up
rules:
- alert: node-up
expr: up{job="node-exporter"} == 0
for: 15s
labels:
severity: 1
team: node
annotations:
summary: "{{ $labels.instance }} 已停止运行超过 15s!"
ps -ef|grep prome #查看进程号
kill 8586 #pid号
./prometheus --config.file=prometheus.yml &
任意停止一个测试
docker01
docker stop node_exporter
docker02
docker stop node_exporter
浏览器访问:10.0.0.13:9093
grafana报警监控业务 出图工具 dashboard模板
#安装grafana
docker03
cd /opt
wget http://192.168.15.253/grafana-7.3.4-1.x86_64.rpm
yum localinstall grafana-7.3.4-1.x86_64.rpm -y
systemctl start grafana-server.service
systemctl enable grafana-server.service
grafana:
插件:
数据源:
注:wget https://mirror.tuna.tsinghua.edu.cn/grafana/yum/rpm/grafana-7.3.4-1.x86_64.rpm #清华园
浏览器访问:10.0.0.13:3000 admin:admin
首先创建一个prometheus dashboard
新建数据源--导入dashboard模板
https://grafana.com/api/dashboards/11074/revisions/9/download #prometheoushttps://grafana.com/api/dashboards/893/revisions/5/download #advistor
import导入