docker 总结

docker 容器

1.什么是容器

容器就是在隔离的环境中运行的一个进程,如果进程停止,容器就会退出。隔离的环境拥有自己的系统文件,ip地址,主机名等
kvm虚拟机,linux,系统文件

程序:代码,命令 进程:正在运行的程序

2:容器和虚拟化的区别

linux容器技术,容器虚拟化和kvm虚拟化的区别 kvm虚拟化: 需要硬件的支持,需要模拟硬件,可以运行不同的操作系统,启动时间分钟级(开机启动流程)

linux开机启动流程: bios开机硬件自检 basic input output system 根据bios设置的优先启动项boot 网卡 硬盘 u盘 光驱 读取grub(mbr)引导 2T UEFI(gpt分区) mbr硬盘分区信息,内核加载路径,
加载内核 启动第一个进程/sbin/init systemd 系统初始化完成 运行服务(nginx,httpd,mysql) 。。。

容器启动流程: 共用宿主机内核: 第一个进程直接启动服务(nginx,httpd,mysql)

容器:共用宿主机内核,轻量级,损耗少,启动快,性能高,只能运行在linux系统上 虚拟机:需要硬件的支持,需要模拟硬件,需要走开机启动流程,可以运行不同的操作系统

3:容器技术的发展过程:

(1):chroot技术,新建一个子系统(拥有自己完整的系统文件)

参考资料:https://www.ibm.com/developerworks/cn/linux/l-cn-chroot/ chang root

使用chroot监狱限制SSH用户访问指定目录和使用指定命令(cp,ls) https://linux.cn/article-8313-1.html ldd /bin/ls

(2):linux容器(lxc) linux container(namespaces 命名空间 隔离环境 及cgroups 进程资源限制)

cgroups 限制一个进程能够使用的资源。cpu,内存,硬盘io

kvm虚拟机:资源限制(1c 1G 20G)

需要使用epel源

yum install epel-release -y

编译epel源配置文件

vi  /etc/yum.repos.d/epel.repo

[epel]

name=Extra Packages for Enterprise Linux 7 - $basearch

baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/$basearch

#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch

failovermethod=priority

enabled=1

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

[epel-debuginfo]

name=Extra Packages for Enterprise Linux 7 - $basearch - Debug

baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/$basearch/debug

#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-7&arch=$basearch

failovermethod=priority

enabled=0

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

gpgcheck=1

[epel-source]

name=Extra Packages for Enterprise Linux 7 - $basearch - Source

baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/SRPMS

#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-7&arch=$basearch

failovermethod=priority

enabled=0

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

gpgcheck=1

安装lxc

yum install lxc-* -y yum install libcgroup* -y yum install bridge-utils.x86_64 -y

桥接网卡

[root@controller ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 

echo 'TYPE=Ethernet

BOOTPROTO=none

NAME=eth0

DEVICE=eth0

ONBOOT=yes

BRIDGE=virbr0' >/etc/sysconfig/network-scripts/ifcfg-eth0

[root@controller ~]# cat /etc/sysconfig/network-scripts/ifcfg-virbr0 

echo 'TYPE=Bridge

BOOTPROTO=static

NAME=virbr0

DEVICE=virbr0

ONBOOT=yes

IPADDR=10.0.0.11

NETMASK=255.255.255.0

GATEWAY=10.0.0.254

DNS1=180.76.76.76' >/etc/sysconfig/network-scripts/ifcfg-virbr0

启动cgroup

systemctl start cgconfig.service

启动lxc

systemctl start lxc.service

创建lxc容器

方法1: lxc-create -t download -n centos6 -- --server mirrors.tuna.tsinghua.edu.cn/lxc-images -d centos -r 6 -a amd64 方法2: lxc-create -t centos -n test

为lxc容器设置root密码:

[root@controller ~]# chroot /var/lib/lxc/test/rootfs passwd Changing password for user root. New password: BAD PASSWORD: it is too simplistic/systematic BAD PASSWORD: is too simple Retype new password: passwd: all authentication tokens updated successfully.

为容器指定ip和网关

vi /var/lib/lxc/centos7/config
lxc.network.name = eth0
lxc.network.ipv4 = 10.0.0.111/24
lxc.network.ipv4.gateway = 10.0.0.254

启动容器

lxc-start -n centos7

4.docker 容器

centos7.6 2G 10.0.0.11 docker01 host解析 centos7.6 2G 10.0.0.12 docker02 host解析

Docker是通过进程虚拟化技术(namespaces及cgroups cpu、内存、磁盘io等)来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。 namespace 资源隔离 cgroups 进程的资源限制 kvm 虚拟磁盘文件,资源隔离 kvm 资源限制,--cpus --memory

docker 初期把lxc二次开发,libcontainer

4:docker的安装

10.0.0.11:修改主机名和host解析

rm -fr /etc/yum.repos.d/local.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
yum install docker-ce -y

5:docker的主要组成部分

docker是传统的CS架构分为docker client和docker server,向mysql一样

命令:docker version
[root@controller ~]# docker version 
Client: Version: 17.12.0-ce API version: 1.35 Go version: go1.9.2 Git commit: c97c6d6 Built: Wed Dec 27 20:10:14 2017 OS/Arch: linux/amd64

Server: Engine: Version: 17.12.0-ce API version: 1.35 (minimum version 1.12) Go version: go1.9.2 Git commit: c97c6d6 Built: Wed Dec 27 20:12:46 2017 OS/Arch: linux/amd64 Experimental: false

docker主要组件有:镜像、容器、仓库, 网络,存储
启动容器必须需要一个镜像,仓库存储镜像 容器---镜像---仓库

6:启动第一个容器

docker的主要目标是"Build,Ship and Run any App,Angwhere",构建,运输,处处运行 部署服务,环境问题
一次构建,处处运行
docker是一种软件的打包技术
docker初次体验: 安装Nginx步骤: 官网下载Nginx源码包wget
tar 创建Nginx用户
编译安装 ./config.... 修改配置文件, 启动
配置docker镜像加速

vi  /etc/docker/daemon.json
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}   
docker run -d -p 80:80 nginx
run(创建并启动一个容器)
-d 放在后台
-p 端口映射
nginx docker镜像的名字

