Docker技术与实践主要内容一、Docker介绍及原理二、Docker基本操作三、Docker实践案例什么是Docker?Docker的生态圈认识DockerDockerVSVMDocker的原理Docker文件系统Docker三大核心Docker操作-仓库Docker操作-镜像Docker操作-容器Docker操作-DockerfileDocker操作-API待解决的问题案例架构说明容器配置存储-etcd配置管理代理-confd与容器联动第一部分Docker介绍及原理什么是Docker?Docker是一个构建在LXC之上,基于进程容器的轻量级VM解决方案,实现了一种应用程序级别的资源隔离及配额。Docker起源于PaaS提供商dotCloud基于go语言开发,遵从Apache2.0开源协议。EricBrewer(Google基础架构部副总裁)容器技术曾是Google的基础,我们和Docker联手,把容器技术打造为所有云应用的基石。我们能“升级互联网”至下一代。Solomon(docker创始人)•自动打包和部署应用•创建轻量、私有的PaaS环境•自动化测试和持续集成/部署•部署并扩展Web应用、数据库和后端服务器Docker应用场景Docker的生态圈OfficialRepos&14K+DockerizedAppsCommunity460+Contributors250+MeetupsonDocker2.75MDownloads6.7KProjectsonGitHubSupportEnterpriseSupportRobustDocumentationImplementation,Integration,TrainingNetworkofPartnersTheDockerPlatformDockerEngineDockerHubBuild,Ship,andRunPartnersContentUsers认识Docker•Namespaces(IBM)•Cgroups(Google)•LXCtools•TheLinuxKernel•Git•SELinux(RedHat)•SolarisZones•BSDJails•+++Docker如何和Linux内核打交道?•Docker平台工具、守护进程•Image镜像,包括应用及系统的只读数据包•Container容器,虚拟机的运行实例•Registry仓库登记,管理镜像文件•DockerhubDocker官方公有仓库Docker专业术语DockerVSVMDocker的原理•pid-进程•net-网络•ipc-消息•mnt-文件系统•uts-分时•user-用户Namespace资源隔离LinuxKernelrootnamespaceinitpid=1initpid=2bashpid=3bashpid=4Xnamespaceinitpid=1bashpid=2Docker文件系统•Docker镜像位于bootfs之上•每一层镜像的下面一层称为其父镜像(父子关系)•第一层镜像为BaseImage•容器在最顶层•其下的所有层都为readonly•Docker将readonly的FS层称作imageDockerAUFS特性第二部分Docker基本操作Docker三大核心容器Container镜像images仓库RepositoriesdockerHub(publicregistry)Docker-registry(privateregistry)Docker操作-仓库•dockersearchcentos6•dockerpullcentos:latest•dockerpushyorko/mysql:v2•dockerlogin仓库相关命令Docker操作-镜像•dockerimages•dockerrmicentos:latest•dockerbuild-t=yorko/mysql:v1.•dockerexportCONTAINERID/home/export.tar•cat/home/export.tar|dockerimport-yorko-1-export:latest•dockersaveyorko-1/home/save.tar•dockerload/home/save.tar镜像相关命令Docker操作-容器•dockerrun-d--dns172.17.42.1-p8080:80-p2022: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--namewebserver1webserver:v3/usr/sbin/apache2-DFOREGROUND•dockerstart/stop/restart/attach/killwebserver1容器运行相关命令Docker操作-DockerfileFROMubuntu/14.04MAINTAINERguol##installsshRUNapt-getinstallopenssh-server-y##configsshRUNmkdir/var/run/sshdRUNuseradd–s/bin/bash–m–d/home/guolguolRUNecho‘guol:123456’|chpasswdENVRUNNABLE_USER_DIR/home/guolEXPOSE22CMD[/usr/sbin/sshd-D]Dockerfile介绍Docker操作-APIimportdockerc=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)importdockerc=docker.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,restart_policy=None,cap_add=None,cap_drop=None)Pydockerapi操作第三部分Docker实践案例待解决的问题1、如何实现自动发现?2、如何支持多台主宿机?3、容器服务的高可用如何保障?5、如何实现资源最大化利用?4、如何保证容器服务负载均衡?案例架构说明HTTPrequestHaproxy(M)Haproxy(S)Confdhaproxy.cfgEtcdmasterEtcdslaveServer_1Container_1Apponport23842Container_2Apponport23843DockerServer_2Container_1Apponport14512Container_2Apponport14513DockerREST-APIHaproxy.cfg[Shell]DockerrunCurletcdsetEtcdConfd架构流程容器配置存储-etcdEtcd是一个高可用的Key/Value存储系统,主要用于分享配置和服务发现。•简单:支持curl方式的用户API(HTTP+JSON)•安全:可选SSL客户端证书认证•快速:单实例可达每秒1000次写操作•可靠:使用Raft实现分布式Etcd介绍#curl-L=“192.168.1.20:23843“{action:get,node:{createdIndex:2,key:“/app/servers/web1,modifiedIndex:2,value:192.168.1.20:23843}}#curl-L{action:delete,node:{createdIndex:3,“key”:“/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.toml[template]src=haproxy.cfg.tmpldest=/etc/haproxy/haproxy.cfgkeys=[/app/servers,]reload_cmd=/etc/init.d/haproxyreload#cat/etc/confd/templates/haproxy.cfg.tmpl…listenfrontend0.0.0.0:8080modehttpstatsenablestatsuri/haproxy?statsbalanceroundrobinoptionhttpcloseoptionforwardfor{{rangegets/app/servers/*}}server{{base.Key}}{{.Value}}check{{end}}…#cat/etc/haproxy/haproxy.cfg…listenfrontend0.0.0.0:8080modehttpstatsenablestatsuri/haproxy?statsbalanceroundrobinoptionhttpcloseoptionforwardforserverweb1192.168.1.20:35343checkserverweb2192.168.1.20:35346checkserverweb3192.168.1.20:35347check…与容器联动一个Docker自动发现,具备容灾及负载均衡的虚拟化平台完美呈现!Q&A