操作系统级虚拟化之Docker学习应用实战

DockerDotCloud开源的、可以将任何应用包装在Linux container中运行的工具。20133月发布首个版本,当前最新版本为1.3Docker基于Go语言开发,代码托管在Github上,目前超过10000commit。基于Docker的沙箱环境可以实现轻型隔离,多个容器间不会相互影响;Docker可以自动化打包和部署任何应用,方便地创建一个轻量级私有PaaS云,也可以用于搭建开发测试环境以及部署可扩展的web应用等。


Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroupnamespace,以及AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 开始,则进一步演进为使用 runC 和 containerd

Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。

下面的图片比较了 Docker 和传统虚拟化方式的不同之处。传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

传统虚拟化图 1.4.1.1 - 传统虚拟化 Docker图 1.4.1.2 - Docker




我觉得简单来说,Docker就是一个应用程序执行容器,类似虚拟机的概念。但是与虚拟化技术的不同点在于下面几点:

  1. 虚拟化技术依赖物理CPU和内存,是硬件级别的;而docker构建在操作系统上,是操作系统级别的虚拟化,利用操作系统的containerization技术,所以docker甚至可以在虚拟机上运行。
  2. 虚拟化系统一般都是指操作系统镜像,比较复杂,称为“系统”;而docker开源而且轻量,称为“容器”,单个容器适合部署少量应用,比如部署一个redis、一个memcached。
  3. 传统的虚拟化技术使用快照来保存状态;而docker在保存状态上不仅更为轻便和低成本,而且引入了类似源代码管理机制,将容器的快照历史版本一一记录,切换成本很低。
  4. 传统的虚拟化技术在构建系统的时候较为复杂,需要大量的人力;而docker可以通过Dockfile来构建整个容器,重启和构建速度很快。更重要的是Dockfile可以手动编写,这样应用程序开发人员可以通过发布Dockfile来指导系统环境和依赖,这样对于持续交付十分有利。
  5. Dockerfile可以基于已经构建好的容器镜像,创建新容器。Dockerfile可以通过社区分享和下载,有利于该技术的推广

 

Docker三大核心组件: 

  1.      镜像(image) 静态概念,用于保存容器的运行环境和执行代码,image之与container等价于的类之与实例;
  2.      容器(container):动态概念,是镜像image执行的动态表现
  3.      仓库(Repository and Docker registry)Docker集中的存储、分发镜像的服务,用于共享和管理Docker镜像,用户可以上传或者下载上面的镜像,官方地址为https://registry.hub.docker.com/,也可以搭建自己私有的Docker registry

Docker主要特性:

  1. 文件系统隔离:每个进程容器运行在完全独立的根文件系统里。
  2. 资源隔离:可以使用cgroup为每个进程容器分配不同的系统资源,例如CPU和内存。
  3. 网络隔离:每个进程容器运行在自己的网络命名空间里,拥有自己的虚拟接口和IP地址。
  4. 写时复制:采用写时复制方式创建根文件系统,这让部署变得极其快捷,并且节省内存和硬盘空间。
  5. 日志记录:Docker将会收集和记录每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索。
  6. 变更管理:容器文件系统的变更可以提交到新的映像中,并可重复使用以创建更多的容器。无需使用模板或手动配置。
  7. 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次性交互shell。
  8. 便捷迭代的交付模式:通过Docker的仓库组件,能够便捷迭代的交付,部署和迁移客户服务,更适合云应用。

Docker and VM

从下图可以看出,VM是一个运行在宿主机之上的完整的操作系统,VM运行自身操作系统会占用较多的CPU、内存、硬盘资源。Docker不同于VM,只包含应用程序以及依赖库,基于libcontainer运行在宿主机上,并处于一个隔离的环境中,这使得Docker更加轻量高效,启动容器只需几秒钟之内完成。由于Docker轻量、资源占用少,使得Docker可以轻易的应用到构建标准化的应用中。但Docker目前还不够完善,比如隔离效果不如VM,共享宿主机操作系统的一些基础库等;网络配置功能相对简单,主要以桥接方式为主;查看日志也不够方便灵活。

Docker网络

Docker的网络功能相对简单,没有过多复杂的配置,Docker默认使用birdge桥接方式与容器通信,启动Docker后,宿主机上会产生docker0这样一个虚拟网络接口, docker0不是一个普通的网络接口,它是一个虚拟的以太网桥,可以为绑定到docker0上面的网络接口自动转发数据包,这样可以使容器与宿主机之间相互通信。每次Docker创建一个容器,会产生一对虚拟接口,在宿主机上执行ifconfig,会发现多了一个类似veth****这样的网络接口,它会绑定到docker0上,由于所有容器都绑定到docker0上,容器之间也就可以通信。

在宿主机上执行ifconfig,会看到docker0这个网络接口,启动一个container,再次执行ifconfig,会有一个类似veth****interface,每个container的缺省路由是宿主机上docker0ip,在container中执行netstat -r可以看到如下图所示内容:


容器中的默认网关跟docker0的地址是一样的:

当容器退出之后,veth*虚拟接口也会被销毁。

bridge方式,Docker还支持hostcontainernone三种网络通信方式,使用其它通信方式,只要在Docker启动时,指定--net参数即可,比如:

docker run -i -t  --net=host ubuntu /bin/bash

host方式可以让容器无需创建自己的网络协议栈,而直接访问宿主机的网络接口,在容器中执行ip addr会发现与宿主机的网络配置是一样的,host方式让容器直接使用宿主机的网络接口,传输数据的效率会更加高效,避免bridge方式带来的额外开销,但是这种方式也可以让容器访问宿主机的D-bus等网络服务,可能会带来意想不到的安全问题,应谨慎使用host方式;container方式可以让容器共享一个已经存在容易的网络配置; none方式不会对容器的网络做任务配置,需要用户自己去定制。

 

 

Dockerfile和通过Dockerfile来构建Nginx容器

除了pull,镜像也可以通过"编译"得到,这里的"编译"是指一种构建行为,通过手动编写或者从github获取Dockerfile来构建一个镜像。可以把Dockerfile看成是一个脚本,这个脚本会在容器每次启动时执行。一般在Dockerfile里面需要编写基础软件的安装脚本和配置脚本。下面这个Dockerfile是个例子:

#

# Ubuntu Dockerfile

#

# https://github.com/dockerfile/ubuntu

#

 

# Pull base image.

FROM ubuntu:12.10

 

#Update OS.

RUN echo"debhttp://archive.ubuntu.com/ubuntu quantal main universe multiverse" >/etc/apt/sources.list

RUN apt-getupdate

RUN apt-getupgrade -y

 

#Install basic packages.

RUN apt-getinstall -y software-properties-common

RUN apt-getinstall -y curl githtop unzip vim wget

 

#Add files.

ADD root/.bashrc/root/.bashrc

ADD root/.gitconfig/root/.gitconfig

ADD root/scripts/root/scripts

 

#Set workingdirectory.

ENV HOME /root

WORKDIR /root

FROM指令表示这次构建需要基于ubuntu仓库的12.10这个TAG的镜像,如果本地不存在这个镜像的话,会自动下载镜像。镜像实际上就是编译好的结果。向上面这个Dockerfile,在原始ubuntu的基础上安装了很多常用的软件。


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是关于轻量级虚拟Docker容器实战实验总结: Docker是一种轻量级虚拟技术,可以帮助我们构建、发布和运行分布式应用程序。以下是一些实验,可以帮助您了解Docker容器的基本操作和使用。 实验1:安装Docker 首先,为了使用Docker,您需要安装Docker引擎。对于Ubuntu系统,可以使用以下命令安装Docker: ``` sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io ``` 安装完成后,您可以使用以下命令检查Docker是否正确安装: ``` sudo docker run hello-world ``` 如果Docker成功安装,将输出“Hello from Docker!”消息。 实验2:创建和运行Docker容器 接下来,让我们创建并运行一个简单的Docker容器。首先,我们将创建一个Docker镜像,该镜像将在其中运行一个Python应用程序。 1. 创建一个名为“Dockerfile”的文件,并将以下内容添加到其中: ``` FROM python:3 ADD your_script.py / CMD [ "python", "./your_script.py" ] ``` 2. 然后,使用以下命令构建该镜像: ``` sudo docker build -t my-python-app . ``` 3. 构建完成后,使用以下命令运行该容器: ``` sudo docker run my-python-app ``` 这将在容器中运行您的Python应用程序。 实验3:使用Docker Compose编排多个容器 Docker Compose是一种工具,可帮助您编排多个Docker容器。以下是一些基本操作,可以帮助您开始使用Docker Compose。 1. 创建一个名为“docker-compose.yml”的文件,并将以下内容添加到其中: ``` version: '3' services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine" ``` 2. 然后,使用以下命令启动该服务: ``` sudo docker-compose up ``` 这将启动两个容器:一个Python Web应用程序和一个Redis实例。您可以通过访问“localhost:5000”来访问Web应用程序。 实验4:使用Docker Swarm进行集群管理 Docker Swarm是一种工具,可帮助您管理多个Docker节点并将它们组合成一个集群。以下是一些操作,可以帮助您开始使用Docker Swarm。 1. 初始Swarm: ``` sudo docker swarm init ``` 2. 将其他节点添加到Swarm: ``` sudo docker swarm join --token <token> <ip_address>:<port> ``` 3. 创建一个服务: ``` sudo docker service create --replicas 3 my-python-app ``` 这将在Swarm中创建一个名为“my-python-app”的服务,并创建3个副本。Docker Swarm将自动在集群中的不同节点上运行这些副本。 总结 以上是一些基本的Docker容器实验,可以帮助您了解和使用DockerDocker具有很多功能,可以帮助您构建、发布和运行分布式应用程序。希望这些实验对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值