7:docker的镜像管理

搜索镜像​ docker search 选镜像的建议: 1,优先考虑官方 2,stars数量多
官方镜像仓库地址:hub.docker.com
获取镜像​ docker pull(push)​ 镜像加速器:阿里云加速器,daocloud加速器,中科大加速器,Docker 中国官方镜像加速:https://registry.docker-cn.com​官方pull

docker pull centos:6.8(没有指定版本,默认会下载最新版)
私有仓库docker pull daocloud.io/huangzhichong/alpine-cn:latest
配置docker镜像加速
vi /etc/docker/daemon.json { "registry-mirrors": ["https://registry.docker-cn.com"] }​

查看镜像列表

docker images or docker image ls 

删除镜像

docker rmi 例子:docker image rm centos:latest

导出镜像

docker save 例子:docker image save centos -o docker-centos7.4.tar.gz 

导入镜像

 docker load 例子:docker image load -i docker-centos7.4.tar.gz

8:docker的容器管理

docker run -d -p 80:80 nginx:latest  
run(创建并运行一个容器)
-d 放在后台
-p 端口映射
-v 源地址(宿主机):目标地址(容器)
nginx docker镜像的名字
docker run -it --name centos6 centos:6.9 /bin/bash
-it   分配交互式的终端interactive tty
--name 指定容器的名字
/bin/sh覆盖容器的初始命令

运行容器

docker run image_name   
docker run ==== docker create  + docker start

启动容器

docker start

停止容器

docker stop CONTAINER_ID

杀死容器

docker kill container_name

查看容器列表

docker ps(-a -l  -q)

进入正在运行的容器(目的,调试,排错)

docker exec  (会分配一个新的终端tty)
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker exec -it  容器id或容器名字 /bin/bash(/bin/sh)   
docker attach(使用同一个终端)  偷偷离开的快捷键ctrl+p,ctrl+q
docker attach [OPTIONS] CONTAINER
nsenter(安装yum install -y util-linux 弃用)

删除容器

docker rm

批量删除容器

docker rm -f `docker ps -a -q`
for i in `docker ps -a|grep -i "exited"|awk '{print $1}' ` ; do docker rm -f $i ;done

注意: docker容器内的第一个进程(初始命令)必须一直处于前台运行的状态(必须夯住),否则这个容器,就会处于退出状态!

业务在容器中运行:初始命令一定要夯住并且启动服务
nginx -g 'daemon off;'
/usr/sbin/zabbix_agentd -f -c /etc/zabbix/zabbix_agentd.conf

9:docker容器的网络访问(端口映射)

指定映射(docker 会自动添加一条iptables规则来实现端口映射) -p

hostPort:containerPort -p ip:hostPort:containerPort 

10.0.0.100::53/udp 使用宿主机的10.0.0.100这个ip地址的随机端口的udp协议映射

多个容器都想使用80端口

-p ip::containerPort(随机端口) -p hostPort:containerPort/udp -p 

容器的udp53端口 -p 81:80 –p 443:443 可以指定多个-p

随机映射 docker run -P (随机端口)
通过iptables来实现的端口映射

10:docker的数据卷管理

nginx 站点 /usr/share/nginx/html   -v /opt/xiaoniao:/usr/share/nginx/html

持久化 数据卷(文件或目录) -v 卷名:/data (第一次卷是空,会容器的数据复制到卷中,如果卷里面有数据,把卷数据的挂载到容器中) -v src(宿主机的目录):dst(容器的目录)

数据卷容器 --volumes-from(跟某一个已经存在的容器挂载相同的卷)基于nginx启动一个容器,监听80和81,访问80,出现nginx默认欢迎首页,访问81,出现小鸟。

-p 80:80 -p 81:81 -v xxx:xxx -v xxx:xxxx 基于nginx多端口的多站点。

11:手动将容器保存为镜像

docker commit 容器id或者容器的名字 新的镜像名字[:版本号可选]

(1):基于容器制作镜像

#使用alpine系统,制作静态镜像(yiliao)
#查看alpine的源
cat /etc/apk/repositories 
http://dl-cdn.alpinelinux.org/alpine/v3.9/main
http://dl-cdn.alpinelinux.org/alpine/v3.9/community
#把alpine的源替换成清华源(清华源的命令)
 sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories
