Docker技术与实践第一部分Docker介绍及原理什么是Docker?Docker是一个构建在LXC之上,基于进程容器的轻量级VM解决方案,实现了一种应用程序级别的资源隔离及配额。Docker起源于PaaS提供商dotCloud基于go语言开发,遵从Apache2.0开源协议。认识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架构流程应用场景:1.对应用进行自动打包和部署2.创建轻量、私有的PAAS环境3.自动化测试和持续整合与部署4.部署和扩展Web应用、数据库和后端服务最后:A.DockerVSVMB.微服务架构容器镜像仓库