docker深入服务
docker深入
一、容器间的互联(--link 是单方向的!!!)
1.容器互联 IP地址
link一下 就知道容器的ip地址
每做一次link 就会hosts解析
# 启动第一个容器
[root@docker01 ~]# docker run -d xiaoniao:v
v1 v3 v4 v5 v6 v7 v8
[root@docker01 ~]# docker run -d xiaoniao:v4
b8d7b1f7e1f9d69e76d9af4b4ef5a06902244770c1293ccab0c1a87591f18e6f
# 在第一个容器的基础上 启动第二个容器
[root@docker01 ~]# docker run -it --link sweet_chandrasekhar:xiaoniao xiaoniao:v1 /bin/bash
# 看看网站状态
[root@a227b9c0f449 /]# curl -I http://xiaoniao
HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Tue, 31 Dec 2019 02:16:56 GMT
Content-Type: text/html
Content-Length: 3049
Last-Modified: Sat, 02 Aug 2014 07:55:12 GMT
Connection: keep-alive
ETag: "53dc9960-be9"
Accept-Ranges: bytes
# 查看hosts解析
[root@a227b9c0f449 /]# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 xiaoniao b8d7b1f7e1f9 sweet_chandrasekhar
172.17.0.3 a227b9c0f449
# 启动第一个容器
[root@docker01 ~]# docker run -d mysql
mysql mysql:v1 mysql:v2 mysql:v3
[root@docker01 ~]# docker run -d mysql:v3
7566567f3b28cf28d75f656007efb2697d38d1788d2909a5378a681499ab9f86
# 改个名
[root@docker01 ~]# docker run --name mysql -d mysql:v3
0e780acbda7e2e596bc3d43d41eea9671fd6cf6afd43928b7f44a93eaea28385
# 在第一个容器的基础上 启动第二个容器
[root@docker01 ~]# docker run -it --link mysql:mysql xiaoniao:v1 /bin/bash
[root@d42da268737b /]# ping mysql
PING mysql (172.17.0.4) 56(84) bytes of data.
64 bytes from mysql (172.17.0.4): icmp_seq=1 ttl=64 time=0.065 ms
64 bytes from mysql (172.17.0.4): icmp_seq=2 ttl=64 time=0.041 ms
# 查看hosts解析
[root@d42da268737b /]# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.4 mysql 0e780acbda7e
172.17.0.5 d42da268737b
2.使用docker运行zabbix-server
1)拖四个包
[root@docker01 /srv]# ll
-rw-r--r-- 1 root root 392823296 Aug 15 09:36 docker-mysql-5.7.tar.gz
-rw-r--r-- 1 root root 153172992 Aug 15 09:36 zabbix-java-gateway.tar.gz
-rw-r--r-- 1 root root 110936576 Aug 15 09:35 zabbix-server-mysql.tar.gz
-rw-r--r-- 1 root root 179232768 Aug 15 09:35 zabbix-web-nginx-mysql.tar.gz
2)写个循环 导入
[root@docker01 /srv]# for n in `ls *.tar.gz`;do docker load -i $n;done
3)命令
docker run --name mysql-server -t \
-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 --name zabbix-java-gateway -t \
-d zabbix/zabbix-java-gateway:latest
docker run --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" \
--link mysql-server:mysql \
--link zabbix-java-gateway:zabbix-java-gateway \
-p 10051:10051 \
-d zabbix/zabbix-server-mysql:latest
docker run --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" \
--link mysql-server:mysql \
--link zabbix-server-mysql:zabbix-server \
-p 80:80 \
-d zabbix/zabbix-web-nginx-mysql:latest
4)访问10.0.0.5
二、docker registry(私有仓库)
宿主机太多 镜像太多 本地没有 去官方拉 但是一群都拉 慢的很
私有仓库 只拉一次 每次都去仓库拉 节省带宽
1.普通的registry
1)拖个包
[root@docker01 /srv]# ll
-rw-r--r-- 1 root root 35771392 Aug 15 09:35 registry.tar.gz
2)上传镜像
[root@docker01 /srv]# docker load -i registry.tar.gz
3)启动私有仓库
[root@docker01 /srv]# docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
03b40960c4226efc526c21d64f1e95a442c7daa6094ec39228805cbfabd68bfd
--restart=always 当我docker服务起来时 自动把我这个容器起来
4)上传镜像到私有仓库
# 给镜像打标签
[root@docker02 ~]# docker image tag test:v1 10.0.0.5:5000/test:v1
# 上传镜像
[root@docker02 ~]# docker push 10.0.0.5:5000/test:v1
# 查看私有仓库有没有镜像
[root@docker01 ~]# ls /opt/myregistry/docker/registry/v2/repositories/
test
5)对上面命令的解释
# 查看镜像
[root@docker02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test v1 0ffdc2348521 3 hours ago 1.89MB
# 把镜像上传到私有仓库
[root@docker02 ~]# docker image tag test:v1 10.0.0.5:5000/test:v1
# 查看镜像 多了一个
[root@docker02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10.0.0.5:5000/test v1 0ffdc2348521 3 hours ago 1.89MB
test v1 0ffdc2348521 3 hours ago 1.89MB
# 删掉镜像 移除的是标签
[root@docker02 ~]# docker rmi test:v1
# 查看镜像
[root@docker02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10.0.0.5:5000/test v1 0ffdc2348521 3 hours ago 1.89
[root@docker02 ~]# docker push 10.0.0.5:5000/test:v1
The push refers to repository [10.0.0.5:5000/test]
Get https://10.0.0.5:5000/v2/: http: server gave HTTP response to HTTPS client
[root@docker02 ~]# cat /etc/docker/daemon.json
{
"insecure-registries": ["10.0.0.5:5000"],
"registry-mirrors": ["https://registry.docker-cn.com"]
}
[root@docker02 ~]# systemctl restart docker
[root@docker02 ~]# docker push 10.0.0.5:5000/test:v1
The push refers to repository [10.0.0.5:5000/test]
254fbd52eeb8: Pushed
195be5f8be1d: Pushed
v1: digest: sha256:10e10960acc278f44fcad76299fa3c87071647086f4728cb674b68bba6fab6ee size: 737
2.带basic认证的registry
所有人都可以在私有仓库上传镜像 如果名字相同 之前的镜像就会被覆盖掉
官方仓库带认证 私有仓库也可以带认证
[root@docker01 ~]# yum install httpd-tools -y
[root@docker01 ~]# mkdir /opt/registry-var/auth/ -p
[root@docker01 ~]# htpasswd -Bbn mst 123456 >> /opt/registry-var/auth/htpasswd
[root@docker01 ~]# docker run -d -p 5000:5000 --restart=always -v /opt/registry-var/auth/:/auth/ -v /opt/myregistry:/var/lib/registry -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" registry
# 再推一次镜像 被拒绝
[root@docker01 ~]# docker push 10.0.0.5:5000/xiaoniao:v1
The push refers to repository [10.0.0.5:5000/xiaoniao]
50c9181be7e8: Preparing
dc3717969f3a: Preparing
7a11b788a6b7: Preparing
c71feb1f04e6: Preparing
f59aa8ef2875: Preparing
b5e11aae8a8e: Preparing
no basic auth credentials
# 登录docker 输入账号密码
[root@docker01 ~]# docker login 10.0.0.5:5000
Username: mst
Password:
Login Succeeded
# 再次推镜像 成功了
[root@docker01 ~]# docker push 10.0.0.5:5000/xiaoniao:v1
The push refers to repository [10.0.0.5:5000/xiaoniao]
50c9181be7e8: Layer already exists
dc3717969f3a: Layer already exists
7a11b788a6b7: Layer already exists
c71feb1f04e6: Layer already exists
f59aa8ef2875: Layer already exists
b5e11aae8a8e: Layer already exists
v1: digest: sha256:1c606a09ba312d5d43c53d083b1a2c2ebd719b95f076617df97538dc4aa95cac
上传要登录 下载也要登陆 删除私有仓库镜像不容易 权限控制不太好
查看镜像列表
使用浏览器访问:
http://10.0.0.11:5000/v2/_catalog
查看镜像的版本
http://10.0.0.11:5000/v2/nginx/tags/list
# 删除镜像
1)进入docker registry的容器中
docker exec -it registry /bin/sh
2) 删除repo
rm -fr /var/lib/registry/docker/registry/v2/repositories/nginx
3) 清理掉blobs
registry garbage-collect /etc/docker/registry/config.yml
三、docker-compose(单机版的容器编排工具)
wordpress
之前都是一次启动一个容器 借助这个工具一次可以启多个容器
像ansible剧本
# 下载工具(需要epel源)
[root@docker01 ~]# yum install -y docker-compose
[root@docker01 ~]# docker-compose -v
docker-compose version 1.18.0, build 8dd22a9
# 进目录编辑文件
[root@docker01 ~]# mkdir /opt/docker-compose
[root@docker01 ~]# cd /opt/docker-compose/
[root@docker01 /opt/docker-compose]# mkdir wordpress
[root@docker01 /opt/docker-compose]# cd wordpress/
# 编写配置文件
[root@docker01 /opt/docker-compose/wordpress]# vim docker-compose.yml[必须叫这个名]
version: '3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- web_data:/var/www/html
ports:
- "80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes:
db_data:
web_data:
# 拖个wordpress的包 因为你配置它 本地没有会很慢
[root@docker01 /srv]# ll
-rw-r--r-- 1 root root 417304064 Aug 15 09:36 wordpress-latest.tar.gz
# 导入镜像
[root@docker01 /srv]# docker load -i wordpress-latest.tar.gz
# 启动
[root@docker01 /opt/docker-compose/wordpress]# docker-compose up
#后台启动
docker-compose up -d
四、重启docker服务,容器全部退出的解决办法
# 方法一:
docker run --restart=always
# 方法二:[这个很坑 最好忘掉]
docker server配置文件/etc/docker/daemon.json
{
"registry-mirrors": ["http://b7a9017d.m.daocloud.io"],
"insecure-registries":["10.0.0.11:5000"],
"live-restore": true
}
五、Docker Machine安装docker服务
基本上不用了
功能是帮你在宿主机上安装docker
服务。
六、Docker网络类型
None:不为容器配置任何网络功能,--net=none
Container:与另一个运行中的容器共享Network Namespace,--net=container:containerID(K8S)
Host:与宿主机共享Network Namespace,--network=host 性能最高 端口先到先得
Bridge:Docker设计的NAT网络模型
[root@docker01 ~]# docker run -d --network=HOST -it 10.0.0.5:5000/test:v1
--network= 就是指定网络类型的 不写默认bridge
七、Docker跨主机容器之间的通信macvlan
默认一个物理网卡,只有一个物理mac地址,但虚拟多个mac地址就等效多个物理网卡
# 查看网络
[root@docker01 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
369f3f070370 bridge bridge local
5410a95eb8da host host local
b17e3901fdcd none null local
# 创建macvlan网络
[root@docker01 ~]# docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
# 查看网络 多了一个刚创建的
[root@docker01 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
369f3f070370 bridge bridge local
5410a95eb8da host host local
1ec91b78a1b7 macvlan_1 macvlan local
b17e3901fdcd none null local
# 另一台服务器也创建
[root@docker02 ~]# docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
[root@docker02 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
d38e976c914c bridge bridge local
23918a601f04 host host local
bc13a798a6a6 macvlan_1 macvlan local
# 启动容器
[root@docker01 ~]# docker run -it --network macvlan_1 --ip 10.0.0.33 xiaoniao:v5 /bin/bash
# 查看ip
[root@3327f80d8e38 /]# ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:0A:00:00:21
inet addr:10.0.0.33 Bcast:10.0.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
# ping一下
[g:\~]$ ping 10.0.0.33
正在 Ping 10.0.0.33 具有 32 字节的数据:
来自 10.0.0.33 的回复: 字节=32 时间<1ms TTL=64
来自 10.0.0.33 的回复: 字节=32 时间<1ms TTL=64
# 在容器里启动nginx
[root@3327f80d8e38 /]# service nginx start
直连 不需要端口映射
# 再启动一个容器 [要注意私有仓库容器开没开]
[root@docker02 ~]# docker run -it --network macvlan_1 --ip 10.0.0.34 10.0.0.5:5000/xiaoniao:v1
# 查看ip
10.0.0.34
# ping
ping 10.0.0.33 互通
八、Dcoker跨主机容器通信之overlay
解决了ip地址冲突问题 如果用macvlan需要手动指定ip地址
用overlay不需要手动指定 他会把ip存在仓库里 每次创建时都会读仓库 如果有了 就自动给你往后拍ip
# 准备三台服务器
# 可以再第三台服务器上面装通信容器
docker03:
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
这里我选择装在docker01上
先修改配置文件 再启动通信容器 因为重启服务会退出
1.修改配置文件
# 修改配置文件
[root@docker01 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.5:5000"],
"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"cluster-store": "consul://10.0.0.5:8500",
"cluster-advertise": "10.0.0.5:2376"
}
【重启 会失败 查看日志是因为配置文件和system管理配置文件冲突 所以修改sys文件】
# 修改systemctl配置文件
[root@docker01 ~]# vim /usr/lib/systemd/system/docker.service
把 -H fd:// 参数删掉
# 重载
[root@docker01 ~]# systemctl daemon-reload
[root@docker01 ~]# systemctl restart docker
# docker02 做相同操作
[root@docker02 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.5:5000"],
"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"cluster-store": "consul://10.0.0.5:8500",
"cluster-advertise": "10.0.0.6:2376"
}
[root@docker02 ~]# vim /usr/lib/systemd/system/docker.service
把 -H fd:// 参数删掉
[root@docker02 ~]# systemctl daemon-reload
[root@docker02 ~]# systemctl restart docker
2.启动通信容器
因为没有镜像要在线pu 浪费时间 所以我托个包上传
root@docker01 ~]# ll
-rw-r--r-- 1 root root 70327296 Nov 10 2018 docker_progrium_consul.tar.gz
[root@docker01 ~]# docker load -i docker_progrium_consul.tar.gz
[root@docker01 ~]# docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
3.创建overlay网络
[root@docker01 ~]# docker network create -d overlay --subnet 172.16.2.0/24 --gateway 172.16.2.254 ol1
避免网段冲突 所以改成.2了
# 查看网络 出现global类型的
[root@docker01 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
b7b7a68209d0 bridge bridge local
5410a95eb8da host host local
1ec91b78a1b7 macvlan_1 macvlan local
b17e3901fdcd none null local
9ff4a5d78a4a ol1 overlay global
# 另一台服务器查看 也有 因为docker开了一个远程控制的工具
[root@docker02 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
1569e3d54ae4 bridge bridge local
23918a601f04 host host local
bc13a798a6a6 macvlan_1 macvlan local
05173a1abc09 none null local
9ff4a5d78a4a ol1 overlay global
# 远程连接查看docker01的服务
[root@docker02 ~]# docker -H 10.0.0.5:2376 ps -a -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8d296b93e72b progrium/consul "/bin/start -server …" 7 minutes ago Up 7 minutes 53/tcp, 53/udp, 8300-8302/tcp, 8400/tcp, 8301-8302/udp, 0.0.0.0:8500->8500/tcp consul
# docker02自己的服务
[root@docker02 ~]# docker ps -a -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4.测试
# 两边都准备好busybox镜像
# 启动容器 主机名oldboy01
[root@docker01 ~]# docker run -it --network ol1 --name oldboy01 busybox:latest /bin/sh
/ # ping oldboy02
PING oldboy02 (172.16.2.2): 56 data bytes
64 bytes from 172.16.2.2: seq=0 ttl=64 time=0.485 ms
64 bytes from 172.16.2.2: seq=1 ttl=64 time=0.320 ms
【ping对方主机名 就能知道对方的ip】
# 启动容器 主机名oldboy02
[root@docker02 ~]# docker run -it --network ol1 --name oldboy02 busybox:latest /bin/sh
/ # ping oldboy01
PING oldboy01 (172.16.2.1): 56 data bytes
64 bytes from 172.16.2.1: seq=0 ttl=64 time=14.043 ms
64 bytes from 172.16.2.1: seq=1 ttl=64 time=0.664 ms
64 bytes from 172.16.2.1: seq=2 ttl=64 time=0.410 ms
ip地址不会冲突
5.因为是内网网段,怎么被外界访问?
[root@docker01 ~]# docker run --network ol1 --name web01 -p 80:80 xiaoniao:v8 /bin/bash
[root@2cbd20d33f82 /]# ifconfig
[root@2cbd20d33f82 /]# ping oldboy02
PING oldboy02 (172.16.2.2) 56(84) bytes of data.
64 bytes from oldboy02.ol1 (172.16.2.2): icmp_seq=1 ttl=64 time=8.70 ms
64 bytes from oldboy02.ol1 (172.16.2.2): icmp_seq=2 ttl=64 time=0.538 ms
[root@2cbd20d33f82 /]# ping 223.5.5.5
PING 223.5.5.5 (223.5.5.5) 56(84) bytes of data.
64 bytes from 223.5.5.5: icmp_seq=1 ttl=127 time=9.25 ms
64 bytes from 223.5.5.5: icmp_seq=2 ttl=127 time=40.6 ms
九、docker企业级镜像仓库harbor(vmware 中国团队)
1.创建仓库
docker registry(私有仓库):功能弱 权限简单 删除镜像麻烦
docker harbor:重量级
第一步:安装docker和docker-compose
第二步:下载harbor-offline-installer-v1.x.0.tgz
第三步:上传到/opt,并解压
第四步:修改harbor.cfg配置文件
hostname = 10.0.0.5
harbor_admin_password = 123456
第五步:执行install.sh
# 下载docker-compose
[root@docker01 ~]# yum install -y docker-compose
# 拖个包
[root@docker01 /opt]# ll
-rw-r--r-- 1 root root 864933610 Aug 15 09:36 harbor-offline-installer-v1.5.1.tgz
# 解压
[root@docker01 /opt]# tar xf harbor-offline-installer-v1.5.1.tgz
# 进目录修改文件
[root@docker01 /opt/harbor]# vim harbor.cfg
hostname = 10.0.0.5
harbor_admin_password = 123456
# 执行脚本
[root@docker01 /opt/harbor]# ./install.sh
# 根据格式推镜像到仓库
[root@docker02 ~]# docker tag busybox:latest 10.0.0.5/library/busybox:latest
[root@docker02 ~]# docker push 10.0.0.5/library/busybox:latest
The push refers to repository [10.0.0.5/library/busybox]
Get https://10.0.0.5/v2/: dial tcp 10.0.0.5:443: connect: connection refused
【报错了 还是之前http和https的原因】
# 修改配置文件 之前有端口映射5000 现在没有
[root@docker02 ~]# vim /etc/docker/daemon.json
{
"insecure-registries": ["10.0.0.5"],
"registry-mirrors": ["https://registry.docker-cn.com"],
"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"cluster-store": "consul://10.0.0.5:8500",
"cluster-advertise": "10.0.0.6:2376"
}
[root@docker02 ~]# systemctl restart docker
# 修改完配置文件与可能harbor起不来
[root@docker01 ~]# docker-compose restart
# 推镜像到仓库 自带登录 所以先登录
[root@docker02 ~]# docker login 10.0.0.5
Username: admin
Password: (123456)
[root@docker02 ~]# docker push 10.0.0.5/library/busybox:latest
十、docker监控
1.cadvisor监控概述
为了解决docker stats的问题(存储、展示),谷歌开源的cadvisor诞生了,cadvisor不仅可以搜集一台机器上所有运行的容器信息,还提供基础查询界面和http接口,方便其他组件如Prometheus进行数据抓取,或者cadvisor + influxdb + grafna搭配使用。
cAdvisor可以对节点机器上的资源及容器进行实时监控和性能数据采集,包括CPU使用情况、内存使用情况、网络吞吐量及文件系统使用情况。
Cadvisor使用Go语言开发,利用Linux的cgroups获取容器的资源使用信息,在K8S中集成在Kubelet里作为默认启动项,官方标配。
2.其他安装方式
- 1.使用二进制部署
下载二进制:https://github.com/google/cadvisor/releases/latest
本地运行:./cadvisor -port=8080 &>>/var/log/cadvisor.log
- 2.使用docker部署
docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest
#注意:
在Ret Hat,CentOS, Fedora 等发行版上需要传递如下参数,因为 SELinux 加强了安全策略:
--privileged=true (慎用 共用一个内核)
#启动后访问:http://127.0.0.1:8080查看页面,/metric查看指标
- 3.kubernetes中使用
Daemonset部署: https://github.com/google/cadvisor/tree/master/deploy/kubernetes
kubelet自带cadvisor监控所有节点,可以设置--cadvisor-port=8080指定端口(默认为4194)
kubernetes 在2015-03-10 这个提交(Run cAdvisor inside the Kubelet. Victor Marmol 2015/3/10 13:39)中cAdvisor开始集成在kubelet中,目前的1.6及以后均存在
#注意:
从 v1.7 开始,Kubelet metrics API 不再包含 cadvisor metrics,而是提供了一个独立的 API 接口:
Kubelet metrics: http://127.0.0.1:8001/api/v1/proxy/nodes/<node-name>/metrics
Cadvisor metrics: http://127.0.0.1:8001/api/v1/proxy/nodes/<node-name>/metrics/cadvisor
cadvisor 监听的端口将在 v1.12 中删除,建议所有外部工具使用 Kubelet Metrics API 替代。
3.cadvisor + influxdb + grafna组合实践
# 1.拖个包
[root@docker01 ~]# ll
-rw-r--r-- 1 root root 628516864 Aug 16 12:34 docker_monitor.tar.gz
# 2.导入镜像
[root@docker01 ~]# docker load -i docker_monitor.tar.gz
# 3.启动第一个容器
[root@docker01 ~]# docker run -itd -p 8083:8083 -p 8086:8086 --name influxdb tutum/influxdb
在界面上创建库 后面使用
# 启动第二个容器 (docker 1.7以上版本)
[root@docker01 ~]# docker run -itd --name cadvisor -p 8080:8080 --link influxdb:influxdb --mount type=bind,src=/,dst=/rootfs,ro --mount type=bind,src=/var/run,dst=/var/run --mount type=bind,src=/sys,dst=/sys,ro --mount type=bind,src=/var/lib/docker/,dst=/var/lib/docker,ro google/cadvisor -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_user=root -storage_driver_password=root -storage_driver_host=influxdb:8086
# 启动第三个容器
[root@docker01 ~]# docker run -itd --name grafana -p 3000:3000 grafana/grafana
3.1.页面配置
登录
添加数据源
创建监控
4.cadvisor + prometheus + grafna组合实践
Prometheus 是一个非常优秀的监控工具。提供了监控数据搜集,存储,处理,可视化和告警一系列完 整的解决方案。
#包含组件:
Node Exporter :负责收集 host 硬件和操作系统数据,以容器的形式运行在所有 host 上
cAdvisor :负责收集容器数据,以容器的形式运行在所有 host 上
#部署
#地址规划:
10.0.0.5 cAdvisor+ Node Exporter +prometheus+ grafana
10.0.0.6 cAdvisor+ Node Exporter
# 拖安装包到两台服务器
[root@docker01 ~]# ll
-rw-r--r-- 1 root root 70389760 Jan 9 16:34 cadvisor.tar
-rw-r--r-- 1 root root 898 Jan 9 16:34 docker-compose.yml
-rw-r--r-- 1 root root 42315 Jan 9 16:34 docker-host-container-overview_rev1.json
-rw-r--r-- 1 root root 232943616 Jan 9 16:34 grafana.tar
-rw-r--r-- 1 root root 24351232 Jan 9 16:34 node-exporter.tar
-rw-r--r-- 1 root root 134138368 Jan 9 16:34 prometheus.tar
-rw-r--r-- 1 root root 354 Jan 9 16:34 prometheus.yml
# 导入镜像
docker load -i cadvisor.tar
docker load -i grafana.tar
docker load -i prometheus.tar
docker load -i node-exporter.tar
# 修改配置文件
#docker01的配置文件:
cat >docker-compose.yml<<EOF
version: '3.2'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
ports:
- 9090:9090
command:
- --config.file=/etc/prometheus/prometheus.yml
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
depends_on:
- cadvisor
node-exporter:
image: prom/node-exporter:latest
container_name: node_exporter
ports:
- 9100:9100
cadvisor:
image: google/cadvisor:latest
container_name: cadvisor
ports:
- 8080:8080
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- 3000:3000
EOF
#prometheus配置文件
cat >prometheus.yml <<EOF
scrape_configs:
- job_name: cadvisor
scrape_interval: 5s
static_configs:
- targets:
- 10.0.0.5:8080
- 10.0.0.6:8080
- job_name: prometheus
scrape_interval: 5s
static_configs:
- targets:
- 10.0.0.5:9090
- job_name: node_exporter
scrape_interval: 5s
static_configs:
- targets:
- 10.0.0.5:9100
- 10.0.0.6:9100
EOF
#docker02配置文件
cat >docker-compose.yml<<EOF
version: '3.2'
services:
node-exporter:
image: prom/node-exporter:latest
container_name: node_exporter
ports:
- 9100:9100
cadvisor:
image: google/cadvisor:latest
container_name: cadvisor
ports:
- 8080:8080
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
EOF
# 运行
yum install docker-compose -y
ntpdate time1.aliyun.com
docker-compose -f docker-compose.yml up -d
# 检查
http://10.0.0.5:8080/metrics
http://10.0.0.5:9100/metrics
http://10.0.0.5:9090
http://10.0.0.5:3000
4.1.页面操作
打开 grafana:
10.0.0.5:3000
admin admin
**添加数据源 **
下载并加载监控面板
https://grafana.com/api/dashboards/10619/revisions/1/download
#可以拖个下载好的
docker-host-container-overview_rev1.json