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

  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 commit -a=“作者” -m=“提交的详细信息” 容器ID 要创建的目标镜像:[标签]

    容器(定制版)生成镜像: 修改之后的容器生成保存了修改信息的新的镜像

  • 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基础镜像,当前镜像是基于哪个镜像的,所有镜像的根镜像是scratchfrom
MAINTAINER镜像维护者的姓名和邮箱maintainer
RUN容器构建时需要运行的命令run
EXPOSE当前容器对外暴露出的端口expose
WORKDIR指定在创建容器后,终端默认登录进来的工作目录workdir
ENV用来在构建镜像过程中设置环境变量environment
ADD将宿主机目录下的文件拷贝进镜像且add命令会自动处理url和解压tar压缩包add
COPY类似于add,拷贝文件和目录到镜像;将从构建上下文目录中<源路径>的文件/目录复制到新的一层镜像内的<目标路径>位置copy
VOLUME容器数据卷,用于数据保存和持久化,这种方式不可以指定宿主机的数据库目录,容器会自动生成一个目录,docker inspect 容器ID 查看 mounts可以看到自动生成的目录volume
CMD1.指定一个容器启动时要运行的命令
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/_search?pretty
      • 查看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.inputs:
    - type: log
      enabled: true
      # 配置docker容器日志路径和宿主机系统路径
      paths:
        - /var/log/anaconda/syslog
        - /opt/dockerdb/containers/*/*.log
    filebeat.config.modules:
      path: ${path.config}/modules.d/*.yml
      reload.enabled: false
    setup.template.settings:
      index.number_of_shards: 3
    setup.kibana:
    # 数据直接传到EC上
    output.elasticsearch:
      hosts: ["127.0.0.1:9200"]
    processors:
      - add_host_metadata: ~
      - add_cloud_metadata: ~
    
  • 后台方式启动(在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

        • global:
            scrape_interval:     15s # By default, scrape targets every 15 seconds.
            evaluation_interval: 15s # By default, scrape targets every 15 seconds.
            external_labels:
              monitor: 'codelab-mointor'
          
          rule_files:
            # - "rules/rule.yml"
          
          scrape_configs:
            - job_name: 'prometheus'
              # scrape_interval: 5s
              static_configs:
                 - targets: ['127.0.0.1:9090','127.0.0.1:9080','127.0.0.1:9100']
          

    • 验证: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
    • 验证:http://127.0.0.1:3000
    • 配置:
      • Add data source -> Prometheus
      • Add data source -> config -> name(随便取一个)
      • Add data source -> config -> Type (选择prometheus.yml中配置的job_name值)
      • Add data source -> config -> Http setting -> Url (Promethues Server 访问地址)
      • 其他为默认值
    • 下载:https://grafana.com/dashboards?dataSource=prometheus&search=docker
      • 下载一个开源社区现成的Dashboard,直接import到Grafana中就可以直接使用
      • 比如下载Docker and system monitoring,得到一个json文件,单击Grafana左上角菜单 Dashboards->import->导入下载的json文件


十二、Docker默认文件修改

1.修改Docker默认镜像和容器的存储位置

​ Docker默认的镜像和容器存储位置在/var/lib/docker中,如果仅仅是做测试,我们可能没有必要修改,但是当大量使用的时候,我们可能就要默认存储的位置了。

  • 修改docker.service文件
  • vim /etc/systemd/system/multi-user.target.wants/docker.service
  • ExecStart=/usr/bin/dockerd --graph=/data/docker --storage-driver=overlay
    • –graph=/data/docker:docker新的存储位置
    • –storage-driver=overlay : 当前docker所使用的存储驱动(我也不知道啥意思,不用加进行)
  • systemctl daemon-reload
  • systemctl restart docker

十三、Docker-compose

  1. 安装
  2. 命令
    • docker-compose --version
    • docker-compose up
      • 执行新建容器组
      • -d : 守护进程启动
      • 注意 : 需要在docker-compose.yml同级文件夹下执行docker-compose命令
    • docker-compose ps
      • 查询容器组所有容器状态
      • 查看由docker-compose管理的服务
    • docker-compose help xxx
      • 查看xxx命令的帮助,如: docker-compose help ps
    • docker-compose logs
    • docker-compose stop
      • 停止容器组
    • docker-compose start
      • 启动容器组
    • docker-compose run
      • 允许您为服务运行一次性命令
      • docker-compose run redis cd /opt/
    • docker-compose rm
    • docker-compose down
      • 删除容器组
        • –volumes : 删除容器使用的数据卷
        • –rmi all : 删除docker-compose中的镜像
  3. docker-compose.yml编排规则
    • 具体编排规则参考链接: https://blog.51cto.com/1427133/2160206
    • 如果你同时指定了 image 和 build 两个标签,那么 Compose 会构建镜像并且把镜像命名为 image 后面的那个名字

十四、Docker 私有仓库(Harbor)

  1. 下载: wget https://storage.googleapis.com/harbor-releases/release-1.6.0/harbor-offline-installer-v1.6.2.tgz

  2. 注意配置: docker-compose.yml harbor.cfg

  3. 修改harbor.cfg

    • hostname(必须修改为实际的物理ip)
    • 密码: harbor-db harbor-admin
    • 保存路径(这个可以不改)
  4. 修改docker-compose.yml

    • - 80:80
  5. ./install.sh

    • 实际运行原理是harbor.v1.6.2.tar.gz文件加压(之前容器docker save出来的压缩包),解压之后,根据docker-compose.yml运行容器
  6. 修改 /etc/docker/daemon.json

    • 加入: “insecure-registries”: [“xxx.xxx.xxx.xxx:80”]
    • 注意: 名字必须是实际物理ip,不能是回环地址
  7. systemctl daemon-reload

  8. systemctl restart docker

  9. 修改Harbor存储路径

    • harbor.cfg中:

      • 前面加 /home/module/harbor

      • ssl_cert = /home/module/harbor/data/cert/server.crt
        ssl_cert_key = /home/module/harbor/data/cert/server.key

        secretkey_path = /home/module/harbor/data

    • docker-compose.yml中

      • 所有挂载卷为/data的地方,全部修改为要保存的路径 例如: 前面加 /home/module/harbor
  10. 修改仓库端口不是默认的80(以800为例)

  • ./prepore

  • 修改docker-compose.yml文件映射为800端口

    • - 800:80
  • common/templates/registry/config.yml文件加入800端口

    • auth:
        token:
          issuer: registry-token-issuer
          realm: $ui_url:800/service/token
          rootcertbundle: /etc/registry/root.crt
          service: token-service
      
  • 修改 /etc/docker/daemon.json

    • 加入: “insecure-registries”: [“xxx.xxx.xxx.xxx:800”]
    • 注意: 名字必须是实际物理ip,不能是回环地址
    • systemctl daemon-reload
    • systemctl restart docker.service
  • vim harbor.cfg

    • hostname xxx.xxx.xxx.xxx:800
  • docker-compose down --v

  • docker-compose up -d

  • 注意: 修改完harbor.cfg之后必须./prepare


十五、Docker 镜像自动构建

1. GitLab搭建
  1. 安装
  • docker pull gitlab/gitlab-ce:latest
  • docker run -d -p 8443:443 -p 80:80 -p 8022:22 --name gitlab --restart always --volume /opt/DockerFile/gitlab/config:/etc/gitlab --volume /opt/DockerFile/gitlab/logs:/var/log/gitlab --volume /opt/dockerData/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:latest
  • 首次启动比较慢,所以,需要稍等一会儿
2.Jenkins搭建部署
  1. 安装
  • docker run -d -p 9081:8080 -p 50000:50000 --name jenkins -u root -v /opt/DockerFile/jenkins:/var/jenkins_home jenkinsci/jenkins:lts

  • wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo

  • rpm --import https://jenkins-ci.org/reahat/jenkins-ci.org.key

  • yum install -y jenkins

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瓜娃子希望世界和平

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值