docker篇——相关组件

docker篇——相关组件

Docker概念简介

Dockerfile

使用Docker 中的docker image build命令会读取dockerfile,并将应用程序容器化。

Dockerfile有一行行命令语句组成,并支持以#开头的注释行

构建上下文是指应用文件存放的位置,可能是本地Docker主机上的一个目录或者是一个远程的Git库。

FROM指令:用于指定要构建镜像的基础镜像,它通常是Dockerfile中的第一条指令。

RUN指令:用于在镜像中执行命令,创建新的镜像层,每个RUN指令创建一个新的镜像层。

COPY指令:用于将文件作为一个新的层添加到镜像中。通常使用COPY指令将应用代码赋值到镜像中。

EXPOSE指令:用于记录应用所使用的网络端口。

ENTRPOINT指令:用于指定镜像以容器方式启动后默认运行的程序。

其余指令:LABEL、ENV、ONBUILD、HEALTHCHECK、CMD等。

Docker Compose

概述

在Docker节点上,以但单引擎(Single-Engine Mode)进行多容器应用的部署和管理。

Docker Compose并不是通过脚本和各种冗长的docker命令来将应用组件组织起来,而是通过一个声明式的配置文件描述整个应用,从而使用一条命令完成部署。

应用部署成功后,还可以通过一系列简单的命令实现对其完整生命明周期的管理,甚至,配置文件还可以置于版本控制系统中进行存储和管理。

背景

Docker Compose概述

Docker Compose 前身是Fig。

fig是基于一个Docker的python工具,允许用户基于一个YAML文件定义多容器应用,从而可以使用fig命令行工具进行应用的部署。

fig也可以对应用的全生命周期进行管理。

内部实现上,fig会解析YAML文件,并通过Docker API进行应用的部署和管理。

Docker Compose yml配置文件及常用指令

Docker Compose使用Yaml文件来定义多服务的应用,yaml是JSON的一个子集,因此也可使用JSON。

Docker Compose默认使用文件名docker-compose.yml,当然,也可以使用-f参数指定具体文件。

$docker-compose up & 启动一个Compose应用(通过Compose文件定义的多容器应用称为Compose应用)

它会构建所需的镜像,创建网络和卷,并启动容器。
$docker-compose -f prod-equus-bass.yaml up
-f参数指定特定的文件
  1. docker-compose up

用于部署一个Compose应用,默认会读取名为docekr-compose.yml 或 docker-compose.yaml

当然用户也可以使用-f指定其他文件名。通常情况下,会使用-d参数令应用在后台启动。

  1. docker-compose stop

停止Compose应用相关的所有容器,但不会删除它们

被停止的应用可以很容易的通过docker-compose restart命令重新启动

  1. docker-compose rm

用于删除已停止的Compose应用

它会删除容器和网络,但是不会删除卷和镜像

  1. docker-compose restart

重启已停止的Compose应用

如果用户在停止该应用后对其进行了变更,那么变更的内容不会反映在重启后的应用中,这时需要重新部署应用使变更生效。

  1. docker-compose ps

用于列出Compose应用中的各个容器

输出内容包括当前状态,容器运行的命令以及网络端口

  1. docker-compose down

停止并删除运行中的Compose应用

它会删除容器和网络,但是不会删除卷和镜像

Docker Swarm

简介

Swarm是Docker官方提供的一款集群管理工具,主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。

构成:

  1. 企业级的Docker安全集群
  2. 一个微服务应用编排引擎

集群方面,Swarm将一个或多个Docker节点组织起来,使得用户能够以集群方式管理它们。

Swarm默认内置加密的分布式集群存储(encrypted distributed cluster store)、机密网络(Encrypted Netword)、公用的TLS(Mutual TLS)、安全集群接入令牌(Secure Cluster Join Token)以及一套简化数字证书管理的PKI(public Key Infrastructure)。可自如的添加和删除节点。

从集群的角度来说,一个Swarm由一个或多个Docker节点组成。

节点配置为管理节点和工作节点,管理节点负责集群控制面(Control Plane),进行监控集群状态、分发任务至工作节点等操作。工作节点接受来自管理节点的任务并执行。

Swarm的配置和状态信息保存在一套位于所有管理节点上的分布式etcd数据库中,该数据库运行在内存中,并保持数据的最新状态。该数据库的优点是,不需要任何配置,作为Swarm的一部分被安装,无需管理。

关于集群管理,最大的挑战在于保证其安全性。搭建Swarm集群时将不可避免的使用TLS。Swarm使用TLS进行通信加密、节点认证和角色授权。自动密钥轮换(Automatic key Rotation)在后台运行,用户无感知。

关于应用编排,Swarm中的最小调度单元是服务,当容器封装在一个服务中时,称之为一个任务或者一个副本,服务中增加了扩缩容、滚动升级以及简单回滚等特性。

Swarm管理器高可用性(HA)

关于HA,有以下两条最佳实践原则:

  1. 部署奇数个管理节点。
  2. 不要部署太多的管理节点(建议3-5个)

部署奇数个管理节点有利于减少脑裂(Split-Brain)情况的出现机会。

少的节点个数会减少达成共识的时间。

Docker Swarm服务的部署及相关操作

常用命令

  1. 创建一个新的服务 $docker service create

