能够让container在host上运行起来的那些技术
容器生态技术 |
docker生态系统--by施塔克
容器生态系统
容器核心技术
能够让container在host上运行起来的那些技术
容器规范
oci组织发布了两个规范
runtime spec
image format spec
容器runtime
容器真正运行的地方,runtime需要跟操作系统kernel紧密写作,为容器提供运行环境
主流三种容器runtime
lxc
runc
docker默认的runtime
rkt
容器管理工具
对内与runtime交互,对外为用户提供interface
主流三种管理工具
lxd
docker engine
deamon
cli
rkt cli
容器定义工具
允许用户定义容器的内容和属性,这样容器能够被保存,共享,重建
主流定义工具
docker image
dockerfile
aci
Registries
统一存放image仓库的地方
主流仓库
docker registry
docker hub
quay.io
容器os
无需runtime,专门运行容器的操作系统
coreos
atomic
ubuntu core
容器平台技术
容器平台技术能够让容器作为集群在分布式环境中运行
容器编排引擎
docker swarm
kubernets
mesos+marathon
容器管理平台
架构在容器编排引擎智商的更为通用的平台,支持多种编排引擎,抽象了编排引擎的底层实现细节,为用户提供更方便的功能
主要平台
Rancher
Containership
基于容器的PaaS
为微服务应用开发人员和公司提供了开发,部署和管理应用的平台,使用户不必关系底层基础设施而专注于应用的开发
主要PaaS
Deis
Flynn
Dokku
容器支持技术
容器网络
docker network
fiannel
weave
calico
服务发现
etcd
consul
zookeeper
监控
docker ps /top/stats
docker stats api
sysdig
cAdivisor/Heapster
Weave Scope
数据管理
Rex-Ray
日志管理
docker logs
logspout
安全性
openscap
容器核心知识
学习方法
what
why
how
什么是容器
what
一种轻量级,可移植,自包含的软件打包技术,使应用程序可以几乎在任何地方以相同的方式运行
与虚拟的异同
同:两者都是为应用提供封装和隔离
不同
容器由两部分组成,应用程序本身和依赖,容器体积小,不需要启动整个系统,所以启动快,开销小,更容器迁移
虚拟机,为了运行应用,除了部署应用和依赖,还需要安装整个操作系统
why
只需配置好标准的runtime环境,服务器就可以运行任何容器,使得运维人员的工作变得更高效,一致和重复,消除了开发测试生产环境的不一致性
how
docker的架构
docker客户端
docker服务器
docker 镜像
从无到有开始创建镜像
下载并使用别人创建好的现成的镜像
在现有镜像上创建新的镜像
可将镜像的内容和创建步骤描述在dockerfile中,通过执行docker build构建docker镜像
registry
docker容器:container
架构图
docker镜像
base镜像
不依赖其他镜像,从scratch构建
其他镜像可以以为基础进行扩展
linux操作系统由内核空间和用户空间组成,对于base镜像来说,底层直接用host的kernel,自己只需提供rootfs
base镜像分层结构
新镜像是从base镜像一层一层叠加生成的
好处:
共享资源
多个镜像都从相同的base镜像构建而来,docker host只需在磁盘上保存一份base镜像,内存中也只需家在一份base镜像,就可以为所有容器服务
copy on write特性
容器启动时,一个新的可写层被加载到新的镜像顶部,称为容器层,容器之下的都叫镜像层,所有对容器的改动,都只发生在容器层,只有容器层是可写的,容器层下面的所有镜像层都是只读的
只有当需要修改时,才复制一份数据,容器层保存的是镜像部分变化的部分,不会对镜像本身进行任何修改
容器层记录对镜像的修改,所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享
使用镜像构建容器
docker file
常用指令
FROM
COPY
ADD
ENV
EXPOSE
VOLUME
WORKDIR
RUN
执行命令并创建新的镜像层,run经常用于安装软件包
CMD
设置容器启动后默认执行的命令及其参数,但CMD能够被docker run 后面跟的命令行参数替换
ENTRYPOINT
配置容器启动时运行的命令
run cmd entrypoint 运行的命令格式
shell格式
exec格式
分发镜像
命名
docker build -t .
docker push
docker容器
运行容器
CMD指令
ENTRYPOINT指令
在docker run命令行中指定
容器长期运行
加上参数-d
两种进入容器的方法
docker attach
attach直接进入容器启动命令的终端,不会启动新的进程
直接在终端中查看启动命令的输出,用attach
也可以使用docker logs
docker exec
exec则是在容器中打开新的终端,并且
最佳实践
服务类的容器
通过-d以后台的方式启动,排查问题,通过exec -it 进入容器
工具类的容器
run -it
stop/start/restart容器
pause/unpause容器
删除容器
docker rm删除容器
docker rmi是删除镜像
资源限制
内存限额
-m 或者 --memory设置内存的限额
--memory-swap设置内存+swap的使用限额
--vm 1 启动1个内存工作线程
--vm-bytes 280M每个线程分配280M内存
CPU限额
-c或者--cpu-shares设置容器使用cpu的权重,不指定,默认值为1024
--cpu用来设置工作线程的数量
Block Io
--blkio-weight设置相对权重值
实现容器的底层技术
cgroup实现资源限额
namespace实现资源隔离
mount
让容器拥有整个文件系统
uts
让容器拥有自己的hostname
ipc
让容器拥有自己的共享内粗内存和信号量来实现进程间通信
pid
让容器管理的自己的进程
network
让容器拥有自己的独立的网卡,ip,路由等资源
user
让容器管理自己的用户
docker 网络
覆盖范围
单个host上的容器网络
docker安装会自动在host上创建三个网络
none
docker run -it -network=none
使用场景
一些对安全性要求高并且不需要联网的应用
host
docker run -it -network=host
容器对网络传输效率有较高要求,可以选择host网络,但是需要考虑端口冲突问题
bridge
docker安装时会创建一个docker0的linux bridge如果不指定--network,创建的容器默认都会挂到docker0上
veth pair一种成对出现的特殊网络设备,可以想像成虚拟网线链接起来的一堆网卡,网卡的一头在容器中,另一头挂在网桥docker0上
user-defined网络
三种驱动
bridge
创建
docker network create --driver my_net
--subnet和--gateway设置ip网段
使用
docker run -it -network=指定
解决不同网络之间的通信
docker network connect mynet 容器id
overlay
macvlan
容器间通信
ip通信
需要在同一个网络下,可以用--network指定或者docker network connect
docker dns server
--name指定容器名
只能在user-defined网络中使用,默认的bridge无法使用
通过--network=container:容器名
不同容器中的程序希望通过loopback高效快速的通信
希望监控其他容器的网络流量,比如独立运行容器中的网络监控程序
容器访问外部世界
nat
外部世界访问容器
端口映射
-p指定
跨多个host的网络
docker存储
storage deiver管理的镜像层和容器层
适合一些没有需要持久化数据的容器,随时可以从镜像中直接创建
Data volume
有持久化数据的需求,容器启动时候需要家在已有的数据,容器销毁时候希望保留产生的新数据
本质就是docker host文件系统中的目录和文件,能够直接呗mount到容器中的文件系统中
两种类型
bind mount
将host上已存在的目录或者文件mount到容器
通过-v host文件路径:容器文件路径
缺点:
需要指定host文件系统的特定路径,限制了容器的可移植性
docker managed volume
-v 容器文件路径
docker volume ls
docker volume inspect volume name
容器共享
容器与host共享数据
容器之间共享数据
bind mount多个
volume container
create一个container,不启动
运行时使用--volumes-from 容器名
data-packed volume container
适合静态数据的场景
data volume生命周期管理
备份
定期备份某个数据目录
恢复
用之前备份的数据复制到数据目录
迁移
使用新版本容器,mount原有volume
销毁
删除容器带-v
批量删除孤儿volume
docker volume rm $(docker volume ls -q)
容器进阶知识
multi-host
docker-machine
容器网络
docker network
single-host
none
host
bridge
joined container
multi-host
overlay
macvlan
multi-host
fiannel
weave
calico
监控
数据管理
日志管理