---------------------------------------欢迎进入Docker容器世界------------------------------------------------
下面我们围绕Docker是什么,解决什么问题来说说Docker是干嘛的
- docker是什么
- 解决什么问题
Docker技术理论知识
什么是 Docker与Docker官方相关技术简介(可略读):
Docker是一套轻量级操作系统虚拟化解决方案,能够把容器部署到容器的开源引擎它由go语言编写。它基于Linux容器技术(LXC),Namespace,Cgroup,UnionFS(联合文件系统)等技术。
namespace(命名空间):命名空间是 Linux 内核一个强大的特性。每个容器都有自己单独的名字空间,运行在其中的应用都像是在独立的操作系统中运行一样。名字空间保证了容器之间彼此互不影响。docker实际上一个进程容器,它通过namespace实现了进程和进程所使用的资源的隔离。使不同的进程之间彼此不可见。我们可以把Docker容器想像成进程+操作系统除内核之外的一套软件。
cgroup(控制组):是 Linux 内核的一个特性,主要用来对共享资源进行隔离、限制、审计等。只有能控制分配到容器的资源,才能避免当多个容器同时运行时的对系统资源的竞争。控制组技术最早是由 Google 的程序员 2006 年起提出,Linux 内核自 2.6.24 开始支持。控制组可以提供对容器的内存、CPU、磁盘 IO 等资源的限制和审计管理。
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对 文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。另外,不同 Docker 容器就可以共享一些基础的文件系统层,同时再加上自己独有的改动层,大大提高了存储的效率。Docker 中使用的 AUFS(AnotherUnionFS)就是一种 Union FS。 AUFS 支持为每一个成员目录(类似 Git 的分支)设定只读(readonly)、读写(readwrite)和写出(whiteout-able)权限, 同时 AUFS 里有一个类似分层的概念, 对只读权限的分支可以逻辑上进行增量地修改(不影响只读部分的)。
Docker的生命周期包含三个部分,镜像,容器,仓库。
Docker镜像:实际上由一层一层的文件系统组成,这种层级的文件系统就是上文说到的UnionFS。在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。Docker在bootfs之上的一层是rootfs(根文件系统)。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
Docker镜像仓库:很简单:它就是一个存储和共享镜像文件的地方。
Docker容器:docker run命令已经创建了一个docker容器,当我们将一个镜像实例化为一个容器之后,docker会在read-only 的rootfs之上分配一层空的read-write的rootfs。
优势:方便快速的部署方式,交付物标准化,一次构建,多次交付,应用隔离。
总结:一个”容器”,实际上是一个由Linux的namespace和CGroup和rootfs三种技术构建出来的进程的隔离环境,其实可以看做一分二。(一组联合挂载在/var/lib/docker/aufs/mnt上的rootfs,这部分我们成为容器镜像。我们叫它静态视图,另一个是由Namespace+CGroup构成的隔离环境,这部分我们叫它容器,堪称动态视图)
Docker的使用场景
1:可以使用Docker容器开发,部署,测试应用程序。
2:创建隔离的运行环境。
3:构建多用户平台如服务(Paas)基础设施
4:提供软件如(Saas)应用程度
5:高性能,超大规模的宿主机器部署
Docker的组成部分
-
1 Docker Client客户端
- 我们使用docker客户端发送命令到守护进程 2 Docker Deamon守护进程
- 守护进程将执行结果发回客户端 3 Docker Image镜像
- docker是基于镜像启动的,镜像是容器的基石,docker镜像是一个层叠的只读的文件系统,它由一个bootfs引导文件系统启动,通过联合加载roots-》add emacs-》add Apache完成,一个镜像可以放到另一个镜像的底部也就是rootfs,简称基础镜像 4 Docker Container容器
-
容器通过镜像来启动,容器可以运行客户一个或多个的进程,当docker加载一个镜像时候会创建一个空的读写层(构建镜像栈),把镜像的文件系统读进这个读写层,这就是docker的写时复制。可以快速构建镜像,如图是一个构建docker的文件镜像
5 Docker Registry仓库
- docker用仓库来保存用户构建的镜像,仓库有共有和私有。私有镜像可以通过Docker Hub去构建
总结:我们通过客户端来访问docker的守护进程,从而操作docker的容器,容器通过镜像来创建,镜像又是保存在仓库中,下图是一个流程总结:
Docker容器的关键技术
Namespace 命名空间
:对于编程语言来说,命名空间是一种封装,对于封装本身呢,它是一个代码隔离,而对于操作系统来说呢,他是系统资源的隔离,进程,网络,文件系统的隔离。docker提供了五种命名空间:
Namespace | 作用 |
---|---|
PID | 进程的隔离 |
NET | 管理网络接口 |
IPC | 管理跨进程的访问 |
MNT(Mount) | 管理挂载点 |
UTS | 隔离内核和版本标识 |
那么这些隔离的资源是怎么管理起来的呢那么就需要用到control groups:
Control groups
:它是Linux内核提供的一种可以先限制,记录,隔离进程组可使用的管理资源的机制。Cgroups提供了哪些功能呢?首先是
编号 | 功能|作用
-------- | —
1| 资源限制|限制每个进程组内存使用的上限
2| 优先级的设定|可以限定哪些进程组使用更大的Cpu的资源
3|资源的计量|计算进程组使用了多少系统资源
4| 资源控制|可以挂起进程组
总结
- 关于 文件系统隔离 每个容器都有自己的root文件系统,
- 关于 进程隔离 每个容器都运行在自己的进程环境中.
- 关于 网路隔离 容器间的虚拟网络接口和IP地址都是分开的
- 关于 资源隔离和分组 使用Cgroups将CPU和内存之类的系统资源独立分配给每个docker容器
##DOCKER的安装 - 关于 Linux docker安装
- 关于 Windos docker安装
##DOCKER基本的常用命令
- 容器镜像的常用命令
docker run -it -v /docker_test -----------------
创建一个可交互式的容器( -i:允许我们对容器内的 (STDIN) 进行交互 -t:在新容器内指定一个伪终端或终端)
docker ps-----------------
docker启动的容器列表 docker ps -a加上-a参数 查看docker创建的所有容器
docker start/stop/restart/rm /docker_test -----------------
启动、停止、重启某个docker 容器
docker logs -f /docker_test -----------------
查看指定容器的日志记录
docker exec -ti /docker_test---------------
在运行容器中启动新进程,不会像attach方式因为退出,导致整个容器退出。
docker attach -------------
进入虚拟机,如果从这个stdin中exit,会导致容器的停止。
docker port /docker_test 8080--------------------
查看容器端口的映射情况
docker inspect /docker_test
查看Docker的底层信息,它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息
docker logs -f /docker_test -----------------
查看指定容器的日志记录
- 容器镜像的常用命令
增:
docker build -t friendlyname -----------------使用此目录的“Dockerfile”创建镜像
docker push 192.168.1.52:5000/zabbix -----------------提交镜像到本地私有
docker pull ubuntu:13.10 -----------------下载ubuntu:13.10镜像
docker image rm image_id ----------------- 从机器中移除指定镜像
docker image rm $(docker image ls -a -q) ----------------- 从机器上移除所有镜像查:
docker image ls -a -----------------列出机器上所有镜像
docker search httpd---------------------通过 docker search 命令搜索 httpd 来寻找适合我们的镜像运:
docker run httpd ---------------使用镜像仓库
##为什么要构建DOCKER镜像
- 可以保存对容器的修改,并在次使用。
- 自定义镜像的能力
- 以软件的形式打包并分发服务及其运行环境
所以,构建镜像是docker中非常重要的一项技术,通过自定义的镜像将服务与运行的系统及其软件运行环境,通过镜像打包在一起,通过运行在其他守护进程的docker主机上,都可以以这个镜像来运行服务。
###构建DOCKER镜像的两种模式
- docker commit-----通过容器构建
例子docker commit -a ‘yanghaibo’ -m ‘这是构建的镜像’ -p true containerName mirrorName-----提交成功会反回一个唯一id
- docker build --------通过Dockerfile文件构建
Dockerfile构建镜像可以理解成执行一个脚本去构建镜像(把构建镜像的多个步骤封装大文件里面)通过一次执行file的里面的命令构建对象
编写 Dockerfile(文件名) 列子如下:
FROM ubuntu:14.04
MAINTAINER ldy "2660304934@qq.com"
RUN apt-get -yqq update
RUN apt-get -y install openjdk-7-jre
ADD apache-tomcat-8.5.4.tar.gz /home/
ENV TOMCAT_HOME=/home/apache-tomcat-8.5.4/bin
EXPOSE 8080
最后执行 docker build -t=‘镜像的名称’ /dockerfile的目录-------------就完成镜像构建
###DOCKER守护进程的远程访问
远程访问守护进程启动选项可通过 -H来指定 有三种接受方式。
1:tcp://host:port
2:unix:///path/to/socket,
3:fd://* or fd://socketfd
守护进程默认的配置:-H Unix:///var/run/docker.sock,配置docker远程访问方式可通过修改 vim /etc/default/docker 增加DCOKER_OPTS="- Lable name=docker_server_1 -H tcp://0.0.0.0:2375"来配置远程访问,
###DOCKER的数据卷-
这里我们要理解数据卷容器和容器数据卷的区别。首先说说容器数据卷,在容器启动时,我们在镜像中指定的数据卷都会被进行一次初始化。 如下图
那么我们根据镜像指定数据卷创建的容器所使用的数据卷就没办法进行共享。
所以我们要使用数据卷容器来达到数据卷共享的目的。将新创建的容器挂在到数据卷容器上可以了如;挂载数据卷容器的方法:docker run --volumes-from 容器名。可以参考:
https://blog.csdn.net/u014231523/article/details/65631001
###DOCKER的网络连接
docker守护进程的启动选项配置 --icc=false --iptables=true --link icc指定了是否禁止docker容器的网络访问 如果禁止并且设置了iptables=true 可以通过link参数指定特别的网络地址之间的docker容器访问。
###DOCKER的跨主机访问
- 使用网桥实现跨主机容器连接–优点配置简单,缺点ip网段不易管理,不适用生产环境
- 使用Open vSwitch(ovs)实现跨主机的容器连接
- 使用weave实现跨主机的容器连接
###DOCKER管理工具三剑客
- Docker管理
docker Swarm作为一个管理docker的集群工具,可以单独部署在一个节点上,Swarm的具体工作流程:docker client发送请求到Swarm,Swarm处理请求并发送到相应的Docker Node,DcokerNode执行相应的操作并响应,Swarm有哪些命令呢,主要有三个命令。1:运行一个命令创建集群。然后把这些Docker Node加入到集群中,然后每个docker node上运行一个命令与Swarm相连。Swarm将一组docker engine作为一个集群管理,并提供label(比如调度具有某个label标签的node上去),schedule,filter的能力,允许用户定制自己的调度能力和策略。Swarm可以与第三方的编排工具也能很好的配合比如Mesos。
- Shipyard-监控工具
- cAdvisor-Google监控工具实时的监控,保存数据时间不长。