Docker--概述--(一)

  1. Docker介绍
  2. Docker官方安装
  3. Docker加速器
  4. 国内源镜像
  5. Docker系统
  6. Docker核心组件
  7. 名字空间
  8. 镜像管理

1.Docker介绍

        1.1  docker公司

官网地址:docker.com

公司名称:原名dotCloud 14年改名为docker

容器产品:docker 16年已经被更名为Moby

        1.2   容器简史

和虚拟机一样,容器技术也是一种资源隔离的虚拟化技术。

容器概念始于 1979 年提出的 UNIX chroot,它是一个 UNIX 操作系统的系统调用,将一个进程及其子进程的根目录改变到文件系统中的一个新位置,让这些进程只能访问到这个新的位置,从而达到了进程隔离的目的。

2000 年的时候 FreeBSD 开发了一个类似于 chroot 的容器技术 Jails,这是最早期,也是功能最多的容器技术。Jails 英译过来是监狱的意思,这个“监狱”(用沙盒更为准确)包含了文件系统、用户、网络、进程等的隔离。

2001 Linux 也发布自己的容器技术 Linux VServer,2004 Solaris 也发布了 Solaris Containers,两者都将资源进行划分,形成一个个 zones,又叫做虚拟服务器。

2005 年推出 OpenVZ,它通过对 Linux 内核进行补丁来提供虚拟化的支持,每个 OpenVZ 容器完整支持了文件系统、用户及用户组、进程、网络、设备和 IPC 对象的隔离。

2007 年 Google 实现了 Control Groups( cgroups ),并加入到 Linux 内核中,这是划时代的,为后期容器的资源配额提供了技术保障。

2008 年基于 cgroups 和 linux namespace 推出了第一个最为完善的 Linux 容器 LXC。

2013 年推出到现在为止最为流行和使用最广泛的容器 Docker,相比其他早期的容器技术,Docker 引入了一整套容器管理的生态系统,包括分层的镜像模型,容器注册库,友好的 Rest API。

2014 年 CoreOS 也推出了一个类似于 Docker 的容器 Rocket,CoreOS 一个更加轻量级的 Linux 操作系统,在安全性上比 Docker 更严格。

2016 年微软也在 Windows 上提供了容器的支持,Docker 可以以原生方式运行在 Windows 上,而不是需要使用 Linux 虚拟机。

此时容器技术就已经很成熟了,再往后就是容器云的发展,由此也衍生出多种容器云的平台管理技术,其中以 kubernetes 最为出众,有了这样一些细粒度的容器集群管理技术,也为微服务的发展奠定了基石。

        1.3  docker与传统

        (一)部署模式区别

传统的部署模式: 安装(包管理工具或者源码包编译)->配置->运行

Docker部署模式:复制->运行

        (二)容器和虚拟机区别

  1. 容器提供了基于进程的隔离,而虚拟机提供了资源的完全隔离。

  2. 虚拟机可能需要一分钟来启动,而容器只需要一秒钟或更短。

  3. 容器使用宿主操作系统的内核,而虚拟机使用独立的内核

  4. 容器只是一个进程,而虚拟机不是

        (三)Docker对服务器端开发/部署带来的变化

实现更轻量级的虚拟化,方便快速部署

对于部署来说可以极大的减少部署的时间成本和人力成本

Docker支持将应用打包进一个可以移植的容器中,重新定义了应用开发,测试,部署上线的过程,核心理念就是 Build once, Run anywhere

1)标准化应用发布,docker容器包含了运行环境和可执行程序,可以跨平台和主机使用;

2)节约时间,快速部署和启动,VM启动一般是分钟级,docker容器启动是秒级;

3)方便构建基于SOA架构或微服务架构的系统,通过服务编排,更好的松耦合;

4)节约成本,以前一个虚拟机至少需要几个G的磁盘空间,docker容器可以减少到MB级;

5)方便持续集成,通过与代码进行关联使持续集成非常方便;

6)可以作为集群系统的轻量主机或节点,在IaaS平台上,已经出现了CaaS,通过容器替代原来的主机。

        (四)Docker 优势

1、交付物标准化:

