1、Docker 技术与实践技术与实践刘天斯主要内容一、 Docker介 绍 及原理二、 Docker基本操作三、 Docker实 践案例 什么是 Docker? Docker的生态圈 认识 Docker Docker VS VM Docker的原理 Docker文件系统Docker三大核心Docker操作 -仓库Docker操作 -镜像Docker操作 -容器Docker操作 -DockerfileDocker操作 -API 待解决的问题 案例架构说明 容器配置存储 -etcd 配置管理代理 -confd 与容器联动第一部分Docker介绍及原理什么是 Docker?Docker是一个构建在 L
2、XC之上,基于进程容器的轻量级 VM解决方案,实现了一种应用程序级别的资源隔离及配额。Docker起源于 PaaS提供商 dotCloud 基于 go语言开发,遵从Apache2.0开源协议。Eric Brewer ( Google 基础架构部副总裁 )容器技术曾是 Google 的基础,我们和 Docker 联手,把容器技术打造为所有云应用的基石。我们能 “ 升级互联网 ” 至下一代。Solomon ( docker创始人 )自动打包和部署应用创建轻量、私有的 PaaS环境自动化测试和持续集成 /部署部署并扩展 Web应用、数据库和后端服务器Docker应用场景Docker Docker基于
3、容器技术的 轻量级 虚拟化解决方案 Docker是容器引擎,把 Linux的 cgroup、 namespace等容器底层技术进行封装抽象( 后面会介绍此两种技术 ),为用户提供了创建和管理容器的便捷界面(包括命令行和 API) Docker 是一个开源项目,诞生于 2013 年初,基于 Google 公司推出的 Go 语言实现 微软,红帽 Linux, IBM, Oracle等主流 IT厂商已经在自己的产品里增加对 Docker的支持。 Google 每周启动超过 20亿个容器进行业务服务,于上个世纪 90年代已经开始大规模使用容器技术问题1、资源利用效率低2、单物理机多应用无法有效隔离(进
4、程空间, cpu资源,磁盘)3、运维部署不便4、测试、版本管理复杂5、迁移成本高6、传统虚拟机,空间占用大,启动慢,管理 复杂Docker-轻量级虚拟化容器技术1、秒级启动,秒级停止,空间资源占用极少(几 M)2、实现进程级别的隔离3、可在普通服务器上建立上百个 docker实例4、加快开发测试部署的速度5、简化版本管理Docker的生态圈Official Repos & 14K+ Dockerized AppsCommunity460+ Contributors250+ Meetups on Docker2.75M Downloads6.7K Projects on GitHubSuppor
5、tEnterprise SupportRobust DocumentationImplementation, Integration, Training Network of PartnersThe Docker PlatformDocker EngineDocker Hub Build, Ship, and RunPartnersContentUsers认识 Docker Namespaces (IBM) Cgroups (Google) LXC tools The Linux Kernel Git SELinux (Red Hat) Solaris Zones BSD Jails +Doc
6、ker如何和 Linux内核打交道 ? Docker 平台工具、守护进程 Image 镜像,包括应用及系统的只读数据包 Container 容器,虚拟机的运行实例 Registry 仓库登记,管理镜像文件 Docker hub Docker官方公有仓库Docker专业 术语Docker VS VMDocker的原理pid - 进程net - 网络ipc - 消息mnt - 文件系统uts - 分时user - 用户Namespace 资源隔离LinuxKernelroot namespaceinitpid=1initpid=2bashpid=3bashpid=4X namespaceinitp
7、id=1bashpid=2Docker文件系统Docker镜像位于 bootfs之上每一层镜像的下面一层称为其父镜像 (父子关系 )第一层镜像为 Base Image容器在最顶层其下的所有层都为 readonlyDocker将 readonly的 FS层称作 “image“Docker AUFS特性第二部分Docker基本操作Docker三大核心容器Container镜 像images仓库Repositoriesdocker Hub(public registry)Docker-registry(private registry)Docker操作 -仓库 docker search cento
8、s6 docker pull centos:latest docker push yorko/mysql:v2 docker login仓库相关命令Docker操作 -镜像 docker images docker rmi centos:latest docker build -t=“yorko/mysql:v1“ . docker export /home/export.tar cat /home/export.tar | docker import - yorko-1-export:latest docker save yorko-1 /home/save.tar docker load
9、/home/save.tar镜像相关命令Docker操作 -容器 docker run -d -dns 172.17.42.1 -p 8080:80 -p 2022:22 -v /data:/data v /etc/httpd/conf:/etc/httpd/conf -v /etc/httpd/conf.d:/etc/httpd/conf.d v /etc/localtime:/etc/localtime:ro -name webserver1 webserver:v3 /usr/sbin/apache2 -DFOREGROUND docker start/stop/restart/atta
10、ch/kill webserver1容器运行相关命令Docker操作 -DockerfileFROM ubuntu/14.04MAINTAINER guol# install sshRUN apt-get install openssh-server -y# config sshRUN mkdir /var/run/sshdRUN useradd s /bin/bash m d /home/guol guolRUN echo guol:123456|chpasswdENV RUNNABLE_USER_DIR /home/guolEXPOSE 22CMD “/usr/sbin/sshd -D“D
11、ockerfile介绍Docker操作 -APIimport dockerc = docker.Client(base_url=tcp:/192.168.1.22:2375,version=1.14,timeout=10)c.create_container(image=“yorko/webserver:v1“,stdin_open=True,tty=True,command=“/usr/bin/supervisord -c /etc/supervisord.conf“,volumes=/data,ports=80,22,name=“webserver“)import dockerc = do
12、cker.Client(base_url=tcp:/192.168.1.22:2375,version=1.14,timeout=10)r=c.start(container=webserver, binds=/data:bind: /data,ro: False, port_bindings=80:80,22:2022, lxc_conf=None,publish_all_ports=True, links=None, privileged=False,dns=None, dns_search=None, volumes_from=None, network_mode=None,restar
13、t_policy=None, cap_add=None, cap_drop=None)Pydocker api操作第三部分Docker实践案例待解决的问题1、如何实现自动发现?2、如何支持多台主宿机?3、容器服务的高可用如何保障?5、如何实现资源最大化利用?4、如何保证容器服务负载均衡?案例架构说明HTTP requestHaproxy(M) Haproxy(S)Confd haproxy.cfgEtcd masterEtcd slaveServer_1Container_1App on port 23842Container_2App on port 23843DockerServer_2C
14、ontainer_1App on port 14512Container_2App on port 14513DockerREST-APIHaproxy.cfgShell Docker run Curl etcd setEtcdConfd架构流程容器配置存储 -etcdEtcd是一个高可用的 Key/Value 存储系统,主要用于分享配置和服务发现。 简单:支持 curl 方式的用户 API (HTTP+JSON) 安全:可选 SSL 客户端证书认证 快速:单实例可达每秒 1000 次写操作 可靠:使用 Raft 实现分布式Etcd介绍# curl -L http:/192.168.1.22:
15、4001/v2/keys/app/servers/web1 -XPUT -d value=“192.168.1.20:23843“action“: “get“,“node“: “createdIndex“: 2,“key“: “/app/servers/web1“,“modifiedIndex“: 2,“value“: “192.168.1.20:23843“# curl -L http:/192.168.1.22:4001/v2/keys/app/servers/web1 -XDELETE“action“: “delete“,“node“: “createdIndex“: 3,“key”:
16、“/app/servers/web1“,“modifiedIndex“: 4,“prevNode“: “key“: “/app/servers/web1“,“value“: “192.168.1.20:23843“,“modifiedIndex“: 3,“createdIndex“: 3配置管理代理 -confdconfd是一个轻量级的配置管理工具。 通过查询 Etcd,结合配置模板引擎,保持本地配置最新; 定期扫描,配置变更自动 reload。Confd介绍# cat /etc/confd/conf.d/helloworld.tomltemplatesrc = “haproxy.cfg.tm
17、pl“dest = “/etc/haproxy/haproxy.cfg“keys = “/app/servers“,reload_cmd = “/etc/init.d/haproxy reload“# cat /etc/confd/templates/haproxy.cfg.tmpllisten frontend 0.0.0.0:8080mode httpstats enablestats uri /haproxy?statsbalance roundrobinoption httpcloseoption forwardforrange gets “/app/servers/*“server base .Key .Value checkend# cat /etc/haproxy/haproxy.cfgserver web1 192.168.1.20:35343 checkserver web2 192.168.1.20:35346 checkserver web3 192.168.1.20:35347 check与容器联动一个一个 Docker自动发现,具备容灾及负载均衡的虚拟化平台完美呈现!自动发现,具备容灾及负载均衡的虚拟化平台完美呈现!Q & A