docker深刻服务

docker深刻

1.容器互联 IP地址

link一下 就知道容器的ip地址css

每作一次link 就会hosts解析html

# 启动第一个容器
[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)拖四个包java

[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)写个循环 导入node

[root@docker01 /srv]# for n in `ls *.tar.gz`;do docker load -i $n;done

3)命令mysql

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.5nginx

2、docker registry(私有仓库)

宿主机太多 镜像太多 本地没有 去官方拉 可是一群都拉 慢的很git

私有仓库 只拉一次 每次都去仓库拉 节省带宽github

1.普通的registry

1)拖个包web

[root@docker01 /srv]# ll
-rw-r--r-- 1 root root  35771392 Aug 15 09:35 registry.tar.gz

2)上传镜像sql

[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

img

查看镜像的版本

http://10.0.0.11:5000/v2/nginx/tags/list

img

# 删除镜像
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

3、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

4、重启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
}

5、Docker Machine安装docker服务

基本上不用了

功能是帮你在宿主机上安装docker服务。

6、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

7、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 互通

8、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

9、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

10、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