Docker是软件工程领域的"标准化"交付组件,最恰到好处的类比是"集装箱"。标准化设计大大提高了物流体系的运行效率。

传统的软件交付物包括:应用程序、依赖软件安装包、配置说明文档、安装文档、上线文档等非标准化组件。

Docker的标准化交付物称为"镜像",它包含了应用程序及其所依赖的运行环境,大大简化了应用交付的模式。

2、一次构建,多次交付:

类似于集装箱的"一次装箱,多次运输",Docker镜像可以做到"一次构建,多次交付"。当涉及到应用程序多副本;部署或者应用程序迁移时,更能体现Docker的价值。

3、应用隔离:

集装箱可以有效做到货物之间的隔离,使化学物品和食品可以堆砌在一起运输。Docker可以隔离不同应用程序之间的相互影响,但是比虚拟机开销更小。

总之,容器技术部署速度快,开发、测试更敏捷;提高系统利用率,降低资源成本。

        (五)Docker容器使用AUFS作为文件系统,有如下优势

1)节省存储空间:多个容器可以共享同一个基础镜像存储。

2)快速部署:如果部署多个来自同一个基础镜像的容器时,可以避免多次复制操作。

3)升级方便:升级一个基础镜像即可影响到所有基于它的容器。

4)增量修改:可以在不改变基础镜像的同时修改其目录的文件,所有的更高都发生在最上层的写操作层,增加了基础镜像的可共享内容。

        1.4   moby 、docker-ce 、docker-ee 、关系

moby是继承了原先的docker的项目,是社区维护的的开源项目,谁都可以在moby的基础打造自己的容器产品;

docker-ce是docker公司维护的开源项目,是一个基于moby项目的免费的容器产品

docker-ee是docker公司维护的闭源产品,是docker公司的商业产品。

moby project由社区维护,docker-ce project是docker公司维护,docker-ee是闭源的。

版本获取 :

要使用免费的docker    GitHub - docker/docker-ce: This repository is deprecated and will be archived (Docker CE itself is NOT deprecated) see the https://github.com/docker/docker-ce/blob/master/README.md

要使用收费的docker   Docker Business | Docker

2.Docker官方安装

        2.1   方案一

docker-ce的release计划跟随moby的release计划,可以使用下面的命令直接安装最新的docker-ce

# curl -fsSL https://get.docker.com/ | sh

如果是centos,上面的安装命令会在系统上添加yum源:/etc/yum.repos.d/docker-ce.repo

# wget https://download.docker.com/linux/centos/docker-ce.repo

# mv docker-ce.repo /etc/yum.repos.d

# yum install -y docker-ce

        2.2   方案二  

或者直接下载rpm安装

# wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm

# yum localinstall docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm

3.Docker加速器

        3.1    使用Aliyun Docker Yum源安装Docker

删除已安装的Docker :

# yum remove docker   docker-client   docker-client-latest  docker-common   docker-latest      docker-latest-logrotate docker-logrotate   docker-selinux  docker-engine-selinux   docker-engine

配置阿里云Docker Yum源 :

# yum install -y yum-utils device-mapper-persistent-data lvm2 git

# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

如何安装指定版本

查看Docker版本

# yum list docker-ce --showduplicates

安装较旧版本(比如Docker 17.03.2):需要指定完整的rpm包的包名,并且加上--setopt=obsoletes=0 参数

# yum install -y --setopt=obsoletes=0    docker-ce-17.03.2.ce-1.el7.centos.x86_64 \
   docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch

安装Docker最新版

# yum install docker-ce -y

        3.2  Centos8安装Docker报错解决方案

官方docker rpm包地址:

Index of linux/centos/7/x86_64/stable/Packages/

  1. 有关runc

删除卸载runc即可

  1. 有关containerd.io

下载相应版本即可

        3.3   启动Docker服务

#systemctl enable docker

#systemctl start docker 

        3.4  查看Docker版本及启动状态

# docker -v

# docker version

        3.5  查看Docker运行状态

# docker info

问题1

docker info的时候报如下错误:

bridge-nf-call-iptables is disabled

解决 :

追加如下配置,然后重启系统:

# vim /etc/sysctl.conf  
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1

问题2 :

