docker容器介绍

2022-12-24,,

                   Docker容器

一、什么是Docker?

Docker时Docker.Lnc公司开源的一个基于LXC技术之上搭建的Container容器引擎,源代码托管在Github上,基于Go语言并遵从Apache2.0协议开源。

Docker属于Linux容器的一种封装,提供简单易用的容器使用接口。

Docker将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了Docker,就不用担心环境问题。

总体来说,Docker的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

二、Docker的概念

Docker是开发人员和系统管理员使用容器开发、部署和运行应用程序的平台。使用Linux容器来部署应用程序称为集装箱化。使用docker轻松部署应用程序。

集装箱化的优点:

·灵活:即使是复杂的应用程序也可封装。

·轻量级:容器利用并共享主机内核。

·便携式:您可以在本地构建,部署到云上并在任何地方运行。

·可扩展性:您可以增加和自动分发容器副本。

·可堆叠:您可以垂直堆叠服务并及时并及时堆叠服务。

三、images和容器

通过运行images启动容器,一个images是一个可执行的包,其中包括运行应用程序所需要的所有内容-代码,运行时,库、环境变量和配置文件。

容器时images运行时示例-当被执行时(即,images状态,或者用户进程)在内存中,可以使用命令查看正在运行容器的列表docker ps,就像在Linux中一样。

四:容器和虚拟机

一个容器中运行原生Linux和共享主机与其它容器的内核,它运行一个独立的进程,不占用任何其它可执行文件的内存,使其轻量化。

相比之下,虚拟机(VM)运行一个完整的“客户”操作系统,通过虚拟机管理程序虚拟访问主机资源。一般来说,虚拟机提供的环境比大多数应用程序需要的资源多。

、Docker产生的目的就是解决以下问题

·环境管理复杂:从各种OS到各个中间件再到各种App,一款产品能够成功发布,作为开发者需要关心的东西太多,且难于管理,这个问题在软件兴业中普遍存在并需要直接面对。Docker可以简化部署多种应用实例工作,比如Web应用、后台应用、数据库应用、大数据应用比如Hadoop集群、消息队列等等都可以打包成一个image部署。

·云时代的到来:AWS的成功,引到开发者将应用转移到云上,解决来硬件管理的问题,然而软件配置和管理香瓜的问题依然存在。Docker的出现正好能帮助软件开发着开阔思路,尝试新的软件管理的方法解决这个问题。

·虚拟化手段的变化:云时代采用标配硬件来降低成本,采用虚拟化手段来满足用户按需分配的资源需求以及保证可用性和隔离性。然而无论是KVM还是Xen,在Docker看来都是在浪费资源,又难于管理,更加轻量级大LXC更加灵活和快速:

·LXC的便携性:LXC在Linux 2.6的Kernel里就已经存在了,但是其设计之初并非为云计算考虑,缺少标准化的描述手段和容器的可便携性,决定其构建出的环境难于分发和标准化管理(相对于KVM之类的image和sanpshot的概念)。Docker就在这个问题上作出了实质性的创新方法。

六、Docker的用途

Docker的主要用途,目前又三大类:

·提供了一次性的环境:比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。

提供弹性的云服务:因为Docker容器可以随开随关,很适合动态扩容和所容。

·组建微服务架构:通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。

七、基本概念

Docker镜像(lmage)

操作系统分为内核和用户空间,对于Linux而言,内核启动后,会挂载root文件系统为其提供用户空间支持。而Docker镜像(Image),就相当于是一个root文件系统。

Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

分层存储

因为镜像包含系统完整的root文件系统,其体积往往是庞大的,因此在Docker设计时,就充分利用Union FS技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个ISO那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层系统联合组成。

镜像构建时会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层,比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。

分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需要的内容,构建新的镜像。

Docker容器(container)

