主要内容:
docker介绍及原理
什么是docker?
Docker和Vm的差别
Docker原理
Docker文件系统
Docker基本操作
Docker三大核心
Docker操作-仓库
Docker操作-镜像
Docker操作-容器
Docker操作-Dockerfile
Docker应用场景
一:Docker概述
Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。
Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。
Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。
在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。
当今比较知名的虚拟机技术的代表:VMWare/virtualBox。
对比docker和虚拟机的区别:
注:HOSTED Hypervisor——一种运行在基础物理服务器和操作系统之间的中间软件层
虚拟机和容器的比较:
1)docker架构
Docker 采用了 C/S架构,包括客户端和服务端。 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。 客户端和服务端既可以运行在一个机器上,也可通过 socket 或者 RESTful API 来进行通信。
2)LXC和Docker
docker基于lxc(linux container)技术实现的核心管理引擎(v0.9之前,之后docker自己实现了libcontainer,)
docker技术的依赖:namespace,cgroups, unionfs
namespace(不同版本内核支持略有不同):
Pid:进程隔离,不同docker容器内部的进程号可以重复,父进程可以看到子进程信息
Net:网络隔离
Ipc:消息隔离,进程通信隔离
Mnt:文件系统隔离
Uts:主机名隔离
User:用户隔离
...
linux每个运行的进程都有在系统对应的文件夹:
cgroups(ctrl group):
在运行docker容器的时候可以指定容器的资源,如:cpu,memory,在多租户环境下,容器必须指定所需要的资源限制,否则一个容器就可能侵蚀全部的宿主机资源,导致其他用户容器无法申请到有效资源。cgroups是 linux 内核提供的一种机制,这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。简单说,cgroups 可以限制、记录任务组所使用的物理资源。本质上来说,cgroups 是内核附加在程序上的一系列钩子(hook),通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。
unionFS:
Docker镜像位于bootfs之上,下层镜像为上层镜像的父镜像,容器在最顶层,image是可读层。
Docker技术不能替代LXC。“ LXC”是指Linux内核(特别是名称空间和控制组)的功能,这些功能允许彼此进行沙盒处理并控制其资源分配。
二:Docker的三大核心
一)Docker Image
1)镜像介绍
一句话形容image:Build once,Run anywhere
在 Docker 的术语里,一个只读层被称为镜像,一个镜像是永久不会变的。
由于 Docker 使用一个统一文件系统,Docker 进程认为整个文件系统是以读写方式挂载的。 但是所有的变更都发生顶层的可写层,而下层的原始的只读镜像文件并未变化。由于镜像不 可写,所以镜像是无状态的。
2)父镜像
一个镜像可以建立在另一个镜像的基础之上,好比,在一个debian之上构建装有apache应用的镜像,该镜像就是debian的父镜像,后续讲解镜像构建之dockerbuild时候会有类似的例子。
3)镜像相关常用命令
docker images 用来展示本地已有镜像,就可以看到上述的镜像id
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 12.04 74fe38d11401 4 weeks ago 209.6 MB
ubuntu precise 74fe38d11401 4 weeks ago 209.6 MB
ubuntu 14.04 99ec81b80c55 4 weeks ago 266 MB
ubuntu latest 99ec81b80c55 4 weeks ago 266 MB
ubuntu trusty 99ec81b80c55 4 weeks ago 266 MB...
*注)tag信息一般用来标注镜像版本
docker pull 镜像拉取,国外镜像需要翻墙,国内推荐阿里云
docker run 当然,启动一个容器就要使用docker run命令啦
docker rmi 删除镜像
docker push docker镜像上传镜像库,便于共享
docker commit用来保存运行的容器为镜像,因为镜像是只读的,一切写操作都是基于container的,并不会同步到镜像里,如果需要保存运行的容器为镜像,可使用此命令保存。
4)dockerfile
dockerfile是最常用构建镜像的一种方式
Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令、容器启动执行指令。一开始必须要指明所基于的镜像名称,接下来一般会说明维护者信息;后面则是镜像操作指令,例如 RUN 指令。每执行一条RUN 指令,镜像添加新的一层,并提交;最后是 CMD 指令,来指明运行容器时的操作命令。
# 1、第一行必须指定 基础镜像信息
FROM ubuntu
# 2、维护者信息
MAINTAINER docker_user docker_user@email.com
# 3、镜像操作指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
# 4、容器启动执行指令
CMD /usr/sbin/nginx
二):Docker Container
Container是image运行时的一种状态,在使用docker -run 的时候就会根据指定的镜像生成对应的container,container是image最上面的一层,提供读写。
1)docker 容器相关操作
$ docker run -d ubuntu:14.04 /bin/bash //使用镜像创建容器
root@af8bae53bdd3:/# 进入容器内部
$ docker ps //查看容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAME
S1e5535038e28 ubuntu:14.04 /bin/bash 2 minutes ago Up 1 minute name
$ docker stop S1e5535038e28 //停止容器
$ docker start S1e5535038e28 //开始容器
$ docker kill S1e5535038e28 //kill掉容器
$ docker attach S1e5535038e28 //进入到容器内部
$ docker ps //查看运行中的容器
$ docker commit //将镜像保存为新容器
三):Docker Hub
仓库相关命令
docker pull
docker push
docker login
docker search
DockerHub类似于GitHub,只不过一个存放代码,一个存放镜像,一个公共分享平台。
DockerHub官方镜像库:https://hub.docker.com/search?q=&type=image
阿里云镜像库:https://cr.console.aliyun.com/cn-shenzhen/instances/images
默认的docker pull /push 都是默认和DockerHub进行的交互,DockerHub使用需要翻墙,国内有阿里云提供镜像加速。
docker pull ubuntu:latest 等于:docker pull registry.hub.docker.com/ubuntu:latest
使用阿里云镜像:git pull registry.cn-shenzhen.aliyuncs.com/centos_7/centos_7
三:Docker Volumes
一)数据卷
数据卷的功能是可以供一个或者多个容器使用的特殊目录
数据卷可以在容器之间共享和重用
对数据卷的修改会立马生效
对数据卷的更新,不会影响镜像
卷会一直存在,直到没有容器使用
在启动容器的时候指定挂载数据卷,下例为挂载当前宿主机的目录到容器,运行中的容器默认拥有读写权限,也可以添加只读权限 (:ro),这样子容器内部的需要持久化的数据都可以通过这方式保留下来
[root@instance-yja4jwnn ~] docker run -t -i -p 5001:5000 -v /root/dockertest/:/dockertest registry.cn-hangzhou.aliyuncs.com/centos-server/centos6 /bin/bash
[root@a4438569732c /] ls
bin boot dev dockertest etc home lib lib64 lost+found media mnt opt proc root sbin selinux srv sys tmp usr var
[root@a4438569732c /] ls dockertest/
my.txt
二)数据卷容器
为了便于统一容器化和管理,docker支持数据卷容器挂载
[root@instance-yja4jwnn ~] docker run -d -v /dockertest --name vdata registry.cn-hangzhou.aliyuncs.com/centos-server/centos6 /bin/bash #新建数据卷容器
5f9fa55664037cfacae9cea84f654ebb8cf7c56dc86bbc3361c6661925be7383
[root@instance-yja4jwnn ~] docker run -d --volumes-from vdata
--name ct1 registry.cn-hangzhou.aliyuncs.com/centos-server/centos6 /bin/bash #启动容器并挂载数据卷容器
四:Docker网络模型
docker网络模型主要分为四种:
1)host
docker run --net=host .....
默认情况下docker网络是与宿主机通过NETWORK NAMESPACE隔离的,网卡,路由规则,iptables都会隔离,当指定net=host时候,容器不会有自己的网卡,ip,而是和主机公用一个NETWORK NAMESPACE,容器直接使用主机网络(ip,网卡,ipatbles,路由),当然除了网络,其他还是隔离的。
2)bridge
docker run = docker run --net=bridge
这是docker默认的网络模型,安装docker server的时候,会在宿主机上新增docker0网桥,所有在此宿主机上面启动的容器都会链接到这个网桥,一个网桥下面的宿主机可以直接通信
3)container
docker run --net=containerid/name
与指定的容器共享NETWORK NAMESPACE,除了网络不隔离,其他都是隔离的
4)none
为docker建立网络隔离,没有任何网络配置,用户自定义配置
5)跨主机网络通信
overlay网络(1.8支持,需要额外公用存储支持),基于虚拟路由的weave(三方插件)
五·:Container Tools
前面我们使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知,所以需要容器编排工具来统一管理容器,现在业界比较成熟的容器管理工具:
Docker Compose(官方单主机容器管理):
Docker-Compose 是用来管理你的容器的,有点像一个容器的管家,想象一下当你的Docker中有成百上千的容器需要启动,如果一个一个的启动那得多费时间。有了Docker-Compose你只需要编写一个文件,在这个文件里面声明好要启动的容器,配置一些参数,执行一下这个文件,Docker就会按照你声明的配置去把所有的容器启动起来,但是Docker-Compose只能管理当前主机上的Docker,也就是说不能去启动其他主机上的Docker容器
Docker Swarm(官方跨主机容器管理):
Swarm是Docker公司在2014年12月初发布的一套用来管理Docker集群的较为简单的工具,由于Swarm使用标准的Docker API接口作为其前端访问入口,所以各种形式的Docker Client(dockerclient in go, docker_py, docker等)都可以直接与Swarm通信。随着Swarm0.2发布,swarm增加了新的策略来调度集群中的容器方式,使得在可用的节点上传播它们,以及支持更多的Docker命令以及集群驱动。
Kubernetes(前Borg google跨主机容器管理):
Kubernetes它本身的角色定位是和Docker Swarm 是一样的,也就是说他们负责的工作在容器领域来说是相同的部分,当然也有自己一些不一样的特点。这个就像是Eclipse和IDEA一样,也是一个跨主机的容器管理平台。它是谷歌公司根据自身的多年的运维经验研发的一款容器管理平台。而Docker Swarm则是由Docker 公司研发的。
Mesos
是一个集群资源调度系统,对集群中的资源进行分配和管理。Marathon是运行在Mesos之上的一个服务管理框架,可管 理容器生命周期。
六:Docker的应用场景
一)场景概述
持续集成和持续部署:
微服务场景:
云主机:
对比虚拟机来讲,云主机启动更加快速,占用资源更少,使用灵活并且使用者无感知,所以有些人直接使用Docker的Ubuntu等镜像创建容器,当作轻量的虚拟机来使用,现在随着开发/测试环境的复杂化,多用户共用环境会带来各种不可控因素,使用docker的容器,秒级别启动,使用便捷,容器的创建和回收非常的便捷。
基于docker实现跨平台应用:
docker容器可以选择操作系统,目前docker容器几乎已经支持全部主流的系统,而且docker容器可以运行在所有支持docker的宿主机系统之上,从而达到屏蔽系统底层的差异。