虚拟机ping百度也能ping通,但是需要等好几秒才出结果,关键是下载镜像一直报错如下

解决 :

虚拟机用的网关和dns都是虚拟机自己的.1或者.2,把DNS改成8.8.8.8问题就解决了,ping百度也秒出结果

4.国内源镜像

  1. Daocloud

  2. Aliyun

5.Docker系统

Docker系统有两个程序:Docker服务端和Docker客户端

Docker服务端:

是一个服务进程,管理着所有的容器。

docker engine

Docker客户端:

扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程。

6.Docker核心组件        

Docker 镜像 - Docker images

Docker 仓库 - Docker registeries

Docker 容器 - Docker containers

容器组成要素

名称空间 namespace

资源限制 cgroups

文件系统 overlay2(UnionFS)

        6.1   Docker 仓库

用来保存镜像,可以理解为代码控制中的代码仓库。同样的,Docker 仓库也有公有和私有的概念。 公有的 Docker 仓库名字是 Docker Hub。Docker Hub 提供了庞大的镜像集合供使用。这些镜像可以是自己创建,或者在别人的镜像基础上创建。Docker 仓库是 Docker 的分发部分。

        6.2   Docker 镜像

Docker 镜像是 Docker 容器运行时的只读模板,每一个镜像由一系列的层 (layers) 组成。Docker 使用 UnionFS 来将这些层联合到单独的镜像中。UnionFS 允许独立文件系统中的文件和文件夹(称之为分支)被透明覆盖,形成一个单独连贯的文件系统。正因为有了这些层的存在,Docker 是如此的轻量。当你改变了一个 Docker 镜像,比如升级到某个程序到新的版本,一个新的层会被创建。因此,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新的层被添加或升级了。现在你不用重新发布整个镜像,只需要升级,层使得分发 Docker 镜像变得简单和快速。 在 Docker 的术语里,一个只读层被称为镜像,一个镜像是永久不会变的。

由于 Docker 使用一个统一文件系统,Docker 进程认为整个文件系统是以读写方式挂载的。 但是所有的变更都发生顶层的可写层,而下层的原始的只读镜像文件并未变化。由于镜像不可写,所以镜像是无状态的。

每一个镜像都可能依赖于由一个或多个下层的组成的另一个镜像。下层那个镜像是上层镜像的父镜像。

镜像名称组成 :     registry/repo:tag

基础镜像 :     一个没有任何父镜像的镜像,谓之基础镜像

镜像ID :    所有镜像都是通过一个 64 位十六进制字符串 (内部是一个 256 bit 的值)来标识的。 为简化使用,前 12 个字符可以组成一个短ID,可以在命令行中使用。短ID还是有一定的碰撞机率,所以服务器总是返回长ID。

        6.3   Docker 容器

Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、开始、停止、移动和删除。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分。

        6.4   Docker镜像和容器区别

Docker镜像

假设Linux内核是第0层,那么无论怎么运行Docker,它都是运行于内核层之上的。这个Docker镜像,是一个只读的镜像,位于第1层,它不能被修改或不能保存状态。

一个Docker镜像可以构建于另一个Docker镜像之上,这种层叠关系可以是多层的。第1层的镜像层我们称之为基础镜像(Base Image),其他层的镜像(除了最顶层)我们称之为父层镜像(Parent Image)。这些镜像继承了他们的父层镜像的所有属性和设置,并在Dockerfile中添加了自己的配置。

Docker镜像通过镜像ID进行识别。镜像ID是一个64字符的十六进制的字符串。但是当我们运行镜像时,通常我们不会使用镜像ID来引用镜像,而是使用镜像名来引用。

要列出本地所有有效的镜像,可以使用命令:

# docker images

镜像可以发布为不同的版本,这种机制我们称之为标签(Tag)。

可以使用pull命令加上指定的标签:

# docker pull ubuntu:14.04

Docker容器:

Docker容器可以使用命令创建:

# docker run imagename

它会在所有的镜像层之上增加一个可写层。这个可写层有运行在CPU上的进程,而且有两个不同的状态:运行态(Running)和退出态 (Exited)。这就是Docker容器。当我们使用docker run启动容器,Docker容器就进入运行态,当我们停止Docker容器时,它就进入退出态。

