• 1. Docker 技术与实践刘天斯
  • 2. 主要内容一、Docker介绍及原理二、Docker基本操作三、Docker实践案例 什么是Docker? Docker的生态圈 认识Docker Docker VS VM Docker的原理 Docker文件系统Docker三大核心 Docker操作-仓库 Docker操作-镜像 Docker操作-容器 Docker操作-Dockerfile Docker操作-API 待解决的问题 案例架构说明 容器配置存储-etcd 配置管理代理-confd 与容器联动
  • 3. 第一部分Docker介绍及原理
  • 4. 什么是Docker? Docker是一个构建在LXC之上,基于进程容器的轻量级VM解决方案,实现了一种应用程序级别的资源隔离及配额。Docker起源于PaaS提供商dotCloud 基于go语言开发,遵从Apache2.0开源协议。Eric Brewer  ( Google 基础架构部副总裁 ) 容器技术曾是 Google 的基础,我们和 Docker 联手,把容器技术打造为所有云应用的基石。我们能“升级互联网”至下一代。 Solomon ( docker创始人 )自动打包和部署应用 创建轻量、私有的PaaS环境 自动化测试和持续集成/部署 部署并扩展Web应用、数据库和后端服务器Docker应用场景
  • 5. Docker的生态圈Official Repos & 14K+ Dockerized AppsCommunity 460+ Contributors 250+ Meetups on Docker 2.75M Downloads 6.7K Projects on GitHubSupport Enterprise Support Robust Documentation Implementation, Integration, Training Network of PartnersThe Docker Platform Docker Engine Docker Hub Build, Ship, and RunPartnersContentUsers
  • 6. 认识DockerNamespaces (IBM) Cgroups (Google) LXC tools The Linux Kernel Git SELinux (Red Hat) Solaris Zones BSD Jails +++Docker如何和Linux内核打交道? Docker 平台工具、守护进程 Image 镜像,包括应用及系统的只读数据包 Container 容器,虚拟机的运行实例 Registry 仓库登记,管理镜像文件 Docker hub Docker官方公有仓库Docker专业术语
  • 7. Docker VS VM
  • 8. Docker的原理pid - 进程 net - 网络 ipc - 消息 mnt - 文件系统 uts - 分时 user - 用户Namespace 资源隔离LinuxKernelroot namespaceinit pid=1init pid=2bash pid=3bash pid=4X namespaceinit pid=1bash pid=2
  • 9. Docker文件系统Docker镜像位于bootfs之上 每一层镜像的下面一层称为其父镜像(父子关系) 第一层镜像为Base Image 容器在最顶层 其下的所有层都为readonly Docker将readonly的FS层称作 "image"Docker AUFS特性
  • 10. 第二部分Docker基本操作
  • 11. Docker三大核心容器 Container镜像 images仓库 Repositoriesdocker Hub (public registry)Docker-registry (private registry)
  • 12. Docker操作-仓库 docker search centos6 docker pull centos:latest docker push yorko/mysql:v2 docker login仓库相关命令
  • 13. 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 < /home/save.tar镜像相关命令
  • 14. 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/attach/kill webserver1容器运行相关命令
  • 15. Docker操作-DockerfileFROM ubuntu/14.04 MAINTAINER guol ## install ssh RUN apt-get install openssh-server -y ## config ssh RUN mkdir /var/run/sshd RUN useradd –s /bin/bash –m –d /home/guol guol RUN echo ‘guol:123456’|chpasswd ENV RUNNABLE_USER_DIR /home/guol EXPOSE 22 CMD ["/usr/sbin/sshd -D"]Dockerfile介绍
  • 16. Docker操作-APIimport docker c = 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 docker c = 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)Pydocker api操作
  • 17. 第三部分Docker实践案例
  • 18. 待解决的问题1、如何实现自动发现?2、如何支持多台主宿机?3、容器服务的高可用如何保障?5、如何实现资源最大化利用?4、如何保证容器服务负载均衡?
  • 19. 案例架构说明HTTP requestHaproxy(M)Haproxy(S)Confd  haproxy.cfgEtcd masterEtcd slave Server_1 Container_1App on port 23842 Container_2App on port 23843 Docker Server_2 Container_1App on port 14512 Container_2App on port 14513 DockerREST-APIHaproxy.cfg[Shell] Docker run Curl etcd setEtcdConfd架构流程
  • 20. 容器配置存储-etcd Etcd是一个高可用的 Key/Value 存储系统,主要用于分享配置和服务发现。 简单:支持 curl 方式的用户 API (HTTP+JSON) 安全:可选 SSL 客户端证书认证 快速:单实例可达每秒 1000 次写操作 可靠:使用 Raft 实现分布式Etcd介绍# curl -L http://192.168.1.22: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”: “/app/servers/web1", "modifiedIndex": 4 }, "prevNode": { "key": “/app/servers/web1", "value": "192.168.1.20:23843", "modifiedIndex": 3, "createdIndex": 3 } }
  • 21. 配置管理代理-confd confd是一个轻量级的配置管理工具。 通过查询Etcd,结合配置模板引擎,保持本地配置最新; 定期扫描,配置变更自动reload。Confd介绍# cat /etc/confd/conf.d/helloworld.toml [template] src = "haproxy.cfg.tmpl" dest = "/etc/haproxy/haproxy.cfg" keys = [ "/app/servers", ] reload_cmd = "/etc/init.d/haproxy reload"# cat /etc/confd/templates/haproxy.cfg.tmpl … listen frontend 0.0.0.0:8080 mode http stats enable stats uri /haproxy?stats balance roundrobin option httpclose option forwardfor {{range gets "/app/servers/*"}} server {{base .Key}} {{.Value}} check {{end}} … # cat /etc/haproxy/haproxy.cfg … listen frontend 0.0.0.0:8080 mode http stats enable stats uri /haproxy?stats balance roundrobin option httpclose option forwardfor server web1 192.168.1.20:35343 check server web2 192.168.1.20:35346 check server web3 192.168.1.20:35347 check …
  • 22. 与容器联动一个Docker自动发现,具备容灾及负载均衡的虚拟化平台完美呈现!
  • 23. Q & A