类似于docker container run,于其好多参数都是相同的,比如–name、–p等参数

所有的服务都会被Swarm持续监控,Swarm会在后台进行轮询检查(Reconciliation Loop),来持续比较服务的实际状态和期望状态是否一致,如果不一致,Swarm会使其一致,如果一致,无操作。

理解:Swarm会一直确保实际状态能够满足期望状态的要求。

  1. 查看服务: $docker service ls
  2. 查看服务副本列表及各副本的状态: $docker service ps
  3. 更为详细的信息可以使用:$docker service inspect
    – pretty 参数,限制输出中仅包含最感兴趣的内容,并以易于阅读的格式打印出来。

副本服务 vs 全局服务

服务的默认复制模式(Replication Mode)是副本模式(replicated)

这种模式会部署期望数量的服务副本,并尽可能均匀地将各个副本分布在整个集群中。

另一种模式是全局模式(Global),这种模式下,每个节点仅运行一个副本,可以通过docker service create 命令传递 --mode global参数来部署一个全局服务。

服务的扩容

服务的另一个强大特性是能够方便的进行扩缩容。

$docker service scale 命令进行扩缩容

在底层实现上,Swarm执行了一个调度算法,默认将副本尽量均匀分配给Swarm中的所有节点。

各节点分配的副本数是平均分配的,并未将CPU负载等指标考虑在内。

服务的删除

$docker service rm 可用于删除之前部署的服务。
注意:删除所有服务副本时不会进行确认。

滚动升级

创建服务:


先创建一个新的覆盖网络(Overlay Network)给服务使用。

当然这是非必须的。

$docker network create -d overlay uber-net
创建一个名字为uber-net的覆盖网络

覆盖网络是一个二层网络,容器可以接入该网络,并且所有接入的容器均可互相通信。

即使这些容器所在的Docker主机位于不同的底层网络上,该覆盖网络依然是想通的。本质上说,覆盖网络是创建于底层异构网络之上的一个新的二层容器网络。

Docker主机通过两个底层网络相连,而容器则通过覆盖网络相连。对于同一覆盖网络中的容器来说,即使其各自所在的Docekr主机接入的是不同的底层网络,也是互通的。


创建一个新的服务,并将其接入uber-net网络。

$docker network create --name uver-svc \
--network uber-net \
--p 80:80 --replicas 12 \ 
nigelpoulton/tu-demo:v1

--network 参数声明将所有的副本都链接到uber-net网络
--p 将80端口暴露,映射到12个容器副本的80端口
最后声明所有的副本都基于nigelpoulton/tu-demo:v1镜像。

默认的模式,是在Swarm中的所有节点开放端口,称之为入站模式(Ingress Mode)。

此外还有主机模式(Host Mode),即仅运行有容器副本的节点上开放端口。

主机模式声明实例:

$docker service create --name uber-svc \
--network uber-net \
--publish published=80,target=80,mode=host \
--replicas 12 \
nigelpoulton/tu-demo:v1

Docker Swarm服务日志及相关配置

  1. 命令

    $docker service logs 命令查看日志
    注意:并非所有的日志驱动(logging Driver)都支持该命令。
    –follow 跟踪
    –tail 显示最近的日志
    –details 获取额外细节

  2. 日志配置

Docker节点默认的配置是服务使用json-file日志驱动,其他的驱动还有journald(仅用于运行systemd的linux主机)、syslog、splunk、gelf。

json-file和journald是比较容易配置的,二者都可用于docker service logs命令。

若是使用第三方日志驱动,那么就需要用相应日志平台的原生工具来查看日志。

  1. 日志启动

通过执行docker service create 命令时传入 --logdriver 和 --log-opts参数可以强制某服务使用一个不同的日志驱动,这回覆盖daemon.json中的配置

服务日志能够正常工作的前提是,容器内的应用程序运行于PID为1的进程,并且将日志发送给STDOUT,错误信息发送给STEERR,日志驱动会将这些日志转发到其配置的指定位置。

Docker Swarm常用命令总结

命令 说明
docker swarm init 用于创建一个新的Swarm。执行该命令的节点会成为第一个管理节点,并且会切换到Swarm模式
docker swarm join-token 用于查询加入管理节点和工作节点到现有Swarm时所使用的命令和Token。要获取新增管理节点的命令,请使用docker swarm join-token manager命令。获取新增工作节点的命令,请使用docker swarm join-token命令
docker node ls 用于列出Swarm所有节点的信息,包括哪些是管理节点,哪些是主管理节点。
docker service create 创建一个新服务
docker service ls 用于列出Swarm运行的服务,比如诸如服务状态、服务副本等基本信息。
docker service ps 该命令会给出更多关于某个服务副本的信息
docker service inspect 用于获取关于服务的详细信息,使用–pretty参数可限制仅显示重要信息
docker service scale 用于对服务副本个数进行增减
docker service update 用于对运行中的服务的属性进行变更
docker service logs 用于查询服务的日志
docker service rm 用于从Swarm中删除某服务,该命令不进行确认,使用时应保持警惕。

个人学习使用
文章总结出处

上一篇:2020年8月份Github上最热门的开源项目,java项目技术栈


下一篇:1 docker swarm 初始化