当我们有一个正在运行的Docker容器时,从运行态到停止态,我们对它所做的一切变更都会永久地写到容器的文件系统中。要切记,对容器的变更是写入到容器的文件系统的,而不是写入到Docker镜像中的。

我们可以用同一个镜像启动多个Docker容器,这些容器启动后都是活动的,彼此还是相互隔离的。我们对其中一个容器所做的变更只会局限于那个容器本身。

如果对容器的底层镜像进行修改,那么当前正在运行的容器是不受影响的,不会发生自动更新现象。

如果想更新容器到其镜像的新版本,那么必须当心,确保我们是以正确的方式构建了数据结构,否则我们可能会导致损失容器中所有数据的后果。

64字符的十六进制的字符串来定义容器ID,它是容器的唯一标识符。容器之间的交互是依靠容器ID识别的,由于容器ID的字符太长,我们通常只需键入容器ID的前4个字符即可。当然,我们还可以使用容器名,但显然用4字符的容器ID更为简便。

7.名字空间

名字空间是 Linux 内核一个强大的特性。每个容器都有自己单独的名字空间,运行在其中的应用都像是在独立的操作系统中运行一样。名字空间保证了容器之间彼此互不影响。

pid 名字空间

不同用户的进程就是通过 pid 名字空间隔离开的,且不同名字空间中可以有相同 pid。所有的 LXC 进程在 Docker中的父进程为Docker进程,每个 LXC 进程具有不同的名字空间。同时由于允许嵌套,因此可以很方便的实现嵌套的 Docker 容器。

net 名字空间

有 了 pid 名字空间, 每个名字空间中的 pid 能够相互隔离,但是网络端口还是共享 host 的端口。网络隔离是通过 net 名字空间实现的,每个 net 名字空间有独立的 网络设备, IP 地址, 路由表, /proc/net 目录。这样每个容器的网络就能隔离开来。Docker 默认采用 veth 的方式,将容器中的虚拟网卡同 host 上的一 个Docker 网桥 docker0 连接在一起。

ipc 名字空间

容器中进程交互还是采用了 Linux 常见的进程间交互方法(interprocess communication - IPC), 包括信号量、消息队列和共享内存、socket、管道等。然而同 VM 不同的是,容器的进程间交互实际上还是 host 上具有相同 pid 名字空间中的进程间交互,因此需要在 IPC 资源申请时加入名字空间信息,每个 IPC 资源有一个唯一的 32 位 id。

mnt名字空间

类似 change root,将一个进程放到一个特定的目录执行。mnt 名字空间允许不同名字空间的进程看到的文件结构不同,这样每个名字空间 中的进程所看到的文件目录就被隔离开了。同 chroot 不同,每个名字空间中的容器在 /proc/mounts 的信息只包含所在名字空间的 mount point。

uts 名字空间

UTS("UNIX Time-sharing System") 名字空间允许每个容器拥有独立的 hostname 和 domain name, 使其在网络上可以被视作一个独立的节点而非主机上的一个进程。

user 名字空间

每个容器可以有不同的用户和组 id, 也就是说可以在容器内用容器内部的用户执行程序而非主机上的用户。

8. 镜像管理

搜索镜像:  这种方法只能用于官方镜像库      例如搜索基于 Centos 操作系统的镜像

# docker search centos

查找 star 数至少为 100 的镜像,默认不加 s 选项找出所有相关 ubuntu 镜像:

# docker search ubuntu -f stars=100  

拉取镜像:

# docker pull centos

查看本地镜像:

# docker image list

查看镜像详情:

# docker image inspect 镜像id

删除镜像:
删除一个或多个,多个之间用空格隔开,可以使用镜像名称或id

# docker rmi daocloud.io/library/mysql

强制删除:--force
如果镜像正在被使用中可以使用--force强制删除 

# docker rmi docker.io/ubuntu:latest --force

删除所有镜像:

# docker rmi $(docker images -q)

只查看所有镜像的id:

# docker images -q 

查看镜像制作的过程,相当于Dockerfile:

# docker history daocloud.io/ubuntu

给镜像打tag:

# docker tag daocloud.io/ubuntu   daocloud.io/ubuntu:v1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值