Docker
解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术
docker三要素: 仓库、镜像、容器
? author->xiaokai
一、简介
? 实际上就是一个缩小版、精细版、高度浓缩版、小型的linux系统
? 最大的公开库: docker hub (国外速度非常之缓慢,所以有了阿里云/ 易云等活雷锋)
? 官 :https://www.docker-cn.com/
- 镜像:就是一个只读的模板,可以用来创建Docker容器,一个镜像可以创建很多容器。(相当于java中的Person实体类)
- 容器(container):容器是用镜像创建的运行实例。容器之间相互隔离。容器可以被启动、开始、停止、删除。(相当于new Person()对象)
- 仓库:仓库是集中存放镜像文件的场所。仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
- 三要素工作原理:
- Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就似乎 image镜像文件。只有通过这个镜像文件才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
二、Docker安装
前提条件:
? 目前,CentOS 仅发行版本中的内核支持 Docker。
? Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
? Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。
1、centos6安装
-
yum install -y epel-release
-
yum install -y docker-io
理论上是直接install,但是因为仓库在国外,速度慢会提示no packge docker-io availabled 导致安装失败
所以使用国内镜像直接下载: yum install https://get.docker.com/rpm/1.7.1/centos-6/RPMS/x86_64/docker-engine-1.7.1-1.el6.x86_64.rpm
-
安装后的配置文件:/etc/sysconfig/docker
-
配置aliyun容器加速器: 在此配置文件下配置:
-
other_args=“–registry-mirror=https://{自已的编码}.mirror.aliyuncs.com”
{自己的编码} 需要去aliyun开发者官 获取,在管理控制台->容器镜像服务->镜像加速器
-
-
-
启动Docker后台服务: service docker start
-
检查是容器加速器是否配置成功: ps -ef | grep docker
? 进程详情后面会有配置的容器加速器的aliyun路径
-
docker version验证:
2、centos7安装
-
确定系统是centos7及以上版本: cat /etc/redhat-release
-
yum安装gcc相关:
- yum -y install gcc
- yum -y install gcc-c++
-
卸载旧版本docker: yum -y remove docker docker-common docker-selinux docker-engine
-
安装需要的软件包: yum install -y yum-utils device-mapper-persistent-data lvm2
-
设置stable镜像仓库: yum-config-manager –add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
更新yum软件包索引: yum makecache fast
-
安装DOCKER CE : yum -y install docker-ce
- 也可以: yum install https://get.docker.com/rpm/1.7.1/centos-7/RPMS/x86_64/docker-engine-1.7.1-1.el7.centos.x86_64.rpm
-
启动docker: systemctl start docker
-
配置镜像加速(相当于中国的docker hub)
-
mkdir -p /etc/docker
-
vim /etc/docker/daemon.json
-
易云: {“registry-mirrors”: [“http://hub-mirror.c.163.com”] }
-
阿里云: { “registry-mirrors”: [“https://{自已的编码}.mirror.aliyuncs.com”]}
? {自己的编码} 需要去aliyun开发者官 获取,在管理控制台->容器镜像服务->镜像加速器
-
-
systemctl daemon-reload
-
systemctl restart docker
-
-
测试安装是否成功:
- docker version
- docker run hello-world
-
卸载:
- systemctl stop docker
- yum -y remove docker-ce
- rm -rf /var/lib/docker
centos7安装docker可以参考中文官 : https://docs.docker-cn.com/engine/installation/linux/docker-ce/centos/#prerequistes
三、Docker命令
1、帮助命令
- docker version docker相关的各种版本信息
- docker info docker更详细的容器/镜像/存储驱动数量位置等信息
- docker –help docker帮助命令
2、镜像命令
-
docker images 列出本地主机上的镜像;通过REPOSITORY:TAG,镜像名:版本 (默认是latest为最新版)来唯一定位镜像版本
- -a:列出本地所有的镜像(含中间映像层)
- -q:只显示镜像ID
- –digests:显示镜像的主要信息
- –no-trunc:显示完整的镜像信息
-
docker search xxx(某个镜像名字)
? 从http://hub.docker.com中加载xxx相关镜像文件(资源是国外,速度很慢)
- -s [N]:列出starts数不小于N的xxx相关镜像文件
- –no-trunc:显示完整的镜像描述
- –automated:只列出automates build类型的镜像
-
docker pull xxx:yyy
? 从自己配的aliyun仓库拉取xxx资源;xxx:yyy中xxx是净镜像名,yyy是版本 ,默认为latest最新版
-
docker rmi -f xxx:yyy 删除镜像
- 删除单个: docker rmi -f xxx
- 删除多个:docker rmi -f 镜像名1:TAG 镜像名2:TAG …
- 删除全部:docker rmi -f $(docker images -qa)
-
? 容器(定制版)生成镜像: 修改之后的容器生成保存了修改信息的新的镜像
-
docker history xxx:yyy 镜像层历史
- 列出xxx:yyy镜像层的变更历史信息
- –no-trunc : 显示完整的构建过程
3、容器命令
(1) 基础
-
新建并启动容器(在docker层使用)
? docker run [options] xxx:yyy
- –name 别名 :为容器指定一个名称
- -d:后台运行容器,并返回容器ID,也即启动守护式容器
- -i:以交互模式运行容器,通常与-t同时使用
- -t:为容器重新分配一个伪输入终端,通常与-i同时使用
- -P:随机端口映射
- -p:指定端口映射,有以下四种格式
- ip:hostPort:containerPort
- ip::containerPort
- hostPort:containerPort
- containerPort
- –restart:
- no – 容器退出时,不重启容器;
- on-failure – 只有在非0状态退出时才从新启动容器;
- always – 无论退出状态是如何,都重启容器;
-
创建容器
? docker create xxx:yyy
-
列出当前所有正在运行的容器(在docker层使用)
? docker ps [options]
- -a:列出当前所有正在运行的容器+历史上运行过的
- -l:显示最近创建的容器
- -n:显示最近n个创建的容器
- -q:静默模式,只显示编
- -no-trunc:不截断输出
-
暂停容器
? docker pause/unpause 容器ID
- pause 暂停
- unpause 解除暂停?
-
退出容器(在docker内部使用)
- exit 容器停止退出
- ctrl+P+Q 容器不停止退出
-
启动
? docker start 容器名或容器ID
-
重启
? docker restart 容器名或容器ID
-
停止
? docker stop 容器名或容器ID
-
强制停止容器
? docker kill 容器名或容器ID
-
删除已停止的容器
? docker rm 容器ID
- 删除多个
- docker rm -f $(docker ps -q)
- docker ps -qa | xargs docker rm
- 删除多个
(2) 升级==(重要)==
-
查看容器日志
? docker logs 容器ID
- -t:日志中加入时间戳
- -f:跟随最新的日志打印
- –tail [N]:显示最后多少条
-
查看容器内运行的进程
? docker top 容器ID
-
查看容器的内存使用情况
? docker stats 容器ID
-
查看容器内部细节-会返回一个json串
? docker inspect 容器ID
-
进入正在运行的容器并以命令行交互
- docker attach 容器ID或容器名 直接进去容器启动命令的终端,不会启动新的进程
-
docker exec 容器ID或容器名 SHELLBATH 在容器内打开新的终端,并且可以启动新的进程,把bashshell命令执行的结果直接显示出来
-
例子: docker exec 46e9e68e4ac5 ls /tmp
? docker exec -it 46e9e68e4ac5 /bin/bash
-
-
从容器内拷贝文件到主机上
? docker cp 容器ID:容器内路径 目的主机路径
4、资源管理
(1)内存限额
? 容器可使用的内存包括两部分:物理内存和swap。
-
run启动是指定参数分配内存
-
-m 或 –memory:设置物理内存的使用限额,例如100MB,2GB
-
–memory-swap:设置内存+swap的使用限额
-
只指定-m而不指定–memory-swap时,swap默认为物理内存的2倍
-
都不指定,默认为-l,不做内存限制,容器最多使用200M物理内存和200M的swap
-
例子:docker run -m 200M –memory-swap=300M centos
最多允许使用200M的内存和100M的swap
-
(2)CPU限额
? 默认所有容器可以平等地使用宿主机CPU资源并没有限制
- run启动是指定参数分配内存
- -c 或 –cpu-shares:设置容器使用CPU的权重
- 不指定,默认为1024
- 通过-c指定的并不是绝对数量,而是一个相对的权重
- 某个容器最终分配到的CPU资源取决于它的cpu share占所有容器cpu share总和的百分比
- 举例:两个容器A、B,A指定的-c为1024,B指定的-c为512;如果AB都运行时,cpu资源按照2:1的比例分配docker的cpu share总和;如果B运行A不运行,则B占100%的docker的cpu share总和
(3)BlockIO带宽限制
? Block IO指的是磁盘读写,docker可以通过设置权重、限制bps和iops的方式控制容器读写磁盘的带宽
-
权重
run启动是指定参数分配内存
–blkio-weight 参数改变Block IO的优先级,默认值为500,同CPU一样,也是设置权重百分比
-
bps和iops
bps:每秒读写数据量
iops:每秒IO的次数
-
–device-read-bps:限制读某个设备的bps
-
–device-write-bps:限制写某个设备的bps
-
–device-read-iops:限制读某个设备的iops
-
–device-write-iops:限制写某个设备的iops
-
举例:docker run -it –device-write-bps /dev/sda:30MB centos
? 限制centos容器写/dev/sda的速度为30MB/s
-
5、小总结
? docker命令图解见外层文件夹images
四、Docker镜像
1、镜像原理&&分层原理
? docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
? UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union 文件系统是 Docker 镜像的基础。
- bootfs(boot file system)主要包含bootloader和kernel(内核), bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
- rootfs (root file system) ,在bootfs的上层。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
- docker镜像都是只读的,容器启动时,可写层被加载到镜像的顶部,这一层通常被称作”容器层”,“容器层”之下都叫”镜像层”
- 分层原理的好处是资源共享,这也是为 什么镜像体积那么小的原因。
2、容器(定制版)生成镜像
? 见镜像命令
五、Docker容器数据卷
1、数据卷(Volume)
? 容器数据卷: 容器的持久化-容器和宿主机之间共享数据的通道
? 有点类似于redis的RDB/AOP,mysql的binlog,容器重启之后也会读取数据卷,追加宿主机新增内容
-
重点:
- 宿主机目录和容器内目录数据通道,相当于宿主机目录挂载到容器内目录(宿主机目录内文件会直接替换容器内目录文件;假如宿主机目录为空,容器内目录有文件,最终结果就是容器内目录也会空)
- 如果想要在宿主机指定一个目录使用容器内目录里的文件(容器内目录的初始文件直接在宿主机使用),解决办法是:指定数据卷的时候不指定宿主机目录,只指定容器内目标目录;之后使用docker inspect 容器ID 查看json中默认宿主机数据卷位置;自己建一个软链接链到默认数据卷位置。
(1)启动容器是直接命令添加数据卷
? docker run -it/-d -v /宿主机绝对路径目录:/容器绝对路径目录 镜像名
-
查看数据卷挂载成功的命令:docker inspect 容器ID 查看json串
-
-v /宿主机绝对路径目录:/容器绝对路径目录:ro
-
此参数增加:ro意思是read only,所以此时创建的数据卷在容器内只可读不可写,单项通道
只能:宿主机修改数据卷—>容器数据卷(此过程不可逆)
-
-
补充:
? Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied
? 解决办法:在挂载目录后多加一个–privileged=true参数即可
? 即: docker run –name 别名 -it –privileged=true 生成的新的镜像名
(2)DockerFile添加数据卷
? 第一步 宿主机任意目录下创建任意文件,写入DockerFile命令内容,内容如下:
? # volume test
? FROM centos
? VOLUME [“/dataVolumeContainer1”,“/dataVolumeContainer2”]
? CMD echo “finished,——–success1”
? CMD /bin/bash
? 第二步 根据此文件build后生成镜像
? docker build -f /宿主机文件绝对路径 -t 要生产成新的镜像名 .
? -f:DockerFile文件绝对路径
? -t:根据DockerFile生成的新的镜像名
? 注意: 命令最后的点(.)千万不要忘记
? 第三步 启动生成的镜像
? docker run –name 别名 -it 生成的新的镜像名
? 验证数据卷是否创建成功:docker inspect 容器ID 同时可以看到默认的宿主机数据卷路径
2、容器数据卷
? 多个容器以一个标准的DockerFile(有规定数据卷)文件生成的镜像,此时这多个容器就会有相同路径并且相同的文件名的数据卷,此数据卷把宿主机和好几个容器并联起来,我理解是形成一个数据卷带;此时一个容器的启停并不会影响测数据卷中的数据共享,这个现象称为容器数据卷。
? docker run -it –name xiaokai002 –volumes-from xiaokai001 xiaokai/centos
? –volumes-from:新的容器xiaokai002继承/共享xiaokai001的数据卷通道
? 前提是xiaokai001里通过DockerFile设置了数据卷
? 注意创建的时候: 使用的都是DockerFile生成的xiaokai/centos镜像,所以001和002是独立的两个容器,只不过共享了同一个数据卷通道而已。
? 容器数据卷寿命:容器之间配置信息的传递,数据卷的生命周期一致持续到没有容器使用它为止。
- 删除无主的数据卷
- docker volume prune
六、DockerFile解析
? DockerFile是用来构建Docker镜像的构建文件,由命令和参数构成的脚本,类似于shell脚本。
1、构建三步骤
- 一 编写DockerFile文件
- 二 docker build
- 三 run
2、DockerFile构建解析
-
编写规范
- 每条保留字指令都大写且后面不能为空,一个指令一行
- 指令从上到下顺序执行
- 注释符 : #
- 一行指令创建一个新的镜像层,并自动对镜像层进行commit
-
解析过程
- docker从基础镜像运行一个容器
- 执行一条指令并对容器做出修改
- 执行类似docker commit的操作提交一个新的镜像层
- docker再基于刚提交的镜像运行一个新的容器
- 执行dockerfile中的下一条指令直到所有指令都执行完成
3、DockerFile保留字指令
保留字 | 含义(用法) | 小写 |
---|---|---|
FROM | 基础镜像,当前镜像是基于哪个镜像的,所有镜像的根镜像是scratch | from |
MAINTAINER | 镜像维护者的姓名和邮箱 | maintainer |
RUN | 容器构建时需要运行的命令 | run |
EXPOSE | 当前容器对外暴露出的端口 | expose |
WORKDIR | 指定在创建容器后,终端默认登录进来的工作目录 | workdir |
ENV | 用来在构建镜像过程中设置环境变量 | environment |
ADD | 将宿主机目录下的文件拷贝进镜像且add命令会自动处理url和解压tar压缩包 | add |
COPY | 类似于add,拷贝文件和目录到镜像;将从构建上下文目录中的文件/目录复制到新的一层镜像内的位置 | copy |
VOLUME | 容器数据卷,用于数据保存和持久化,这种方式不可以指定宿主机的数据库目录,容器会自动生成一个目录,docker inspect 容器ID 查看 mounts可以看到自动生成的目录 | volume |
CMD | 1.指定一个容器启动时要运行的命令 2.DockerFile中可以有多个cmd命令,但只有最后一个生效,cmd会被docker run之后的参数替换 |
cmd |
ENTRYPOINT | 指定一个容器启动时要运行的命令,和cmd一样都是指定容器启动程序及参数 | entrypoint |
ONBUILD | 当构建一个被继承的DockerFile时运行命令,父镜像在被子继承后父镜像的onbuild被触发 没有子镜像继承就不生效 | onbuild |
4、实例
见同级DockerFile示例文件夹
七、Docker常用安装
1、mysql
-
docker pull mysql:5.7
-
docker启动mysql
- docker run -p 3333:3306 –name xiaokaimysql -v /DockerFile/mysql/conf:/etc/mysql/conf.d -v /DockerFile/mysql/logs:/logs -v /DockerFile/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=Password1! -d mysql:5.7
-
docker exec -it xiaokaimysql /bin/bash
mysql -uroot -pPassword1!
创建表创建数据测试docker的mysql
-
使用桌面的navicat工具连接docker中的mysql
ip:3333
-
docker外备份mysql数据
- docker exec xiaokaimysql sh -c ’ exec mysqldump –all-databases -uroot -p”Password1!” ’ > /DockerFile/mysql/all-databases.sql
-
以上都可以成功,即安装成功
2、redis
-
docker pull redis:3.0.4
-
docker run -p 6666:6379 –name xiaokairedis -v /DockerFile/redis/data:/data -v /DockerFile/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis:3.0.4 redis-server /usr/local/etc/redis/redis.conf –appendonly yes
-
在 /DockerFile/redis/conf/redis.conf文件夹下创建redis.conf
redis.conf文件内容见同级文件夹笔记 DockerFile示例xiaokairedis3.0.4示例redis.conf
-
docker exec -it xiaokairedis redis-cli
插入如下数据:
? 127.0.0.1:6379> set k1 v1;
? OK
? 127.0.0.1:6379> set k2 v2
? OK
? 127.0.0.1:6379> set k3 v3
? OK
? 127.0.0.1:6379> quit -
在/DockerFile/redis/data/路径下会有appendonly.aof文件
-
在宿主机上:
? redis-cli -p 6666
? 可以直接登录到docker里面的redis中
-
以上都可以成功,即安装成功
3、emqttd
- docker pull registry.cn-hangzhou.aliyuncs.com/synbop/emqttd:2.3.6
- docker run –name emq -p 18083:18083 -p 8083:8083 -d registry.cn-hangzhou.aliyuncs.com/synbop/emqttd:2.3.6
- http:127.0.0.1:18083
- 登录的用户名:admin 密码:public 这是默认的
- 有时候会 iptables错误,导致容器启动失败,具体原因没找到,但是重启一下docker服务就好了
八、本地镜像发布到阿里云
- 具体步骤见外侧文件夹:阿里云容器仓库使用
命令步骤如下:
? docker login –username=xxx registry.cn-hangzhou.aliyuncs.com(我自己的用户名:xxxxx 密码:xxxxx)
? docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/xiaokai/xiaokaicentos:[镜像版本 ]
? docker push registry.cn-hangzhou.aliyuncs.com/xiaokai/xiaokaicentos:[镜像版本 ]
- 注意username是你注册阿里云的名字, login之后要输的密码是你的仓库(registry)密码,并不是你的阿里云登录密码
- [ImageId]和[镜像版本 ]填写自己对应要上传的镜像文件信息
九、Docker 络
? docker 络的配置最好是在1.9.0及之后的版本配置,在1.9.0之后才有docker network命令
1、单主机
(1)三种原生态 络
? 查看docker 络命令:docker network ls
? 不指定默认为birdge 络,docker 1.9.0版本之前用–net指定,之后用–network指定
-
none 络-无 络模式
? none就是什么都没有的 络,挂在这个 络下的容器只有一个lo 卡
- run 启动时参数指定
- –network=none
- 使用场景
- 封闭的 络意味着隔离,隔离性要求较高的容器可以选择none
- run 启动时参数指定
-
host 络-宿主 络模式
? 容器的 络配置与宿主机完全一样, 卡,ip等都一模一样
- run启动时参数指定
- –network=host
- 使用场景
- 性能好,传输效率较高,但是要考虑端口冲突的问题
- run启动时参数指定
-
bridge 络-默认 络模式
? Docker安装时会创建一个名为docker0的linux bridge,如果不指定–network,创建的容器默认都会挂到docker0上。
? 容器的实际 卡和docker0的interfaces(连接)是一对veth pair。veth pair是一种成对出现的特殊 络设备(我理解是相当于K-V键值对),一对连接的 卡。
? bridge 络配置的subnet是172.17.0.0/16,并且 关是172.17.0.1, 关就是docker0。容器会自动从172.17.0.0/16中分配一个ip,这里16位掩码保证有足够多的ip工容器使用
(2)用户自定义 络
? user-defined 络:用户根据业务需求创建自定义 络
-
docker network create [options] 卡名称
-
创建 卡
-
–driver bridge 通过bridge驱动类似于默认的bridge 络
-
例子: docker network create –driver bridge my_net1
? —>通过bridge驱动创建类似默认的bridge 络
? brctl show —>查看宿主机的 络结构变化(可以看到新建的 卡)
? docker run -it –network=my_net1 dockercentos /bin/bash
? —>dockercentos容器使用自定义创建的 卡
-
-
–subnet 段 –gateway 关ip 创建 卡时指定 段和 关
-
例子: docker network create –driver bridge –subnet 172.22.16.0/24 –gateway 172.22.16.1 my_net2
? —>创建bridge 卡是指定 段和 关
-
-
容器启动时指定静态ip
- docker run -it –network=my_net2 –ip=172.22.16.8 dockercentos
- 注意:只有使用–subnet创建的 络才能指定静态ip,否则会 错
-
-
docker network connect 卡名称 容器ID
- 为容器添加一块 卡(自定义的 卡),此时容器中就会有多块 卡
- 容器添加多个 卡之后就可以和其他容器之间通信(相当于局域 用有线,访问百度用无线,两不误)
-
docker network ls
- 查看docker内 卡
-
docker network rm 卡名称
- 删除自定义的 卡
-
docker network disconnect [-f] 卡名称 容器ID
- 取消容器的 卡连接
- 有-f表是强制取消 卡
-
docker network inspect 卡名称
- 查看 卡具体信息,返回json串
(3)容器间通信
? 三种通信方式:IP、Docker DNS Server和joined容器
-
IP
- –network指定 卡
- 不同容器使用同一个 卡,可以是用户自定义 络或者birdge 络
-
Docker DNS Server
-
docker 1.10版本开始,docker daemon实现了一个内嵌的DNS server,解决容器间通信
-
用法:不同容器run时指定同一块 卡,并指定容器别名,指定的 卡只能是用户自定义 卡
-
例子:docker run -it –network=my_net –name=centos1 centos
? docker run -it –network=my_net –name=centos2 centos
-
不同容器之间ping:(直接用容器别名就可以ping通)
centos2 中:ping centos1
centos1 中:ping centos2
-
-
-
-
joined容器
-
joined容器可以使两个或者多个容器共享一个 络栈,共享 卡和配置信息,joined容器之间可以通过127.0.0.1直接通信。
-
用法:docker run -d -it –name=centos1 centos
? docker run -it –name=centos2 –network=container:contos1 centos
? 实际上就是centos2继承了centos1的 络配置
-
(4)容器与外界通信
- 容器访问外部世界(本身支持)
- 原理:NAT 络地址转换
- 外部世界访问容器
- 原理:端口映射->run时:-p参数指定端口映射规则
2、多主机
十、Docker日志管理
1.docker logs
- docker logs -f 容器ID/容器名
- -f : 持续打印,相当于tail -f xxx
- docker inspect xxx| grep logs
- docker会默认把xxx容器日志保存成一个json.log文件
- Docker支持多种日志格式(logging driver):
- none、json-file、syslog、gelt、journald、fluentd、awslogs、splunk、etwlogs、gcplogs
- 默认使用json-file
- 启动容器时修改logging driver:
- –logging-driver=xxx
- 设置Docker默认的logging driver,需要修改Docker daemon的启动脚本:
- ExecStart=/usr/bin/dockerd -H fd:// –logging-driver=xxx
2.ELK
- ELK = Elasticsearch + Logstash + Kibana
- Elasticsearch : 全文检索引擎,快速处理和搜索巨量的日志数据
- Logstash : 读取原始容器数据,并对其进行过滤分析,然后将处理结果转发给Elasticsearch进行索引和存储
- Kibana : 一个基于javascript的web图形界面,专门用于可视化Elasticsearch 数据
- 安装ELK
- docker run -d -p 5601:5601 -p 9200:9200 -p 5044:5044 -d –name elk –restart always sebp/elk
- 5601: Kibana web 接口
- 9200: Elasticsearch JSON 接口
- 5044: Logstash 日志接收接口
- 启动会 错:max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
- 解决办法: /etc/sysctl.conf中配置vm.max_map_count=655360,之后执行命令:sysctl -p
- http://172.16.0.108:5601/
- 查看Kibana管理界面
- http://172.16.0.108:9200/_searchretty
- 查看Elasticsearch统计容器界面
- Filebeat(Docker容器的日志导入ELK)
-
安装:
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.7.1-linux-x86_64.tar.gz
执行: tar -zxvf filebeat-6.7.1-linux-x86_64.tar.gz
? cd filebeat-6.7.1-linux-x86_64
? 修改filebeat.yml文件
-
后台方式启动(在filebeat-6.7.1-linux-x86_64文件夹下)
- nohup ./filebeat -e -c filebeat.yml &
-
调试模式启动:
- ./filebeat -e -c filebeat.yml
- Kibana配置界面
- 源数据过滤配置
- 左侧工具栏: Management-》Kibana-》
- Index name or pattern: filebeat*
- Time-filed name: @timestamp
- 查看配置结果: 左侧工具栏: Discover
- 左侧工具栏: Management-》Kibana-》
- 配置图形界面
- 需要根据日志实际内容具体配置
十一、Docker容器监控
1.Weave Scope
- 安装
- curl -L git.io/scope -o /usr/local/bin/scope
- chmod a+x /usr/local/bin/scope
- scope launch
- 访问
- http://xxx.xxx.xxx.xxx:4040/
2.Prometheus
- 安装
-
(1)Prometheus Server,本身也将容器的方式运行在host主机上,负责从Exporter拉取和存储监控数据,并提供一套灵活的查询语言(PromQL)供用户使用;
-
docker run -d -p 9090:9090 –name prometheus –restart=always –network=host -v /opt/DockerFile/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml quay.io/prometheus/prometheus
-
相应文件夹下创建prometheus.yml
-
?
-
-
-
验证:http://127.0.0.1:9090
-
-
(2)Exporter,负责收集目标对象(host、cantainer)的性能数据,并通过HTTP接口供Prometheus Server获取;
- Node Exporter:负责收集系统数据
- docker run -d -p 9100:9100 -v “/proc:/host/proc” -v “/sys:/host/sys” -v “/:/rootfs” –net=“host” –restart=always –name=node –network host quay.io/prometheus/node-exporter:v0.13.0 -collector.procfs /host/proc -collector.sysfs /host/sys -collector.filesystem.ignored-mount-points “^/(sys|proc|dev|host|etc)($|/)”
- 验证:http://127.0.0.1:9100
- cAdvisor:负责收集容器数据
- docker run -p=9080:8080 -d –restart=always –volume=/:/rootfs:ro –volume=/var/run:/var/run:rw –volume=/sys:/sys:ro –volume=/var/lib/docker/:/var/lib/docker:ro –detach=true –name=cadvisor google/cadvisor:latest
- 验证:http://127.0.0.1:9080
- Node Exporter:负责收集系统数据
-
(3)Grafana,优秀的可视化界面,多维数据模型;
- docker run -d -i -p 3000:3000 –restart=always -e “GF_SERVER_ROOT_URL=http://grafana.server.name” -e “GF_SECURITY_ADMIN_PASSWORD=admin” –network=host –name=grafana grafana/grafana
- admin用户名的密码是admin
-
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!
- docker run -d -i -p 3000:3000 –restart=always -e “GF_SERVER_ROOT_URL=http://grafana.server.name” -e “GF_SECURITY_ADMIN_PASSWORD=admin” –network=host –name=grafana grafana/grafana