镜像(image)和容器(container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的root文件系统、自己的网络配置、自己的进程空间,甚至自己的用户ID空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立宿主的系统下操作一样。这种特性使容器封装的应用比直接在宿主运行更加安全。

前面讲过镜像使用的是分层储存,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,可以称这个味容器运行时读写而准备的存储层为容器存储层。

容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。

按照Docker最佳实践的要求,容器不应该向其存储层写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(volume)、或者绑定宿主目录,在这些位置的读写会跳过存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。

数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。

仓库(regist)

Docker Registry

镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry就是这样的服务。

一个Docker Registry中可以包含多个仓库(Repository);每个仓库可以包含多个标签(tag);每个标签对应一个镜像。

通常,一个仓库会包含一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件那个版本的镜像。如果不给出标签,将以laest作为默认标签。

以ubuntu镜像为例,ubuntu是仓库的名字,其包含有不同的版本标签,如,14.04,16.04。我们可以通过ubuntu:14.04或者ubuntu:16.04来具体指定所需要哪个版本的镜像。如果忽略了标签,比如ubuntu,那将视为ubuntu:latest。

仓库名经常以两段式路径形式出现,比如jwilder/nginx-proxy,前者意味着Docker Registry多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于所使用的具体Docker Registry的软件或服务。

八:Docker Registry公开服务

Docker Registry公开服务是开放给用户使用、允许用户管理镜像的Registry服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。

最常使用的Registry公开服务是官方的Docker Hub,这也是默认的Registry,并拥有大量的高质量的官方镜像。除此以外,还有CoreOS的Quay.io,CoreOS相关的镜像存储在这里;Google的Google Container Registry,Kubernetes的镜像使用的就是这个服务。

在国内访问这些服务可能会比较慢,郭恩ID饿一些云服务商题提供了针对Docker Hub的镜像服务(Registry Mirror),这些镜像服务被称为加速器。常见的有阿里云加速器、DaoCloud加速器等。使用加速器会直接从国内的地址下载Docker Hub的镜像,比直接从Docker Hub下载速度会提高很多。

Docker容器                      虚拟机                  启动

秒级                            分钟级                计算能力消耗

MB                               GB                   磁盘使用

上千个                         几十个                 系统支持量

资源限制                       完全隔离               隔离性

接近原生                       弱于                   性能

九:docker

1.快速交付和部署

对开发人员来说、最希望就是一次创建或配置、可以任意地方正常运行、开发者可以使用、一个标准的镜像来构建一套开发容器、开发完成后,运维人员可以直接使用这个容器来部署代码、DOCker可以快速创建容器、快速部署应用程序、

2.更高效的虚拟化

Docker容器的运行不需要额外的管理系统支持、他是内核的虚拟化、因此可以实现更高的性能和速率

3.更轻松的迁移和扩展

Docker 容器几乎可以在任意平台的运行、包括物理机、虚拟机、私有云、公有云、个人电脑、服务器等、这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另一个平台上

十:docker基础操作

docker容器操作

容器Docker的另一个核心概念,容器是镜像的一个运行实例、是独立运行的一个或一组应用以及他们所必需的运行环境、包括文件系统、系统类件、shell环境等、镜像是只读权限、而容器会给这个只读模板的一个额外的可写层

创建容器与运行容器、

docker的创建就是讲镜像加载到容器的过程、Docker的容器十分轻量级、用户可以随时创建或删除、新创建的容器默认是处于停止状态、不运行任何程序、需要在其中发起一个进程来启动容器、这个进程是该容器的唯一进程、所以当该进程结束、容器也会完全停止、停止的容器可以重新启动并保留原来的修改、可以使用Docker create 命令新建一个容器

命令格式:docker create 选项 镜像运行的程序

-i 让容器的输入保持打开

-t 让Docker分配一个伪终端

-d 后台运行

docker create -it docker.io/networkboot/dhcpd/bin/bash

vim /etc/sysctl.conf

net.ipv4.ip_forward = 1

sysctl -p

使用docker create 创建新容器后会返回一个唯一ID号

docker ps  查看所有容器的运行状态、添加-a 可以列出所有容器状态

docker start ID   容器启动

docker stop ID  关闭容器

docker ps           查看容器    -a 所有  -q 只查看ID

docker logs ID      查看容器内的输入

docker version      查看版本

Docker  search      查看镜像

Docker  pull        下载镜像

Docker  images      查看本地镜像

Docker  logs         查看终端显示

docker run docker.io/nginx/bin/bash-c ls/    //创建并启动

docker attach ID  进入容器

docker exec -it ID /bin/bash 进入容器

退出:exit 退出并结束                ctrl+p+q   退出并运行

导出:docker export ID/名称 > 文件

导入:cat 文件名 | docker import - 生成的镜像名:标签

拷贝:docker cp 主机文件路径 容器ID:目录

将主机/root/anaconda-ks.cfg目录拷贝到容器abc123的/tmp/下

docker cp /root/anaconda-ks.cfg abc123:/tmp

Docker rm  删除:rm (删除已停的容器)            rm -f (删除未停止的容器)

docker info  查看信息

docker  search  服务名(查找)

docker pull ID 下载

docker push ID   上传

docker images ID 查看镜像

docker tag ID 修改标签

docker save -o  保存镜像

docker inspect 镜像名

docker容器介绍的相关教程结束。

《docker容器介绍.doc》

下载本文的Word格式文档,以方便收藏与打印。