本文共 8940 字,大约阅读时间需要 29 分钟。
docker是开源项目,诞生于2013年。主要利用Linux内核namespace 实现沙盒隔离,用cgroup实现资源限制
docker项目的目标是实现轻量级的操作系统虚拟化解决方案,docker的基础是Linux容器(LXC)等技术。在LXC的基础上docker进行了进一步的封装,让用户不去关系容器的管理,使得操作更为方便,用户操作docker的容器就像操作一个快速的虚拟机一样简单。容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统的方式则是在硬件层面上实现的1 docker容器可以实现秒级的启动
2 docker容器对系统资源的利用率很高。一台主机上可以运行数千个docker容器3 容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小,传统虚拟机方式运行10个不同的应用就要起10个虚拟机,而docker只需要启动10个隔离的应用即可docker是以docker容器为资源分割和调度的基本单位,封装整个软件运行时环境、为开发者和系统管理员设计的、用于构建、发布和运行分布式应用的平台。它是一个跨平台、可一直并简单的容器解决方案。docker的代码托管在GitHub上,基于go语言开发并遵循Apache2.0协议。docker可在容器内部快速自动化地部署应用,并通过操作系统内核技术为容器提供资源隔离与安全保障。
镜像:就像是一个只读模板,镜像可以用来创建docker容器,docker提供了一个很简单的机制来创建或者更新现有的镜像,用户甚至可以直接从其他人哪里下载一个已经做好的镜像来直接使用。容器:docker 利用容器来运行应用,容器是从镜像创建的运行实例,他可以被启动,开始,停止,删除,每个容器都是互相隔离的,保证安全的平台,可以吧容器看作是一个简易版的Linux环境和运行在其中的应用程序注:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。仓库: 实际中存放镜像文件的场所,仓库和仓库注册服务器(registry)仓库注册服务器上往往存放着多个仓库,每个仓库有包含了多个镜像,每个镜像都有不同的标签(tag)仓库分为公开仓库(public)和私有仓库(private)两种形式最大的公开仓库是docker hub, 国内的公开仓库包括 docker pool 等,用户可以在本地网路内创建一个私有仓库 当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或私有仓库,这样下次再另外一个机器上使用这个镜像的时候,只需要从仓库上pull下来就可以了注: docker 仓库的概念跟Git 类似,注册服务器可以理解为GitHub这样的托管服务。OCI(open container initiative)容器云:容器云以容器为资源分割和调度的基本单位,封装整个软件运行时环境,为开发者和系统管理员提供用于构建、发布和运行分布式应用的平台。软件下载:
链接: 密码:72dr基本操作:
1 [root@server5 ~]# docker run -it --name vm1 rhel7:latest bash 创建容器2 [root@server5 ~]# docker ps -a # 查看容器状态3 [root@server5 ~]# docker attach vm1 # 链接容器4 [root@server5 ~]# docker top vm1 # 查看容器进程5 [root@server5 ~]# docker logs vm1 # 查看容器状态6 [root@server5 ~]# docker inspect vm1 # 查看容器详细信息7 [root@server5 ~]# docker stats vm1 # 查看容器资源使用率8 [root@server5 ~]# docker diff vm1 # 查看容器修改9 [root@server5 ~]# docker stop vm1 # 停止容器10 [root@server5 ~]# docker start vm1 # 启动容器11 [root@server5 ~]# docker restart vm1 # 重启容器12 [root@server5 ~]# docker pause vm1 # 暂停容器13 [root@server5 ~]# docker unpause vm1 # 恢复容器14 [root@server5 ~]# docker export vm1 > vm1.tar #导出容器15 [root@server5 ~]# docker import vm1.tar images # 导入镜像名为imagesha256:7ef5c57d2379ecd2f6a0de1ba813d0afb4fb86fd99b01c313c622cee5bb3ae58[root@server5 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEimages latest 7ef5c57d2379 5 seconds ago 140MB16 [root@server5 ~]# docker kill vm1 # 强制干掉容器17 [root@server5 ~]# docker rm vm1 # 删除容器18 [root@server5 ~]# docker search httpd # 查询镜像19 [root@server5 ~]# docker pull httpd # 拉取镜像20 [root@server5 ~]# docker push httpd # 推送镜像、21 [root@server5 ~]# docker rmi images:latest # 删除镜像run 运行
-it 交互模式显示-d 打入后台启动--name 指定其容器的名称为vm1,一般的,如果不指定,主机随意分配,最后面给的是镜像的名称,及用于启动的镜像挂载到宿主机的目录。即可生效。
也可以挂载多个:-v 可以指定多个冒号前面是宿主机目录(本地目录),冒号后面是容器中的挂载目录ro 表示只读原本的文件不管是容器还是宿主机都会创建
容器的默认模式。其容器之间可以通信,使用容器内部分配IP地址。
默认情况下,守护进程会创建一对对等接口,将其中一个接口设置为容器的eth0接口,另一个接口放置在宿主机的命名空间中,从而将宿主机上的所有容器都连接到这个内部网络上。同时,守护进程还会从网桥的私有地址空间中分配一个IP地址和子网给该容器。其所使用的IP地址和端口都是容器内部提供可以使用-p 或-P 指定-p 分配指定的端口映射-P 随机分配端口映射通过--network 进行指定
其占用宿主机IP和端口,但与外界通信较简单与容器公用一个IP和端口
--privileged=true 的权限很大,接近于宿主机的权限,为了防止权限滥用,需要增加限制,只提供给容器必须的权限。
1 运行容器并配置yum源,用于httpd 的安装
2 提交内容,并封装为基础镜像3 创建dockerfile 用于构造容器参数说明:1 FROM : 指定基础镜像2 MAINTAINER 作者信息3 ENV HOSTNAME 设置环境变量4 EXPOSE 暴露端口5 RUN 镜像操作命令6 CMD 镜像启动命令,默认只能启动一条7 USER 指定容器运行的用户8 WORKDIR 指定后续命令的执行目录9 COPY 复制本地文件夹到镜像中10 ADD 用于添加本地的tar 压缩包到容器指定目录,压缩包被自动解压为目录11 ENTRYPOINT 容器启动后执行的命令,让容器执行表现的向一个可执行程序一样,与CMD的区别是不可以被docker run 覆盖,会把docker run后面的参数当做传递给ENTRYPOINT 指令的参数,dockerfile 中只能制定一个ENTRYPOINT ,如果指定很多,以最后一个为准、12 VOLUME 挂载数据卷,将数据存储到宿主机可以访问的数据卷中4 执行 bulid,用于安装httpd服务5 运行容器并验证1 查看CPU个数
2 关闭其他的CPU3 查看CPU是否关闭4 修改CPU优先级5 重启服务6 进行测试7 查看CPU变化,8 关闭进程docker compose 将管理的容器分为三层:工程(project),服务(service)以及容器(contaienr)。compose是用来创建和运行对多容器应用的工具,使用compose首先需要编写compose文件来描述多个容器服务以及之间的关联,然后通过命令根据配置启动所有容器。
swarm 是docker 公司在2014年12 月初发布的一套工具,用来管理docker集群,它将docker宿主机变成一个单一的,虚拟的主机,swarm使用标准的docker API接口作为其前端访问入口,各种形式的docker client都可以和swarm 通信,
swarm deamon 只是一个调度器(scheduler)加路由器(router),swarm自己不运行容器,它只接受docker客户端发送过来的请求,调度适合的节点来运行容器,这意味着,即使由于某种原因swarm 挂掉了,集群中的节点也会照常运行,当swarm 重新恢复运行之后,他会收集重建集群信息。最上层的对外接口包括:docker API 用于管理镜像的声明周期swarm CLI 用于集群管理leadership 提供集群的HA,防止单点故障discovery service 是warm 的发现服务,他会在每个node 中注册一个angent 将各个节点的IP端口上报,manager会从发现服务读取各个节点信息schedule 调度模块,用于容器调度时选择最优节点。
filter(过滤),当创建或运行容器时,它会告诉调度器哪些节点是可用的(符合要求的)。filter可以分为两类,节点过滤和基于容器配置的过滤。节点过滤:constraints,约束过滤器,可以根据当前操作系统类型、内核版本、存储类型等条件进行过滤,当然也可以自定义约束,在启动daemon的时候,通过label来指定当前主机所具有的特点。基于容器配置过滤:affnity : 亲和性过滤器,支持容器亲和性和容器镜像亲和性,比如想将DB容器和web容器放在一起,就可以通过这个过滤器来实现dependcy:依赖过滤器,如果过容器再创建的时候使用了--volume-from/--link/--net 某个容器,则创建的容器会和依赖的容器在同一个节点上ports filter: 会根据端口的使用情况过滤strategy:根据策略选择最优节点binpack: 在同等条件下,选择资源使用最多的节点,通过这一个策略,可以将容器聚集起来spread: 在同等条件下,选择资源最少的节点,通过这一个策略,可以将容器均分在每一个节点上random:随机选择一个节点swarm create 命令用于创建一个集群标志,用于swarm管理docker集群时,docker node 的节点发现功能。发起该命令后,swarm会前往docker hub上内建的发现服务中获取一个全球唯一的token,用以唯一表示swarm管理的docker 集群。swarm manager
swarm manage 是最重要的命令,一旦swarm manage命令在swarm节点长被触发,则说明用户需要swarm开始管理docker集群,从运行流程角度来讲,swarm经历的阶段主要有两点:1 启动swarm包含三个步骤1 发现docker集群中的各个节点,收集节点状态,角色信息,并监事节点状态的变化发现是swarm中用于维护docker集群状态的机制,既然涉及到discovery ,那在这之前必须现有注册(register),swarm中有专门负责发现的模块。关于注册部分,不同的发现机制,对应不同的注册方式目前有5 中不同的发现机制:node discovery 、file discovery、 consul discovery、etcd discovery、zookeeper discovery 2 初始化内部调度(scheduler)模块swarm 通过发现机制发现所有注册docker node,并收集到所有docker node 的状态信息以及具体信息,此后,一旦swarm接收到具体的docker管理请求,swarm需要对请求进行处理,并通过所有docker node的状态以及具体信息来筛选(filter)决策到底哪些docker node 满足要求,并通过一定的策略将请求转发到一个具体的docker node上3 创建并启动API监听服务模块swarm创建并初始化API监听服务模块。从功能的角度来讲,可以将该模块抽象为swarm server ,需要说明的是:虽然swarm server完全兼容docker 的API,但是有不少docker 的命令目前是不支持的,毕竟管理docker集群与管理单独的docker 会有一些区别。当docker server 被初始化并完成监听之后,用户即可以通过docker client向swarm发送docker集群的管理请求。2 接收并处理docker集群管理请求swarm的swarm manage 接口并处理docker集群的管理请求,即使swarm内部多个模块协同合作的接口,请求入口为swarmserver,处理引擎为scheduler,节点信息依靠discoveryswarm join
用于将会docker node添加到swarm 管理的docker集群中,swarmjoin的命令执行位于docker node ,因此在docker node上执行该命令,首先需要在docker node上安装swarm,由于高swarm只会执行swarm join命令,可以将其当成docker node上用于注册的agent 模块docker node上 swarm join执行之后,标志docker node向swarm 注册,请求加入swarm管理的docker 集群中。swarm通过注册信息,发现dicker node,并获取docker node 的状态以及具体信息,以便处理docker 请求时作为调度依据。
swarm list
swarm中的swarm list 命令用以列举docker集群中docker node。docker node 的信息均来源swarm节点上注册的docker node。而一个都从客人 node 在swarm 节点上注册,仅仅是注册了docker node 的IP 地址以及docker 监听的端口号。使用docker list 命令时,需要指定discovery 的类型,类型包括:token、etcd、file、zk 以及<\ip>。1 查看镜像,所有节点都必须有相同的镜像
2 创建:
3 查看4 扩容5 缩容6 查看用于生产环境和开发环境之间的切换:
使用python相关语法验证负载均衡
1 建立挂载目录并进行挂载:
验证转载于:https://blog.51cto.com/11233559/2116010