Docker-总结篇

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安装

  1. yum install -y epel-release

  2. 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

  3. 安装后的配置文件:/etc/sysconfig/docker

    • 配置aliyun容器加速器: 在此配置文件下配置:

      • other_args=“–registry-mirror=https://{自已的编码}.mirror.aliyuncs.com”

        {自己的编码} 需要去aliyun开发者官 获取,在管理控制台->容器镜像服务->镜像加速器

  4. 启动Docker后台服务: service docker start

  5. 检查是容器加速器是否配置成功: ps -ef | grep docker

    ? 进程详情后面会有配置的容器加速器的aliyun路径

  6. docker version验证:

2、centos7安装

  1. 确定系统是centos7及以上版本: cat /etc/redhat-release

  2. yum安装gcc相关:

    • yum -y install gcc
    • yum -y install gcc-c++
  3. 卸载旧版本docker: yum -y remove docker docker-common docker-selinux docker-engine

  4. 安装需要的软件包: yum install -y yum-utils device-mapper-persistent-data lvm2

  5. 设置stable镜像仓库: yum-config-manager –add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

  6. 更新yum软件包索引: yum makecache fast

  7. 安装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
  8. 启动docker: systemctl start docker

  9. 配置镜像加速(相当于中国的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

  10. 测试安装是否成功:

  • docker version
  • docker run hello-world
  1. 卸载:

    • 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
  • 解析过程
    1. docker从基础镜像运行一个容器
    2. 执行一条指令并对容器做出修改
    3. 执行类似docker commit的操作提交一个新的镜像层
    4. docker再基于刚提交的镜像运行一个新的容器
    5. 执行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

  1. docker pull mysql:5.7

  2. 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
  3. docker exec -it xiaokaimysql /bin/bash

    mysql -uroot -pPassword1!

    创建表创建数据测试docker的mysql

  4. 使用桌面的navicat工具连接docker中的mysql

    ip:3333

  5. docker外备份mysql数据

    • docker exec xiaokaimysql sh -c ’ exec mysqldump –all-databases -uroot -p”Password1!” ’ > /DockerFile/mysql/all-databases.sql
  6. 以上都可以成功,即安装成功

2、redis

  1. docker pull redis:3.0.4

  2. 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

  3. 在 /DockerFile/redis/conf/redis.conf文件夹下创建redis.conf

    redis.conf文件内容见同级文件夹笔记 DockerFile示例xiaokairedis3.0.4示例redis.conf

  4. 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

  5. 在/DockerFile/redis/data/路径下会有appendonly.aof文件

  6. 在宿主机上:

    ? redis-cli -p 6666

    ? 可以直接登录到docker里面的redis中

  7. 以上都可以成功,即安装成功

3、emqttd

  1. docker pull registry.cn-hangzhou.aliyuncs.com/synbop/emqttd:2.3.6
  2. docker run –name emq -p 18083:18083 -p 8083:8083 -d registry.cn-hangzhou.aliyuncs.com/synbop/emqttd:2.3.6
  3. http:127.0.0.1:18083
  4. 登录的用户名:admin 密码:public 这是默认的
  5. 有时候会 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
  • host 络-宿主 络模式

    ? 容器的 络配置与宿主机完全一样, 卡,ip等都一模一样

    • run启动时参数指定
      • –network=host
    • 使用场景
      • 性能好,传输效率较高,但是要考虑端口冲突的问题
  • 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

  1. ELK = Elasticsearch + Logstash + Kibana
  • Elasticsearch : 全文检索引擎,快速处理和搜索巨量的日志数据
  • Logstash : 读取原始容器数据,并对其进行过滤分析,然后将处理结果转发给Elasticsearch进行索引和存储
  • Kibana : 一个基于javascript的web图形界面,专门用于可视化Elasticsearch 数据
  1. 安装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统计容器界面
  1. 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
  1. Kibana配置界面
  • 源数据过滤配置
    • 左侧工具栏: Management-》Kibana-》
      • Index name or pattern: filebeat*
      • Time-filed name: @timestamp
    • 查看配置结果: 左侧工具栏: Discover
  • 配置图形界面
    • 需要根据日志实际内容具体配置

十一、Docker容器监控

1.Weave Scope

  1. 安装
    • curl -L git.io/scope -o /usr/local/bin/scope
    • chmod a+x /usr/local/bin/scope
    • scope launch
  2. 访问
    • http://xxx.xxx.xxx.xxx:4040/

2.Prometheus

  1. 安装
  • (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
  • (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进行处理,非常感谢!

上一篇 2022年5月6日
下一篇 2022年5月6日

相关推荐