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参数指定特定的文件
- docker-compose up
用于部署一个Compose应用,默认会读取名为docekr-compose.yml 或 docker-compose.yaml
当然用户也可以使用-f指定其他文件名。通常情况下,会使用-d参数令应用在后台启动。
- docker-compose stop
停止Compose应用相关的所有容器,但不会删除它们
被停止的应用可以很容易的通过docker-compose restart命令重新启动
- docker-compose rm
用于删除已停止的Compose应用
它会删除容器和网络,但是不会删除卷和镜像
- docker-compose restart
重启已停止的Compose应用
如果用户在停止该应用后对其进行了变更,那么变更的内容不会反映在重启后的应用中,这时需要重新部署应用使变更生效。
- docker-compose ps
用于列出Compose应用中的各个容器
输出内容包括当前状态,容器运行的命令以及网络端口
- docker-compose down
停止并删除运行中的Compose应用
它会删除容器和网络,但是不会删除卷和镜像
Docker Swarm
简介
Swarm是Docker官方提供的一款集群管理工具,主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。
构成:
- 企业级的Docker安全集群
- 一个微服务应用编排引擎
集群方面,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,有以下两条最佳实践原则:
- 部署奇数个管理节点。
- 不要部署太多的管理节点(建议3-5个)
部署奇数个管理节点有利于减少脑裂(Split-Brain)情况的出现机会。
少的节点个数会减少达成共识的时间。
Docker Swarm服务的部署及相关操作
常用命令
- 创建一个新的服务 $docker service create
类似于docker container run,于其好多参数都是相同的,比如–name、–p等参数
所有的服务都会被Swarm持续监控,Swarm会在后台进行轮询检查(Reconciliation Loop),来持续比较服务的实际状态和期望状态是否一致,如果不一致,Swarm会使其一致,如果一致,无操作。
理解:Swarm会一直确保实际状态能够满足期望状态的要求。
- 查看服务: $docker service ls
- 查看服务副本列表及各副本的状态: $docker service ps
- 更为详细的信息可以使用:$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服务日志及相关配置
-
命令
$docker service logs 命令查看日志
注意:并非所有的日志驱动(logging Driver)都支持该命令。
–follow 跟踪
–tail 显示最近的日志
–details 获取额外细节 -
日志配置
Docker节点默认的配置是服务使用json-file日志驱动,其他的驱动还有journald(仅用于运行systemd的linux主机)、syslog、splunk、gelf。
json-file和journald是比较容易配置的,二者都可用于docker service logs命令。
若是使用第三方日志驱动,那么就需要用相应日志平台的原生工具来查看日志。
- 日志启动
通过执行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中删除某服务,该命令不进行确认,使用时应保持警惕。 |
个人学习使用
文章总结出处