apk add nginx      #安装nginx
mkdir /run/nginx
nginx               #启动nginx,需要创建路径
vi default.conf  
cd /html/
apk add curl    #安装curl
curl -o yiliao.zip http://192.168.37.200/191127/everyxiaoqiang-yiliao-master.zip   #下载yiliao包
unzip yiliao.zip 
mv yiliao/* .
nginx
hostname    #查看主机名,hostnameID号
 exit
docker commit ed8da336b045 yiliao:apline    #提交成镜像
docker run -d -p 82:81 yiliao:apline nginx -g 'daemon off;'  #运行容器
docker ps -a -l

**(2) 将容器提交为镜像 docker commit ed8da336b045 yiliao:apline **

(3)测试镜像功能是否可用

手动制作的镜像,传输时间长 镜像初始命令

12:dockerfile自动构建docker镜像

类似ansible剧本,大小几kb 手动做镜像:大小几百M+
dockerfile 支持自定义容器的初始命令
dockerfile主要组成部分:
基础镜像信息 FROM centos:6.9
制作镜像操作指令 RUN yum install openssh-server -y
容器启动时执行初始命令 CMD ["/bin/bash"]
dockerfile常用指令

FROM 指定基础镜像
MAINTAINER 指定维护者信息,可以没有
LABLE 描述,标签
RUN 在命令前面加上RUN即可
ADD 会自动解压tar 制作docker基础的系统镜像
VOLUME 设置卷,挂载主机目录
WORKDIR 设置当前工作目录
EXPOSE 指定对外的端口 -P 随机端口
CMD (指定容器启动后的要干的事情(容易被替换)
COPY 复制文件(不会解压)
ENV 环境变量(密码,其他信息)
ENTRYPOINT 容器启动后执行的命令(无法被替换,启容器的时候指定的命令,会被当成参数)

13:docker镜像的分层(kvm 链接克隆,写时复制的特性)

镜像分层的好处:复用,节省磁盘空间,相同的内容只需加载一份到内存。 修改dockerfile之后,再次构建速度快

dockerfile 优化:

1:尽可能选择体积小linux发行版,alpine

2:尽可能合并RUN指令,清理无用的文件(yum缓存,源码包)

3:修改dockerfile,把变化的内容尽可能放在dockerfile结尾

4: 使用.dockerignore,减少不必要的文件ADD . /html


docker run -d -p 80:80 nginx

docker run -it --link quirky_brown:web01 qstack/centos-ssh /bin/bash

ping web01lb ---> nginx 172.17.0.4 --> db01 172.17.0.3 --> nfs01 172.17.0.2

使用docker运行zabbix-server

 \#导入镜像
[root@docker01 srv]# for n in `ls *`;do docker load -i $n ;done 
\#根据官网配置,可以直接使用		 
docker run --name mysql-server -t \   # -t=--it 分配终端
   -e MYSQL_DATABASE="zabbix" \    #--env  环境变量
   -e MYSQL_USER="zabbix" \
   -e MYSQL_PASSWORD="zabbix_pwd" \
   -e MYSQL_ROOT_PASSWORD="root_pwd" \
   -d mysql:5.7 \           #-d后台运行
   --character-set-server=utf8 --collation-server=utf8_bin #EXPONIT

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

监控报警:微信报警,alpine
yum 安装zabbix好使

15:docker registry(私有仓库)

15.1普通的registry

docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry  registry

上传镜像到私有仓库:

a:给镜像打标签 docker tag centos6-sshd:v3 10.0.0.11:5000/centos6-sshd:v3 

b:上传镜像 docker push 10.0.0.11:5000/centos6-sshd:v3
如果遇到报错: The push refers to repository [10.0.0.11:5000/centos6.9_ssh] Get https://10.0.0.11:5000/v2/: http: server gave HTTP response to HTTPS client
解决方法:
vim  /etc/docker/daemon.json

{
  "insecure-registries": ["10.0.0.11:5000"]
}
systemctl restart docker

16:docker-compose(单机版的容器编排工具)

ansible剧本 yml

yum install -y docker-compose(需要epel源)

cd my_wordpress/ vi docker-compose.yml

version: '3'

services:
   db:
     image: mysql:5.7
     volumes:
       - /data/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:
       - /data/web_data:/var/www/html
     ports:
       - "80:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress

启动

docker-compose up

后台启动

docker-compose up -d

17:重启docker服务,容器全部退出的解决办法

方法一:docker run --restart=always
方法二:"live-restore": true docker server配置文件/etc/docker/daemon.json
 参考 { "registry-mirrors": ["http://b7a9017d.m.daocloud.io"], "insecure-registries":["10.0.0.11:5000"], "live-restore": true } 

18:docker企业级镜像仓库harbor(vmware 中国团队)

第一步:安装docker和docker-compose

[root@docker02 ~]# wget http://192.168.37.200/191127/docker_rpm.tar.gz
[root@docker02 ~]# tar xf docker_rpm.tar.gz
[root@docker02 ~]# cd docker_rpm/
[root@docker02 ~]# yum localinstall *.rpm -y
[root@docker02 ~]# systemctl start docker
[root@docker02 ~]# cd /etc/yum.repos.d/
[root@docker02 ~]# rm -f local.repo
[root@docker02 ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo
http://mirrors.aliyun.com/repo/Centos-7.repo
[root@docker02 ~]# curl -o /etc/yum.repos.d/epel.repo
http://mirrors.aliyun.com/repo/epel-7.repo
[root@docker02 ~]# yum install docker-compose -y
[root@docker02 ~]# echo "192.168.37.200 mirrors.aliyun.com" >>/etc/hosts
[root@docker02 ~]# yum install docker-compose -y

第二步:下载harbor-offline-installer-v1.5.1.tgz

第三步:上传到/opt,并解压

[root@docker02 opt]# ls
containerd  harbor harbor-offline-installer-v1.8.0.tgz 

*第四步:修改harbor.cfg配置文件 **

[root@docker02 opt]# cd harbor/
[root@docker02 harbor]# ls
common docker-compose.yml harbor.v1.8.0.tar.gz harbor.yml install.sh
LICENSE prepare
[root@docker02 harbor]# vim harbor.yml
hostname: 10.0.0.12
port: 80
harbor配置https:
harbor_admin_password = 123456

第五步:执行install.sh

[root@docker02 harbor]# ./install.sh
[root@docker02 ~]# docker push 10.0.0.12:5000/nginx:latest
#当报以下错误时
push refers to repository [10.0.0.12/library/apline]
Get https://10.0.0.12/v2/: dial tcp 10.0.0.12:443: connect: connection
refused
[root@docker02 ~]# cat /etc/docker/daemon.json
{
 "insecure-registries": ["10.0.0.12"],
 "registry-mirrors": ["https://registry.docker-cn.com"]
}
[root@docker02 ~]# systemctl restart docker
[root@docker02 ~]# docker push 10.0.0.12:5000/nginx:latest

harbor配置https

#下载证书
[root@docker02 ~]# cd /opt/
[root@docker02 opt]# ls
containerd docker_nginx.tar.gz harbor harbor-offline-installer-v1.8.0.tgz
zhengshu
[root@docker02 opt]# cd zhengshu/
[root@docker02 zhengshu]# ls
Apache blog.oldqiang.com.csr blog.oldqiang.com.zip IIS nginx Tomcat
#找出两个证书存放的路径
[root@docker02 nginx]# ls /opt/zhengshu/nginx/1_blog.oldqiang.com_bundle.crt
/opt/zhengshu/nginx/1_blog.oldqiang.com_bundle.crt
[root@docker02 nginx]# ls /opt/zhengshu/nginx/2_blog.oldqiang.com.key
/opt/zhengshu/nginx/2_blog.oldqiang.com.key
#编辑以下文件
[root@docker02 harbor]# vim harbor.yml
...
hostname: blog.oldqiang.com
https:
port: 443
certificate: /opt/zhengshu/nginx/1_blog.oldqiang.com_bundle.crt
private_key: /opt/zhengshu/nginx/2_blog.oldqiang.com.key
harbor_admin_password: 123456
...
#改变配置文件需要重新运行脚本
#再次执行脚本会很慢,所以注释load
[root@docker02 harbor]# vim install.sh
docker load -i ./harbor*.tar.gz
[root@docker02 harbor]# ./install.sh
#以下信息证明执行成功
✔ ----Harbor has been installed and started successfully.----
Now you should be able to visit the admin portal at
https://blog.oldqiang.com.
For more details, please visit https://github.com/goharbor/harbor .
#在本地电脑劫持
10.0.0.12 blog.oldqiang.com

1575634492525

1575634498006

#在10.0.0.12上面不能pull,会报错
[root@docker02 harbor]# docker pull blog.oldqiang.com/library/apline:3.9
Error response from daemon: Get https://blog.oldqiang.com/v2/: x509:
certificate is valid for *.cdn.myqcloud.com, *.2144.cn, *.2144.com,
*.58cdn.com.cn, *.admin.flash.2144.com, *.admin.flash.cn, *.dpfile.com,
*.ffnews.cn, *.flash.2144.com, *.flash.cn, *.sogoucdn.com, *.stage.flash.cn,
*.wanyabox.com, not blog.oldqiang.com
#在10.0.0.12上面进行劫持
[root@docker02 harbor]# cat /etc/hosts
127.0.0.1  localhost localhost.localdomain localhost4
localhost4.localdomain4
::1     localhost localhost.localdomain localhost6
localhost6.localdomain6
10.0.0.11 docker01
10.0.0.12 docker02
10.0.0.12 blog.oldqiang.com
[root@docker02 harbor]# docker pull blog.oldqiang.com/library/apline:3.9
3.9: Pulling from library/apline
e7c96db7181b: Pull complete
Digest:
sha256:bf1684a6e3676389ec861c602e97f27b03f14178e5bc3f70dce198f9f160cce9
Status: Downloaded newer image for blog.oldqiang.com/library/apline:3.9
blog.oldqiang.com/library/apline:3.

1575634667974

#下载时需要登录
[root@docker02 harbor]# docker pull blog.oldqiang.com/library/apline:3.9
Error response from daemon: pull access denied for
blog.oldqiang.com/library/apline, repository does not exist or may require
'docker login': denied: requested access to the resource is denied
#进行登录,在pull
[root@docker02 harbor]# docker login blog.oldqiang.com
Username: admin
Password:
WARNING! Your password will be stored unencrypted in
/root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-
store
Login Succeeded
[root@docker02 harbor]# docker pull blog.oldqiang.com/library/apline:3.9
3.9: Pulling from library/apline
Digest:
sha256:bf1684a6e3676389ec861c602e97f27b03f14178e5bc3f70dce198f9f160cce9
Status: Image is up to date for blog.oldqiang.com/library/apline:3.9
blog.oldqiang.com/library/apline:3.9

19.将docker-register迁移到harbo仓库

#将以下项目进行迁移
[root@docker01 ~]# ls /opt/myregistry/docker/registry/v2/repositories/
nginx tes

1575634731692

1575634736942

3.同步管理

1575634755154

1575634776499

1575634786182

20.docker网络类型

connect     Connect a container to a network #连接
create      Create a network #创建
disconnect  Disconnect a container from a network #断开连接
inspect     Display detailed information on one or more networks #查看详细信息
ls          List networks
prune       Remove all unused networks #移除没有使用的网络
rm          Remove one or more networks #删除一个或多个网络
None:不为容器配置任何网络功能,--net=none 
Container:与另一个运行中的容器共享Network Namespace,--net=container:containerID(K8S)
Host:与宿主机共享Network Namespace,--network=host 性能最高
Bridge:Docker设计的NAT网络模型 默认类型

20:Docker跨主机容器之间的通信macvlan

默认一个物理网卡,只有一个物理mac地址,虚拟多个mac地址

## 创建macvlan网络
docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
## 设置eth0的网卡为混杂模式
ip link set eth0 promisc on
## 创建使用macvlan网络的容器
docker run -it --network macvlan_1 --ip=10.0.0.200 busybox

21.Docker跨主机容器通信之overlay

docke3上:consul存储IP地址的分配

docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap

设置容器的主机名

docker01、02上:
vim  /etc/docker/daemon.json
{
  "cluster-store": "consul://10.0.0.13:8500", 
  "cluster-advertise": "10.0.0.11:2376" #宿主机的ip
}

创建overlay网络

 docker network create -d overlay --subnet 172.16.2.0/24 --gateway 172.16.2.254 ol1 

启动容器测试

docker run -it --network ol1 --name oldboy01 busybox /bin/sh 
每个容器有两块网卡,eth0实现容器间的通讯,eth1实现容器访问外网

1575805149179

22.Docker 监控

docker cadvisor监控 + prometheus + grafana

为了解决docker stats的问题(存储、展示),谷歌开源的cadvisor诞生了,cadvisor不仅可以搜集
一台机器上所有运行的容器信息,还提供基础查询界面和http接口,方便其他组件如Prometheus进行数
据抓取,或者cadvisor + influxdb + grafna搭配使用。
cAdvisor可以对节点机器上的资源及容器进行实时监控和性能数据采集,包括CPU使用情况、内存使用
情况、网络吞吐量及文件系统使用情况
Cadvisor使用Go语言开发,利用Linux的cgroups获取容器的资源使用信息,在K8S中集成在Kubelet
里作为默认启动项,官方标配。

1575805277312

#组件
db数据库
#配置prometheus.yml监控下边的主机,多监控主机或指标需要改变这个配置文件,数据默认存在本地数据
库,取值监控跟zabbix不同,是全局配置,需要在配置文件上配置
cadvisor监控
node-exporter复制采集数据 监听端口,提供网页,打开就可以看到各项指标
mysql-exporter监控数据库 同上
redis-exporter监控redis 同上
报警插件可以单独装在另一台主机,需要定义rule.yml文件。需要在prometheus主机配置文件上配置报警
#数据可以使用grafana进行展示
#增加node节点,在所有被监控宿主机上操作
上传docker_monitor_node.tar.gz
直接docker load 导入即可
#启动node-exporter
docker run -d  -p 9100:9100  -v "/:/host:ro,rslave"  --name=node_exporter 
quay.io/prometheus/node-exporter  --path.rootfs /host
#启动cadviso
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
#下载普罗米修斯二进制包解压
vim prometheus.yml
...
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped
from this config.
- job_name: 'prometheus'
 static_configs:
 - targets: ['localhost:9090']
- job_name: 'cadvisor'
 static_configs:
 - targets: ['10.0.0.11:8080','10.0.0.100:8080']
- job_name: 'node-exporter'
 static_configs:
 - targets: ['10.0.0.11:9100','10.0.0.100:9100']
...
#启动普罗米修斯
./prometheus --config.file="prometheus.yml"
#访问页面
http://localhost:9090
#可以加上grafana出图
只需要安装启动选择相应的source再import相应的dashboard即可
#安装grafana(300)
[root@docker03 ~]# wget http://192.168.37.200/191127/grafana-6.3.3-
1.x86_64.rpm
[root@docker03 ~]# yum localinstall grafana-6.3.3-1.x86_64.rpm -y
[root@docker03 ~]# systemctl start grafana-server.service
[root@docker03 ~]# systemctl enable grafana-server.service
[root@docker03 ~]# netstat -lntup
tcp6    0    0 :::3000         :::*          LISTEN 

1575807782872

1575807788600

docker zabbix监控 低级自动发现 自动创建监控项

docker 容器:重复 ,名字不一样 ,id不一样
zabbix 低级自动发现 low level discovery LLD
硬盘 vda,vdb,sda,sdb,hd1,hd2
网卡:eth0-eth3,em0-em3,ens3,eno
重复:网卡,进来的流量,出去的流量,丢包率
#在容器10.0.0.11上启动zabbix的容器
[root@docker01 ~]# cd /zabbix/
[root@docker01 zabbix]# docker-compose up -d
[root@docker01 zabbix]# docker-compose restart zabbix-server
[root@docker02 ~]# systemctl restart zabbix-agent.service
#在web页面操作
[root@docker02 ~]# dd if=/dev/zero of=/opt/test.raw bs=200M count=1
[root@docker02 ~]# mkfs.xfs /opt/test.raw
[root@docker02 ~]# mount -o loop /opt/test.raw /mnt
#打印zabbix的内置key
[root@docker01 ~]# zabbix_agentd -p
net.if.in[lo,bytes]              [u|253155]
net.if.out[lo,bytes]             [u|253155]
net.if.total[lo,bytes]            [u|506310]
下载zabbix测试工具
[root@docker01 ~]# wget
https://mirror.tuna.tsinghua.edu.cn/zabbix/zabbix/3.2/rhel/7/x86_64/zabbix-
get-3.2.11-1.el7.x86_64.rpm
[root@docker01 ~]# rpm -ivh zabbix-get-3.2.11-1.el7.x86_64.rpm
[root@docker01 ~]# zabbix_get -s 10.0.0.12 -k net.if.mac[eth0]
00:0c:29:4b:f0:71
[root@docker01 ~]# zabbix_get -s 10.0.0.12 -k net.if.mac[docker0]
02:42:8d:58:b4:1c
#使用zabbix低级自动发现监控docker容器
1:在docker宿主机上编写扫描docker容器名称的脚本
[root@node1 zabbix_agentd.d]# cat /etc/zabbix/script/docker_discovery.sh
#!/bin/bash
port=($(/usr/bin/docker ps -a|grep -v "CONTAINER ID"|awk '{print $NF}')) 
 #定义数组
printf '{\n'
printf '\t"data":[\n'
 for key in ${!port[@]}          #统计数组长度并遍历
   do
    if [[ "${#port[@]}" -gt 1 && "${key}" -ne "$((${#port[@]}-1))"
]];then
      printf '\t {\n'
      printf "\t\t\t\"{#CONTAINERNAME}\":\"${port[${key}]}\"},\n"
    else [[ "${key}" -eq "((${#port[@]}-1))" ]]
      printf '\t {\n'
      printf "\t\t\t\"{#CONTAINERNAME}\":\"${port[${key}]}\"}\n"
     fi
 done
      printf '\t ]\n'
      printf '}\n'
#脚本的详细执行流程
[root@docker02 scripts]# sh -x docker_discovery.sh
+ port=($(/usr/bin/docker ps -a|grep -v "CONTAINER ID"|awk '{print $NF}'))
++ /usr/bin/docker ps -a
++ grep -v 'CONTAINER ID'
++ awk '{print $NF}'
+ printf '{\n'
{
+ printf '\t"data":[\n'
"data":[
+ for key in '${!port[@]}'
+ [[ 2 -gt 1 ]]
+ [[ 0 -ne 1 ]]
+ printf '\t {\n'
{
+ printf '\t\t\t"{#CONTAINERNAME}":"modest_mahavira"},\n'
"{#CONTAINERNAME}":"modest_mahavira"},
+ for key in '${!port[@]}'
+ [[ 2 -gt 1 ]]
+ [[ 1 -ne 1 ]]
+ [[ 1 -eq ((2-1)) ]]
+ printf '\t {\n'
{
+ printf '\t\t\t"{#CONTAINERNAME}":"practical_dewdney"}\n'
"{#CONTAINERNAME}":"practical_dewdney"}
+ printf '\t ]\n'
]
+ printf '}\n'
}
#脚本最终执行的效果,满足官方的要求
[root@docker02 scripts]# sh docker_discovery.sh
{
"data":[
{
"{#CONTAINERNAME}":"modest_mahavira"},
{
"{#CONTAINERNAME}":"practical_dewdney"}
]
}
[root@docker02 scripts]# cat /etc/zabbix/zabbix_agentd.d/user_define.conf
UserParameter=net.if.mac[*],ifconfig $1 | awk '/ether /{print $$2}'
UserParameter=docker.discovery,/bin/bash /scripts/docker_discovery.sh
[root@docker02 scripts]# systemctl restart zabbix-agent.service
#进行测试,如果发现以下错误时,说明权限不够
[root@docker01 ~]# zabbix_get -s 10.0.0.12 -k docker.discovery
Got permission denied while trying to connect to the Docker daemon socket
at unix:///var/run/docker.sock: Get
http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/json?all=1: dial unix
/var/run/docker.sock: connect: permission denied
{
"data":[
]
}
#修改权限,再次测试
[root@docker02 scripts]# chmod u+s /usr/bin/docker
[root@docker02 scripts]# ll /var/run/docker.sock         #还可以将此
权限改为777
srw-rw---- 1 root docker 0 Dec  7 09:56 /var/run/docker.sock
[root@docker01 ~]# zabbix_get -s 10.0.0.12 -k docker.discovery
{
"data":[
{
"{#CONTAINERNAME}":"modest_mahavira"},
{
"{#CONTAINERNAME}":"practical_dewdney"}
]
}
#注意事项!!!
zabbix-agent在取值的时候使用的是zabbix用户,在执行docker ps -a会没有权限执行
解决方法有两种
1:添加sudo授权
2:给docker命令加suid权限
chmod u+s /usr/bin/docker
推荐使用第二种,比较简单
#判断容器是否存活
[root@docker02 scripts]# docker ps -a | grep practical_dewdney | grep -c
Up
1
[root@docker02 scripts]# docker run -d --name test alpine:3.9    #此方法
创建的不存活
d48df31e71d655bb55798675c016afcfaa1ba5faf972587044701bd965f3d295
[root@docker02 scripts]# docker ps -a
CONTAINER ID    IMAGE        COMMAND       CREATED   
   STATUS           PORTS        NAMES
d48df31e71d6    alpine:3.9      "/bin/sh"      12 seconds ago
  Exited (0) 11 seconds ago            test
dc80d7b60af3    alpine:3.9      "/bin/sh"      44 minutes ago
  Up 44 minutes                  modest_mahavira
68164af3e8e0    alpine:3.9      "/bin/sh"      57 minutes ago
  Up 57 minutes                  practical_dewdney
[root@docker02 scripts]# docker ps -a|grep test|grep -c Up
0
#编写自定义的监控项脚本,并测试 (可以编写脚本实现)
[root@docker02 scripts]# cat /etc/zabbix/zabbix_agentd.d/user_define.conf
UserParameter=net.if.mac[*],ifconfig $1 | awk '/ether /{print $$2}'
UserParameter=docker.discovery,/bin/bash /scripts/docker_discovery.sh
UserParameter=docker_alive[*],/usr/bin/docker ps -a|grep $1|grep -c Up
[root@docker02 scripts]# systemctl restart zabbix-agent.service
[root@docker01 ~]# zabbix_get -s 10.0.0.12 -k docker_alive[test]
0
[root@docker01 ~]# zabbix_get -s 10.0.0.12 -k
docker_alive[practical_dewdney]
1
#数组验证
[root@docker02 ~]# docker run -it -d alpine:3.9
68164af3e8e041bed51227fb6277af6d75c6f05227bec6168dfa0847b3ba4b1f
[root@docker02 ~]# port=($(/usr/bin/docker ps -a|grep -v "CONTAINER
ID"|awk '{print $NF}'))
[root@docker02 ~]# echo "$port"
practical_dewdney
[root@docker02 ~]# docker ps -a
CONTAINER ID    IMAGE        COMMAND       CREATED   
   STATUS       PORTS        NAMES
68164af3e8e0    alpine:3.9      "/bin/sh"      9 minutes ago
   Up 9 minutes              practical_dewdney
[root@docker02 ~]# docker run -it -d alpine:3.9 #再次启动一个镜像
[root@docker02 ~]# docker ps -a
CONTAINER ID    IMAGE        COMMAND       CREATED   
   STATUS       PORTS        NAMES
dc80d7b60af3    alpine:3.9      "/bin/sh"      20 seconds ago
  Up 20 seconds              modest_mahavira
68164af3e8e0    alpine:3.9      "/bin/sh"      13 minutes ago
  Up 13 minutes              practical_dewdney
[root@docker02 ~]# port=($(/usr/bin/docker ps -a|grep -v "CONTAINER
ID"|awk '{print $NF}'))
[root@docker02 ~]# echo ${port[1]}
practical_dewdney
[root@docker02 ~]# echo ${port[0]}
modest_mahavira

创建主机监控项

1575807916689

1575807922875

创建监控项原型

1575807934935

1575807953590

查看最新数据

1575807968861

创建正则匹配,过滤oldxu

1575807981985

1575807987298

配置过滤器

1575808000817

1575808006899

zabbix官网:(LLD)

zabbix官网:(LLD)

自动发现(LLD)提供了一种在计算机上为不同实体自动创建监控项,触发器和图形的方法。例如,
Zabbix可以在你的机器上自动开始监控文件系统或网络接口,而无需为每个文件系统或网络接口手动创
建监控项。此外,可以配置Zabbix根据定期执行发现后的得到实际结果,来移除不需要的监控。

用户可以自己定义发现类型,只要它们遵循特定的JSON协议。

发现过程的一般架构如下。

首先,用户在“配置”→“模板”→“发现”列中创建一个发现规则。发现规则包括(1)发现必要实体(例
如,文件系统或网络接口)的项 和(2)应该根据该项的值创建的监控项,触发器和图形的原型
发现所需实体的项就像其他地方所看到的常规项一样:服务器(server)向Zabbix agent(或者对
应该项的其他类型的设置)查询该项的值,agent以文本值进行响应。区别在于agent响应的值应该包
含特定JSON格式的已发现实体的列表。虽然这个列表的详细信息仅对自定义发现检查来说很重要,但有
必要知道返回的值包含宏 - >值对的列表。 例如,项目“net.if.discovery”可能会返回两
对:“{#IFNAME}” - >“lo”和“{#IFNAME}” - >“eth0”。

这些宏用于名称,键值和其他原型字段中,然后用接收到的值为每个发现的实体创建实际的监控项,触
发器,图形甚至主机。请参阅使用LLD宏选项的完整列表。 。

当服务器接收到已发现项的值时,它会查看宏→值对,每对都根据原型生成实际监控项,触发器和图形。
在上面的“net.if.discovery”示例中,服务器将生成环路接口“lo”的一组监控项,触发器和图表,
另一组用于界面“eth0”。

配置低级别发现(LLD)

这里有个例子可以最好地证明需要的JSON格式。假设我们正在运行一个接的Zabbix 1.8 agent(不
支持“vfs.fs.discovery”),但我们仍旧需要发现文件系统。这有一个简单的Linux Perl脚本,
可以发现挂载的文件系统,并输出JSON,其中包括文件系统的名称和类型。一种使用它的方式是使用键
“vfs.fs.discovery_perl”作为UserParameter:

#!/usr/bin/perl

$first = 1;
print "{\n";
print "\t\"data\":[\n\n";
for (`cat /proc/mounts`)
{
 ($fsname, $fstype) = m/\S+ (\S+) (\S+)/;
 print "\t,\n" if not $first;
  $first = 0;
 print "\t{\n";
 print "\t\t\"{#FSNAME}\":\"$fsname\",\n";
 print "\t\t\"{#FSTYPE}\":\"$fstype\"\n";
 print "\t}\n";
}
print "\n\t]\n";
print "}\n";
其输出示例(为清晰起见重新格式化)如下所示。 自定义发现检查的JSON必须遵循相同的格式。
{
 "data":[
{ "{#FSNAME}":"/",              "{#FSTYPE}":"rootfs"  },
{ "{#FSNAME}":"/sys",             "{#FSTYPE}":"sysfs"  },
{ "{#FSNAME}":"/proc",            "{#FSTYPE}":"proc"   },
{ "{#FSNAME}":"/dev",             "{#FSTYPE}":"devtmpfs" },
{ "{#FSNAME}":"/dev/pts",           "{#FSTYPE}":"devpts"  },
{ "{#FSNAME}":"/lib/init/rw",         "{#FSTYPE}":"tmpfs"  },
{ "{#FSNAME}":"/dev/shm",           "{#FSTYPE}":"tmpfs"  },
{ "{#FSNAME}":"/home",            "{#FSTYPE}":"ext3"   },
{ "{#FSNAME}":"/tmp",             "{#FSTYPE}":"ext3"   },
{ "{#FSNAME}":"/usr",             "{#FSTYPE}":"ext3"   },
{ "{#FSNAME}":"/var",             "{#FSTYPE}":"ext3"   },
{ "{#FSNAME}":"/sys/fs/fuse/connections",   "{#FSTYPE}":"fusectl" }
]
}
[root@docker01 ~]# zabbix_get -s 10.0.0.12 -k net.if.discovery
{"data":[{"{#IFNAME}":"eth0"},{"{#IFNAME}":"br-7a31caf4e006"},{"
{#IFNAME}":"lo"},{"{#IFNAME}":"docker_gwbridge"},{"{#IFNAME}":"docker0"}]}

2:在docker宿主机上编写docker容器的取值脚本

#此脚本来源于  https://oldqiang.com/archives/607.html
#取值来源/usr/bin/docker stats --no-stream
[root@node1 zabbix_agentd.d]# cat /etc/zabbix/script/docker_monitor.sh
#!/bin/bash
CACHEFILE="/tmp/docker_monitor_cache.txt"
CMD="/usr/bin/docker stats --no-stream"
if [ ! -f $CACHEFILE ];then
 $CMD >$CACHEFILE
fi
# Check and run the script
TIMEFLM=`stat -c %Y $CACHEFILE`
TIMENOW=`date +%s`
if [ `expr $TIMENOW - $TIMEFLM` -gt 60 ]; then
  rm -f $CACHEFILE
fi
if [ ! -f $CACHEFILE ];then
 $CMD >$CACHEFILE
fi
container_live() {
 grep "$1"  $CACHEFILE &>/dev/null
 if [ $? -eq 1 ];then
 echo '0'
 else
 echo '1'
 fi
 exit  0
}
container_id() {
  grep "$1"  $CACHEFILE|awk '{print $1}'
 exit  0
}
container_cpu() {
  grep "$1"  $CACHEFILE|awk '{print $3}'|tr -d '%'
  exit  0
}
container_mem_used() {
  grep "$1"  $CACHEFILE|awk '{print $4}'|tr -d 'MiB'
  exit  0
}
container_mem_pused() {
  grep "$1"  $CACHEFILE|awk '{print $7}'|tr -d '%'
  exit  0
}
container_net_in() {
  grep "$1"  $CACHEFILE|awk '{print $8}'|tr -d '%'
  exit  0
}
container_net_out() {
  grep "$1"  $CACHEFILE|awk '{print $10}'|tr -d '%'
  exit  0
}
container_disk_in() {
  grep "$1"  $CACHEFILE|awk '{print $11}'
  exit  0
}
container_disk_out() {
  grep "$1"  $CACHEFILE|awk '{print $13}'
  exit  0
}
case $1 in
live)
container_live $2;
;;
id)
container_id $2;
;;
cpu)
container_cpu $2;
;;
mem_used)
container_mem_used $2;
;;
mem_pused)
container_mem_pused $2;
;;
net_in)
container_net_in $2;
;;
net_out)
container_net_out $2;
;;
disk_in)
container_disk_in $2;
;;
disk_out)
container_disk_out $2;
;;
*)
echo '无效的参数';
exit 2;
esac

3:修改zabbix-agent配置文件

[root@node1 zabbix_agentd.d]# cat /etc/zabbix/zabbix_agentd.d/zbx_docker.conf
UserParameter=docker.discovery,/bin/bash
/etc/zabbix/script/docker_discovery.sh
UserParameter=docker_monitor[*],/bin/bash
/etc/zabbix/script/docker_monitor.sh $1 $2
systemctl  restart docker

4:使用zabbix-get测试取值

#测试1
[root@oldboy ~]# zabbix_get -s 10.0.0.12 -k docker.discovery
{
  "data":[
  {
      "{#CONTAINERNAME}":"k8s_install-cni_kube-flannel-ds-amd64-
4cr9d_kube-system_39d5a60d-702c-466c-97e0-85123e1a7869_0"},
  {
      "{#CONTAINERNAME}":"k8s_nginx_nginx_default_3f5ffd65-a233-48c5-
973d-b43922ccea61_0"},
  {
      "{#CONTAINERNAME}":"k8s_POD_nginx_default_3f5ffd65-a233-48c5-
973d-b43922ccea61_0"},
  {
    "{#CONTAINERNAME}":"k8s_kube-flannel_kube-flannel-ds-amd64-
4cr9d_kube-system_39d5a60d-702c-466c-97e0-85123e1a7869_3"},
  {
      "{#CONTAINERNAME}":"k8s_kube-proxy_kube-proxy-sqhs4_kube-
system_1c7fac8f-5263-4cd8-b008-485f1dd44ad1_3"},
  {
      "{#CONTAINERNAME}":"k8s_POD_kube-flannel-ds-amd64-4cr9d_kube-
system_39d5a60d-702c-466c-97e0-85123e1a7869_3"},
  {
      "{#CONTAINERNAME}":"k8s_POD_kube-proxy-sqhs4_kube-
system_1c7fac8f-5263-4cd8-b008-485f1dd44ad1_3"}
  ]
}
#测试2
[root@oldboy ~]# zabbix_get -s 10.0.0.12 -k
docker_monitor[mem_used,k8s_nginx_nginx_default_3f5ffd65-a233-48c5-973d-
b43922ccea61_0]
3.102
posted @ 2020-03-19 17:13  爱可耐  阅读(293)  评论(0编辑  收藏  举报