1、Docker容器技术初探与实践容器技术初探与实践 D o c k e r 容器技术初探与实践 目录目录 Docker介绍与原理介绍与原理 Docker基本操作 Docker网络,镜像与仓库Docker实践?目录 D o c k e r 介绍与原理 D o c k e r 基本操作 D o c让我们从虚拟机开始谈起让我们从虚拟机开始谈起 虚拟硬件层 虚拟硬件层 虚拟技术层 物理硬件层?一机多用?资源隔离?资源池化?资源配额限制?资池动态调整?软件定义网络 让我们从虚拟机开始谈起 虚拟硬件层 虚拟硬件层 虚拟技术层 Docker是什么?是什么?Docker是一个构建在LXC基础之上,基于进程的轻量
2、级VM解决方案,实现了 应用程序级别的资源隔离与配额。D o c k e r 是什么?D o c k e r 是一个构建在L X C 基础之上容器容器 vs 虚拟机虚拟机 对比项 运行形态 容器 直接运行在宿主机内核上 虚拟机 运行于hypervisor上 启动速度 快,秒级 慢,分钟级 占用磁盘 小,MB级 非常大,GB级 性能 接近宿主机性能 不超过宿主机70%资源利用率 高,单节点可运行100+级容器 低,一般运行10+级虚拟机 容器 v s 虚拟机 对比项 运行形态 容器 直接运行在宿容器的优势容器的优势 多维隔离 通过程,进程通信,主机名,namespace可隔离进网络,用户组等 环
3、境封装 容器镜像中包含了操作系统所有必需库文件,也可以包含应用运行的中间件与应用本身介质 多重限制 通过内存,磁盘,网络,设备cgroup可实现对cpu,等进行资源限制 层级文件系统 通过可叠加的层次文件系统最终组合成完整镜像。相同的层可共用以节省磁盘资源,降低网络传输消耗 高性能高效率 不通过虚拟化技术就可运行完整系统,运行效率直逼实际机器。单机可轻松运行上百个容器 秒级启动 容器对资源需求很少,启动与停止在数秒之间即可完成 容器的优势 多维隔离 通过程,进程通信,主机名,n a m e s p容器到底是啥?容器到底是啥?namespace?Mount Namespace Pid Names
4、pace Net namespace Ipc namespace Uts namespace User namespace?cgroups UnionFS Blkio Cpu Cpuacct Cpuset Devices Freezer Memory Net_cls 联合文件系统 CNM(Container Network Model)资源隔离 网络 资源限制 Volumes 目录挂载 Container 容器到底是啥?n a m e s p a c e?Mo u n资源隔离资源隔离 Namespace Namespace Mount Namespace UTS Namespace IPC N
5、amespace PID Namespace Network Namespace User Namespace 被隔离的系统资源被隔离的系统资源 文件系统挂载点 隔离效果隔离效果 每个容器能看到不同的文件系统层次结构 Node name 和 domain name 每个容器可以有自己的 hostname 和 domainame 特定的进程间通信资源 每个容器有其自己的 System V IPC 和 POSIX 消息队列文件系统,只有在同一个 IPC namespace 的进程之间才能互相通信 进程ID数字空间 每个 PID namespace 中的进程可以有其独立的 PID;每个容器可以有其
6、PID 为 1 的root 进程;也使得容器可以在不同的 host 之间迁移,因为 namespace 中的进程 ID 和 host 无关了。这也使得容器中的每个进程有两个PID:容器中的 PID 和 host 上的 PID 每个容器用有其独立的网络设备,IP 地址,IP 路由表,/proc/net 目录,端口号等等。这也使得一个 host 上多个容器内的同一个应用都绑定到各自容器的 80 端口上 在 user namespace 中的进程的用户和组 ID 可以和在 host 上不同;每个 container 可以有不同的 user 和 group id;一个 host 上的非特权用户可以成为
7、 user namespace 中的特权用户 网络相关的系统资源 用户和组ID空间 资源隔离 N a m e s p a c e Mo u n t N a m e s p a c e资源限制资源限制 cgroup cgroup 子系统子系统 blkio cpu cpuacct cpuset devices 作用作用 为?块?设?备?设?定?输?入?/输?出?限?制?,比?如?物?理?设?备?(磁?盘?,固?态?硬?盘?,USB 等?等?)使?用?调?度?程?序?提?供?对?CPU 的?cgroup 任?务?访?问?自?动?生?成?cgroup 中?任?务?所?使?用?的?CPU 报?告?为?c
8、group 中?的?任?务?分?配?独?立?CPU(在?多?核?系?统?)和?内?存?节?点?可?允?许?或?者?拒?绝?cgroup 中?的?任?务?访?问?设?备?freezer memory net_cls?起挂?或?者?恢?复?cgroup 中的?任?务?设?定?cgroup 中?任?务?使?用?的?内?存?限?制?,并?自?动?生?成?内?存?资?源使用?报?告?使?用?等?级?识?别?符?(classid)标?记?网?络?数?据?包?,可?允?许?Linux 流?量?控?制?程?序?(tc)识?别?从?具?体?cgroup 中?生?成?的?数?据?包?资源限制 c g r o u
9、p 子系统 b l k i o c p u c p u a联合文件系统联合文件系统UnionFS 联合文件系统(UnionFS)是一种轻量级的高性能分层文件系统,它支持将文件系统中的修改信息作为一次提交,并层层叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,应用看到的是挂载的最终结果。在Docker中使用AUFS(Another Union File System或Advanced Multilayered Unification File System)就是一种联合文件系统。AUFS不仅可以对每一个目录设定只读(Readonly)、读写(Readwrite)和写(Witeout-able
10、)权限,同时AUFS也可以支持分层的机制,例如,可以对只读权限部分逻辑上进行增量地修改而不影响只读部分 Docker目前支持的联合文件系统种类包括AUFS、OverlayFS、btrfs、vfs、zfs和Device Mapper等。联合文件系统U n i o n F S 联合文件系统(U n i o n F S)是Docker容器网络模型容器网络模型CNM Runtime Docker Contianer Network Model(libnetwork)None Bridge Overlayer Plugines 3rd-Native Driver Remote Driver?使用驱动模式
11、为容器创建网络栈?支持多个驱动同时使用?允许容器加入一个或多个网络?如果需要,可以自已定制网络驱动 D o c k e r 容器网络模型C N M R u n t i m e D o c k e rDocker存储挂载存储挂载 容器运行过程中产生的数据,默认就存在容器的临时存储中,会随容器删除而消失。要想将容器运行过程中产生的数据持久保存下来,必须要把这些文件或目录挂载至宿主机上。或者一些需要运行期指定的配置文件,也可以通过卷的方式挂进容器中去。挂载的目标,可以是文件,也可以是目录。/opt/data/opt/configs-v/home/usr1/data/app1:/opt/data vo
12、lume/home/usr1/data/app1 volume-v/opt/configs/app1:/opt/configs/opt/configs/app1 容器 宿主机 D o c k e r 存储挂载 容器运行过程中产生的数据,默认就存在容容器重新定义了应用的边界容器重新定义了应用的边界=应用安装包/介质+中间件安装包+运行环境安装包+安装文档 原来的应用 操作系统(如Centos 7.2)容器=镜像 运行环境 (如 java 1.8)中间件 (如tomcat 7.2)应用介质 (如 hello.War)应用配置 (如 log4j.xml)+容器说明 容器化的应用 环境变量 (如 DB
13、_NAME=hello)对外端口 (如 80-8080)容器重新定义了应用的边界=应用安装包/介质+中间件容器促进了应用交付的标准化容器促进了应用交付的标准化 Engine 基础设施标准化?屏蔽底层抽像?隔离限制资源?软件定义网络?对接多类存储 Image 应用交付标准化?分层文件系统?统一的构建语法?镜像版本化管理?应用资源全包括 Container 运维管理标准化?元子化运行单元?快速创建与销毁?统一编排?统一监控 Registry 分发部署标准化?镜像集中化管理?安全控制?权限管理?应用商店 容器促进了应用交付的标准化 E n g i n e 基础设施标准化?目录目录 Docker介绍与
14、原理 Docker基本操作基本操作 容器网络,镜像与仓库Docker实践?目录 D o c k e r 介绍与原理 D o c k e r 基本操作 容器网Docker的安装的安装?Windows 下载docker-toolbox执行安装。下载地址:http:/ 以centos7为例,root用户使用yum安装:yum-config-manager-add-repo http:/ yum makecache fast&yum-y install docker-ce?Mac 下载docker安装包执行安装。下载地址:https:/ D o c k e r 的安装?Wi n d o w s 下载d
15、 o c k e启动你的第一个容器启动你的第一个容器 以启动一个nginx服务为例:#docker run d p 8080:80 n myng nginx 参数说明:-d -p 以后台方式运行-n 端口映射,宿主机端口:容器端口 nginx 指定容器的名称 nginx:latest镜像名称与。前面为镜像名称,冒号后为镜像tag。此为略写模式,全部应为tag:输出:访问nginx服务(宿主机地址为 10.15.15.74):启动你的第一个容器 以启动一个n g i n x 服务为例:#d o更多更多docker run参数参数?-a stdin:指定标准输入输出内容类型,可选 STDIN/ST
16、DOUT/STDERR 三项;?-d:后台运行容器,并返回容器ID;?-i:以交互模式运行容器,通常与 -t 同时使用;?-p:端口映射,格式为:主机(宿主)端口:容器端口?-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;?-name:为容器指定一个名称;?-dns:指定容器使用的DNS服务器,默认和宿主一致;?-dns-search:指定容器DNS搜索域名,默认和宿主一致;?-h:指定容器的 hostname;?-e username=ritchie:设置环境变量;?-env-file=:从指定文件读入环境变量;?-cpuset=0-2 or-cpuset=0,1,2:绑定容器到
17、指定CPU运行;?-m:设置容器使用内存最大值;?-net=bridge:指定容器的网络连接类型,支持 bridge/host/none/container/自定义网络:5种类型;?-link=:链接到另一个容器;更多d o c k e r r u n 参数?-a s t d i n:指定标准容器常用操作容器常用操作 查看所有运行中的容器#docker ps 查看所有容器#docker ps-a 查看容器的日志#docker logs 容器名称或容器id 停止容器#docker stop 容器名称或容器id 启动容器#docker start 容器名称或容器id 重启容器#docker res
18、tart 容器名称或容器id 删除容器(强制加 f)#docker rm 容器名称或容器id 在容器中执行某个命令#docker exec 容器名称或容器id 命令 进入容器内部(control+d退出)#docker exec-it 容器名称或容器id bash 查看容器的详细信息#docker inspect 容器名称或容器id 从宿主机往容器中复制数据#docker cp 宿主机目录 容器名称或容器id:容器目录 将数据从容器中复制至宿主机#docker cp 容器名称或容器id:容器目录 宿主机目录 容器常用操作 查看所有运行中的容器#d o c k e r p s 镜像常用操作镜像常
19、用操作 登陆镜像仓库#docker login 仓库地址:端口 登出镜像仓库#docker logout 从镜像库拉取镜像#docker pull 镜像名称:镜像tag 查看所有镜像#docker images 删除镜像(强制加 f)#docker rmi 镜像id 为镜像重新打tag#docker tag 镜像id 镜像名称:镜像tag 上传镜像至仓库#docker push 镜像名称:镜像tag 镜像常用操作 登陆镜像仓库#d o c k e r l o g i n 仓端口映射端口映射 Docker中,可以使用-P 或-p参数,将容器中的端口暴露为宿主机的端口,以便使外部可与容器进行通信。
20、命令格式:#docker run d p 8080:80 n myng nginx -P 标记时,Docker 会随机映射一个 4900049900 的端口到内部容器开放的网络端口 -p(小写)可以指定要映射的IP和端口。如果多个端口,则添加多个-p参数。注意一个宿主机上的端口,只能映射给一个容器。-p 参数有三种格式?hostPort:containerPort(映射所有接口地址)将本地的 5000 端口映射到容器的 5000 端口,可以执行如下命令:$docker run-d-p 5000:5000 nginx 此时默认会绑定本地所有接口上的所有地址。?ip:hostPort:contai
21、nerPort(映射指定地址的指定端口)指定映射使用一个特定地址,比如 localhost 地址 127.0.0.1$docker run-d-p 127.0.0.1:5000:5000 nginx?ip:containerPort(映射指定地址的任意端口)绑定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一个端口。sudo docker run-d-p 127.0.0.1:5000 nginx 还可以使用 udp 标记来指定 udp 端口$docker run-d-p 127.0.0.1:5000:5000/udp nginx 端口映射 D o c k e r
22、中,可以使用-P 或-p 参数,将容器 目录目录 Docker介绍与原理 Docker基本操作 容器网络,镜像与仓库容器网络,镜像与仓库Docker实践?目录 D o c k e r 介绍与原理 D o c k e r 基本操作 容器网容器网络高级模式容器网络高级模式 Docker run中,可以使用network 指定容器的网络模式 命令格式:#docker run network=网络模式 n myng nginx 可选的网络模式有如下五种:?none:容器将不能访问任何外部路由?Bridge 容器将使用docker的默认网络设置。在主机上设置 docker0一个通常命名的网桥,并 vet
23、h为该容器创建一对接口。一个地址将被分配给桥接网络上的容器,流量将通过该桥接路由到容器?container 容器将共享另一个容器的网络堆栈。另一个容器的名称必须以格式提供-network container:?host 容器将共享主机的网络堆栈,并且主机的所有接口都可用于容器。容器的主机名将与主机系统上的主机名匹配?用户自定义网络的名称或 id 可以使用 Docker 网络驱动程序或外部网络驱动程序插件来创建网络。(使用docker network create命令)IP容器网络高级模式 D o c k e r r u n 中,可以使用n e t w自定义镜像自定义镜像 Docker使用doc
24、kerfile来定义镜像的构建过程。Dockerfile有特定的语法,它由一行行命令语句组成,并支持以#开头的注释行。自定义镜像 D o c k e r 使用d o c k e r f i l e 来定义镜像的Dockerfile语法语法 指令 FROM MAINTAINER 说明 指定所创建镜像的基础镜像 指定维护者信息 RUN CMD LABEL EXPOSE ENV ADD COPY ENTRYPOINT VOLUME USER WORKDIR ARG ONBUILD STOPSIGNAL HEALTHCHECK SHELL 运行命令 指定启动容器时默认执行的命令 指定生成镜像的元数据标
25、签信息 声明镜像内服务所监听的端口 指定环境变量 赋值指定的路径下的内容到容器中的路径下,可以为URL;如果为tar文件,会自动解压到路径下 赋值本地主机的路径下的内容到容器中的路径下;一般情况下推荐使用COPY而不是ADD 指定镜像的默认入口 创建数据挂载点 指定运行容器时的用户名或UID 配置工作目录 指定镜像内使用的参数(例如版本号信息等)配置当前所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作的命令 容器退出的信号 如何进行健康检查 指定使用SHELL时的默认SHELL类型 D o c k e r f i l e 语法 指令 F R O M MA I N T A I N EDoc
26、kerfile最佳实践最佳实践?精简镜像用途:尽量让每个镜像的用途都比较集中、单一,避免构造大而复杂、多功能的镜像;?选用合适的基础镜像:过大的基础镜像会造成构建出臃肿的镜像,一般推荐比较小巧的镜像作为基础镜像;提供详细的注释和维护者信息:Dockerfile也是一种代码,需要考虑方便后续扩展和他人使用;正确使用版本号:使用明确的具体数字信息的版本号信息,而非latest,可以避免无法确认具体版本号,统一环境;减少镜像层数:减少镜像层数建议尽量合并RUN指令,可以将多条RUN指令的内容通过&连接;及时删除临时和缓存文件:这样可以避免构造的镜像过于臃肿,并且这些缓存文件并没有实际用途;提高生产速
27、度:合理使用缓存、减少目录下的使用文件,使用.dockeringore文件等;调整合理的指令顺序:?在开启缓存的情况下,内容不变的指令尽量放在前面,这样可以提高指令的复用性;减少外部源的干扰:如果确实要从外部引入数据,需要制定持久的地址,并带有版本信息,让他人可以重复使用而不出错。D o c k e r f i l e 最佳实践?精简镜像用途:尽量让每镜像的构建,导入导出镜像的构建,导入导出 镜像构建常用语法:#docker build t 镜像名称:标签 f dockerfile文件路径 工作目录路径 镜像导出语法:#docker save 镜像名称:标签 o tar文件路径 镜像导入语法:
28、#docker load i tar文件路径 镜像的构建,导入导出 镜像构建常用语法:#d o c k e r 公共镜像库公共镜像库?dockerhub:Docker 官方镜像仓库,地址:https:/ 维护着超过15000的镜像。很多官方基础镜像都来源于此。可免费注册后上传自已的镜像。?国内镜像加速?阿里云:https:/?网易蜂巢:https:/?Daocloud:https:/dashboard.daocloud.io 如centos7中,配置镜像加速的方式为修改 /etc/sysconfig/docker 文件,添加行:OPTIONS=-registry-mirror=http:/ab
29、cd1234.m.daocloud.io 公共镜像库?d o c k e r h u b:D o c k e私有镜像库私有镜像库?docker-registry docker官方提供的镜像仓库。安装方便,入门级。?Harbor vmware开源的企业级镜像仓库。以 docker-registry 为基础,添加了访问控制,图形界面,镜像复制,支持等能力。?Nexus 3 著名的介质仓库,升级到 3之后,增加了 docker镜像管理能力。?Jfrog Artifactory 另一款有名的商业介质仓库,有开源版本。AD/LDAP私有镜像库?d o c k e r-r e g i s t r y d
30、o c k e r 目录目录 Docker介绍与原理 Docker基本操作 容器网络,镜像与仓库Docker实践实践?目录 D o c k e r 介绍与原理 D o c k e r 基本操作 容器网本机使用本机使用docker快速搭建开发环境快速搭建开发环境?使用Docker可快速搭建mysql,redis等常用开发中间件 示例:docker run-idt-name mysql-devops-p 3306:3306 -v/work/docker/config/devops/f:/etc/mysql/conf.d/f -v/work/docker/data/mysql:/var/lib/my
31、sql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=devops mysql:5.7?使用 docker-compose 一键启动多个关联容器:示例:harbor安装,只需要修改对应的 docker-compos e.yml 文件,然后在此文件目录下执行:docker-compose up 即可完成harbor的整体部署 本机使用d o c k e r 快速搭建开发环境?使用D o c k e r 可快像使用虚拟机一样使用容器像使用虚拟机一样使用容器?需要固定容器IP 使用 docker network create 创建自定义网络,如:#doc
32、ker network create-subnet=172.18.0.0/16 mynetwork#docker run-itd-name networkTest1-net mynetwork-ip 172.18.0.2 centos:latest/bin/bash 创建容器时,使用此网络,并指定ip地址:如果需要容器跨主机之间可以互访,需要添加相应的路由?需提供对外访问?容器启动sshd进程,对外暴露端口 通过web shell 接入容器内部,通过 docker exec 的流式API完成一个web版docker console 功能。开源项目:https:/ 像使用虚拟机一样使用容器?需要
33、固定容器I P 配套配套CI/CD完成持续构建与执续部署完成持续构建与执续部署 CI/CD愿景:一次构建,随处部署。自动构建,持续部署。配套C I/C D 完成持续构建与执续部署 C I/C D 愿景:一次配套配套CI/CD完成持续构建与执续部署完成持续构建与执续部署 配套C I/C D 完成持续构建与执续部署 配套配套CI/CD完成持续构建与执续部署完成持续构建与执续部署 配套C I/C D 完成持续构建与执续部署 配合编排与调度框架,大规模部署与运维容器配合编排与调度框架,大规模部署与运维容器 容器编排 Ingress Service Deployment Pod Pod Pod PV P
34、V PV 容器调度 容器调度器 主机 主机 主机 配合编排与调度框架,大规模部署与运维容器 容器编排 I n g r配合编排与调度框架,大规模部署与运维容器配合编排与调度框架,大规模部署与运维容器 业界的三大编排与调度框架?Kubernetes(k8s)谷歌出品。基于其内部系统Borg十多年的大规模应用运维经验总结。提供应用部署、维护、扩展机制等功能。生态活跃,发展迅速。功能强大,扩展性强。?Mesos Apache下的开源分布式资源管理框架,它被称为是分布式系统的内核。它一个通用的二层调度框架,最初是由加州大学伯克利分校的AMPLab开发的,后在 Twitter得到广泛使用。在可伸缩性和弹性
35、方面,Mesos对于运行着大规模集群的公司来说是最好的选择,在模拟测试中,其最高可以运行5万多个节点,Kubernetes 和Swarm都被限制在1000个节点(大约 5万个容器)?Swarm Swarm是Docker公司在2014年12月初新发布的容器管理工具,是 Docker的原生集群工具。特点:易于集成和设置,灵活的API,有限的定制,它和 docker配合得最好。由于它不能处理节点的失败问题,所以在实际的生产环境中,不推荐使用。配合编排与调度框架,大规模部署与运维容器 业界的三大编排与调配合编排与调度框架,大规模部署与运维容器配合编排与调度框架,大规模部署与运维容器 Kubernete
36、s,开启命令式运维 声明式运维的转变 Kubernetes 核心概念:?Node 宿主机节点,有master与worknode角色之分?Pod 容器组,运维的最小单位,内含一到多个高内聚的容器?Deployment 部署定义,集成了上线部署、滚动升级、创建副本、暂停上线任务,恢复上线任务,回滚到以前某一版本等能力?Service 负载均衡器,负责将流量转发至其下的各个pod?Ingress 对外域名服务,用于将应用的服务能力以域名加端口的方式对外暴露?PV 持久卷,用于容器数据持久化存储的volume。根据存储驱动的不同,可提供不同类型的卷?PVC 持久卷声明,将此声明绑定至deploymen
37、t之后,会自动选择合适的持久卷(PV)挂载至容器中?Label 标签,可添加至任意资源对象之上,为资源选择提供依据。如为节点打上标签,就可以在部署容器的时候,定义容器的亲和性,让此次部署的容器不要运行在某些节点上,或只运行在某些节点之上?DeamonSet 节点守护容器。每个节点会保证运行它的一个实例,如果异常退出了,k8s会自动重新启动它 配合编排与调度框架,大规模部署与运维容器 K u b e r n e t e容器日志收集容器日志收集 worknode deamonset filebeat 要求:将docker的驱动模式,改为 json-file worknode worknode worknode worknode K8s master 容器日志收集 w o r k n o d e d e a m o n s e t f i l e容器性能监控容器性能监控 方案:CAdvisor+InfluxDB+Grafana 1.部署cadvisor 5.监控信息展示 4.配置grafana展现项 2.集成 influxdb 3.集成 grafana 容器性能监控 方案:C A d v i s o r+I n f l u x D B+G平台 让创新无限 谢谢 平台 让创新无限 谢谢