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

原文链接:https://blog.csdn.net/baozexu/article/details/128040070?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168994567316782425126562%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=168994567316782425126562&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~times_rank-6-128040070-null-null.268%5Ev1%5Ekoosearch&utm_term=docker%E3%80%81wordpress%E3%80%81wordpress%E5%BB%BA%E7%AB%99%E3%80%81wordpress%E4%B8%BB%E9%A2%98%E3%80%81%E5%AE%B9%E5%99%A8%E9%95%9C%E5%83%8F%E3%80%81

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享