Skip to content

简介

常用网站

https://hub.docker.com/

https://docs.docker.com/

https://github.com/docker

docker中文社区

简介

说实话,Docker 算不上是什么全新的技术,它基于 LXC(LinuX Containers),使用 AUFS,而这些都是已经存在很长时间并被广泛应用了的技术。
但运营 PaaS 服务的 dotCloud 公司将这些技术整合到一起,提供了简单易用的跨平台、可移植的容器解决方案。
Docker 最初由 dotCloud 公司在 2013 年发布。
自发布以来,其发展速度之快超乎了很多人的想象,一路高歌猛进,2014 年 6 月终于发布了 1.0 稳定版,而 dotCloud 在 2013 年 10 月干脆连公司名字也改为了 Docker.Inc。

Docker 也可以被称为轻量级虚拟化技术。
与传统的 VM 相比,它更轻量,启动速度更快,单台硬件上可以同时跑成百上千个容器,所以非常适合在业务高峰期通过启动大量容器进行横向扩展。
现在的云计算可能更多地是在使用类似 EC2 的云主机,以后也许应该更多地关注容器了。

Docker 是可移植(或者说跨平台)的,可以在各种主流 Linux 发布版或者 OS X 以及 Windows 上(需要使用 boot2docker 或者虚拟机)使用。
Java 可以做到“一次编译,到处运行”,而 Docker 则可以称为“构建一次,在各平台上运行”(Build once, run anywhere)

从这一点可以毫不夸张地说,Docker 是革命性的,它重新定义了软件开发、测试、交付和部署的流程。
我们交付的东西不再只是代码、配置文件、数据库定义等,而是整个应用程序运行环境:“OS + 各种中间件、类库 + 应用程序代码”

无论你是开发人员、测试人员还是运维人员,随着对 Docker 越来越深入的了解,你都会爱上它。
我们只需要运行几条 docker run 就可以配置好开发环境,通过 Dockerfile 或者 Docker Hub 与他人分享我们的镜像,与其他服务集成,进行开发流程的自动化

  • 开发工程师开发、提交代码到代码服务器(GitHub、BitBucket、Gitlab 等)
  • 代码服务器通过 webhook 调用 CI/CD 服务,如 Codeship、Shippable、CircleCI 或者自建 Jenkins 等
  • CI 服务器下载最新代码,构建 Docker 镜像,并进行测试
  • 自动集成测试通过之后,就可以将之前构建的镜像推送到私有 Registry
  • 使用新版的 Docker 镜像进行部署

试想一下这种开发流程是不是很酷?
除了工作流程的自动化之外,还能消除线上线下环境不一致的问题。
以后“在我的机器上运行得好好的...”这种托词应该再也没人信了吧

Docker 是为 Infrastructure as code 而生的,通过 Dockerfile,镜像创建过程变得自动且可重复,还能进行版本管理。

Docker 是为不可变基础设施(Immutable Infrastructure)而生的,对无状态服务的升级、部署将会更轻便更简单:我们无需再对它们的配置进行修改,只需要销毁这个服务并重建一个就好了。

Docker 也是为云计算而生的,Docker 的出现离不开云计算的兴起,反过来更多的云计算服务商也都开始把 Docker 纳入自己的服务体系之中,比如 Google 发布了 Google Container Engine 服务,一个基于其开源 Docker 编配工具 Kubernetes 的 "Cluster-as-aService"。
容器技术在云计算时代的重要程度由此可见一斑。

在计算世界中,容器拥有一段漫长且传奇的历史。
容器与管理程序虚拟化(hypervisor virtualization, HV)有所不同,管理程序虚拟化通过中间层将一台或多台独立的机器虚拟运行于物理硬件之上,而容器则是直接运行在操作系统内核之上的用户空间。
因此,容器技术可以让多个独立的用户空间运行在同一台宿主机上。

由于“客居”于操作系统,容器只能运行与底层宿主机相同或相似的操作系统,这看起来并不是非常灵活。
例如,可以在 Ubuntu 服务器中运行 RedHat Enterprise Linux,但却无法在 Ubuntu 服务器上运行 Microsoft Windows。

相对于彻底隔离的管理程序虚拟化,容器被认为是不安全的。
而反对这一观点的人则认为,由于虚拟机所虚拟的是一个完整的操作系统,这无疑增大了攻击范围,而且还要考虑管理程序层潜在的暴露风险。

尽管有诸多局限性,容器还是被广泛部署于各种各样的应用场合。
在超大规模的多租户服务部署、轻量级沙盒以及对安全要求不太高的隔离环境中,容器技术非常流行。
最常见的一个例子就是“权限隔离监牢”(chroot jail),它创建一个隔离的目录环境来运行进程。
如果权限隔离监牢中正在运行的进程被入侵者攻破,入侵者便会发现自己“身陷囹圄”,因为权限不足被困在容器创建的目录中,无法对宿主机进行进一步破坏

最新的容器技术引入了 OpenVZ、Solaris Zones 以及 Linux 容器(如 lxc)。
使用这些新技术,容器不再仅仅是一个单纯的运行环境。
在自己的权限范围内,容器更像是是一个完整的宿主机。
对 Docker 来说,它得益于现代 Linux 内核特性,如空间足(control group)、命名空间(namespace)技术,容器和宿主机之间的隔离更加彻底,容器有独立的网络和存储栈,还拥有自己的资源管理能力,使得同一台宿主机中的多个容器可以友好地共存。

容器经常被认为是精益技术,因为容器需要的开销有限。
和传统的虚拟化以及半虚拟化相比,容器运行不需要模拟层和管理层,而是使用操作系统的系统调用接口。
这降低了运行单个所需的开销,也使得宿主机可以运行更多的容器。

尽管有着光辉的历史,容器仍未得到广泛的认可。
一个很重要的原因就是容器技术的复杂性:容器本身就比较复杂,不易安装,管理和自动化也很困难。而 Docker 就是为改变这一切而生。

Docker 简介

Docker 是一个能够把开发的应用程序自动部署到容器的开源引擎。
由 Docker 公司(www.docker.com,前 dotCloud 公司,PaaS 市场中的老牌提供商)的团队编写,基于 Apache 2.0 开源授权协议发行

那么 Docker 有什么特别之处呢?Docker 在虚拟化的容器执行环境中增加了一个应用程序部署引擎。
该引擎的目标就是提供一个轻量、快速的环境,能够运行开发者的程序,并方便高效地将程序从开发者的笔记本部署到测试环境,然后再部署到生产环境。
Docker 机器简洁,它所需的全部环境只是一台仅仅安装了兼容版本的 Linxu 内核和二进制文件最小限的宿主机。
而 Docker 的目标就是要提供以下这些东西

提供一个简单、轻量的建模方式

Docker 上手非常快,用户只需要几分钟,就可以把自己的程序“Docker 化”。
Docker 依赖于“写时复制”模型,使修改应用程序也非常迅速,可以说到了“随心所至,代码即改”的境界

随后,就可以创建容器来运行应用程序了。
大多数 Docker 容器只需不到 1 秒钟即可启动。
由于去除了管理程序的开销,Docker 容器拥有很高的性能,同时同一台宿主机钟也可以运行更多的容器,使用户可以尽可能充分地利用系统资源

指责的逻辑分离

使用 Docker,开发人员只需要关系容器中运行的应用程序,而运维人员只需要关心如何管理容器。
Docker 设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署的生产环境的一致性,从而降低那种“开发时一切都正常,肯定是运维的问题”的风险。

快速、高效的开发生命周期

Docker 的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具备可移植性,易于构建,并易于协作

鼓励使用面向服务的架构

Docker 还鼓励面向服务的架构和微服务架构。
Docker 推荐单个容器只运行一个应用程序或进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或服务都可以表示为一系列内部互联的容器,从而时分布式部署应用程序,扩展或调试应用程序都变得非常简单,同时也提高了程序的内省性

注意:如果你愿意,当然不必拘泥于这种模式,你可以轻松地在一个容器内与运行多个进程的应用程序

为什么要使用 Docker

Docker 容器虚拟化的好处

Docker 项目的发起人、Docker 公司 CTO Solomon Hykes 认为,Docker 在正确的地点、正确的时间顺应了正确的趋势--如何正确地构建应用

在云时代,开发者创建的应用必须要能很方便地在网络上传播,也就是说应用必须脱离底层物理硬件的限制;同时必须是“任何时间任何地点”可获取的。
因此,开发者们需要一种新型的创建分布式应用程序的方式,快速分发和部署,而这正是 Docker 所能够提供的最大优势

举个简单的例子,假设用户试图基于最常见的 LAMP(Linux + Apache + MySQL + PHP)组合来构建网站。
按照传统的做法,首先需要安装 Apache、MySQL 和 PHP 以及它们各自运行所依赖的环境;之后分别对它们进行配置(包括创建合适的用户、配置参数等);
经过大量的操作后,还需要进行功能测试,看是否工作正常;如果不正常,则进行调试追踪,意味着更多的时间代码和不可控的风险。
可以想象,如果应用数目变多,事情会变得更加难以处理。

更为可怕的是,一旦需要服务器迁移(例如从亚马逊云迁移到其他云),往往需要对每个应用都进行重新部署和调试。
这些琐碎而无趣的“体力活”,极大地降低了用户的工作效率。究其根源,是这些应用直接运行在底层操作系统上,无法保证同一份应用在不同的环境中行为一致

而 Docker 提供了一种更为聪明的方式,通过容器来打包应用、解耦应用和运行平台。
这意味着迁移的时候,只需要在新的服务器上启动需要的容器就可以了,无论新旧服务器是否是同一类型的平台。
这无疑将帮助我们节约大量的宝贵时间,并降低部署过程出现问题的风险。

Docker 在开发和运维中的优势

对开发和运维(DevOps)人员来说,最梦寐以求的效果可能就是一次创建或配置,之后可以在任意地方、任意时间让应用正常运行,而 Docker 恰恰是可以实现这一终极目标的“瑞士军刀”。
具体来说,在开发和运维过程中,Docker 具有如下几个方面的优势:

更快速的交付和部署
使用 Docker 开发人员可以使用镜像来快速构建一套标准的开发环境;开发完成之后,测试和运维人员可以直接使用完全相同的环境来部署代码。
只要是开发测试过的代码,就可以确保在生产环境无缝运行。
Docker 可以快速创建和删除容器,实现快速迭代,节约开发、测试、部署的大量时间。
并且,整个过程全程可见,使团队更容易理解应用的创建和工作过程。

更高效的资源利用
运行 Docker 容器不需要额外的虚拟化管理程序(Virtual Machine Manager,VMM,以及 Hypervisor)的支持,Docker 是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低。
与传统虚拟机啊方式相比,Docker 的性能要提高 1-2 个数据量级

更轻松的迁移和扩展
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等,同时支持主流的操作系统发行版本。
这种兼容性让用户可以在不同平台之间轻松地迁移应用。

更简单的更新管理
使用 Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作。
所有修改都以增量的方式被分发和更新,从而实现自动化并且高效的容器管理。

Docker 与虚拟机的比较

作为一种轻量级的虚拟化方式,Docker 在运行应用上跟传统的虚拟机方式相比具有如下显著优势

  • Docker 容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机方式(数分钟)要快得多
  • Docker 容器对系统资源需求很少,一台主机上可以同时运行数千个 Docker 容器(在 IBM 服务器上已经实现了同时运行 10K 量级的容器实例)
  • Docker 通过类似 Git 设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新
  • Docker 通过 Dockerfile 支持灵活的自动化创建和部署机制,以提高工作效率,并标准化流程。

Docker 容器除了运行其中的应用外,基本不消耗额外的系统资源,在保证应用性能的同时,尽量减小系统开销。
传统虚拟机方式运行 N 个不同的应用就要启用 N 个虚拟机(每个虚拟机需要单独分配独占的内存、磁盘等资源),而 Docker 只需要启动 N 个隔离得“很薄的”容器,并将应用放进容器内即可。应用获得的是接近原生的运行性能。

当然,在隔离性方面,传统的虚拟机方式提供的是相对封闭的隔离。但这并不意味着 Docker 不安全。
Docker 利用 Linux 系统上的多种防护技术实现了严格的隔离可靠性,并且可以整合众多安全工具。
从 1.3.0 版本开始,Docker 重点改善了容器的安全控制和镜像的安全机制,极大地提高了 Docker 的安全性。
在已知的大规模应用中,目前尚未出现值得担忧的安全隐患

下表比较了使用 Docker 容器技术与传统虚拟机技术的各种特性,可见容器技术在很多应用场景下都具有巨大的优势

特性 容器 虚拟机
启动速度 秒级 分钟级
性能 接近原生 较弱
内存代价 很小 较多
硬盘使用 一般为 MB 一般为 GB
运行密度 单机支持上千个容器 一般几十个
隔离性 安全隔离 完全隔离
迁移性 优秀 一般

Docker 与虚拟化

虚拟化(virtualization)技术是一个通用的概念,在不同领域有不同的理解。
在计算领域,一般指的是计算虚拟化(computing virtualization),或通常说的服务器虚拟化。维基百科上的定义如下:

“在计算机技术中,虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以用比原本的组态更好的方式来应用这些资源”

可见,虚拟化的核心是对资源的抽象,目标往往是为了在同一个主机上同时运行多个系统或应用,从而提高系统资源的利用率,并且带来降低成本、方便管理和容错容灾等好处。

从大类上分,虚拟技术可分为基于硬件的虚拟化和基于软件的虚拟化。
其中,真正意义上的基于硬件的虚拟化技术不多见。

基于软件的虚拟化从对象所在的层次,又可以分为应用虚拟化和平台虚拟化(通常说的虚拟技术即属于这个范畴)。
前者一般指的是一些模拟设备或诸如 Wine 这样的软件,后者又可以细分为几个子类:

完全虚拟化
虚拟机模拟完整的底层环境和特权指令的执行过程,客户操作系统无须进行修改。
例如 IBM p 和 z 系列的虚拟化、VMware Workstation、VirtualBox、QEMU 等

硬件辅助虚拟化
利用硬件(主要是 CPU)辅助支持(目前 x86 体系结构上可用的硬件辅助虚拟化技术包括 Intel-VT 和 AMD-V)处理敏感指令来实现完全虚拟化的功能,客户操作系统无须修改,例如 VMware Workstatin, Xen, KVM

部分虚拟化
只针对部分硬件资源进行虚拟化,客户操作系统需要进行修改。
现在有些虚拟化技术的早起版本仅支持部分虚拟化

超虚拟化
部分硬件接口以软件的形式提供给客户机操作系统,客户操作系统需要进行修改,例如早期的 Xen

操作系统级虚拟化
内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程。容器相关即在这个范畴

可见 Docker 以及其他容器技术都属于操作系统虚拟化这个范畴,操作系统虚拟化最大的特点就是不需要额外的 supervisor 支持。
Docker 虚拟化方式之所以有众多优势,跟操作系统虚拟化技术自身的设计和实现是分不开的。

下图比较了 Docker 和常见的虚拟机方式的不同之处

Docker和传统的虚拟化方式的区别

传统方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。
Docker 容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级。

Docker 组件

Docker 客户端和服务器

Docker 是一个客户-服务器(C/S)架构的程序。
Docker 客户端只需向 Docker 服务器或守护进程发送请求,服务器或守护进程将完成所有工作并返回结构。
Docker 提供了一个命令行工具 docker 以及一整套 RESTful API。
你可以在同一台宿主机上运行 Docker 守护进程和客户端,也可以从本地的 Docker 客户端连接到运行在另一台宿主机上的远程 Docker 守护进程

下图描绘了 Docker 的架构

Docker架构

Docker 镜像

镜像是构建 Docker 世界的基石。用户基于镜像来运行自己的容器。镜像也是 Docker 生命周期中的“构建”部分。
镜像是基于联合文件系统的一种层式的结构,由一系列指令一步一步构建出来。

例如:

  • 添加一个文件
  • 执行一个命令
  • 打开一个端口

也可以把镜像当作容器的“源代码”。镜像体积很小,非常“便携”,易于分享、存储和更新。

Registry

Docker 用 Registry 来保存用户构建的镜像。Registry 分为公共和私有两种。
Docker 公司运营的公共 Registry 叫做 Docker Hub。
用户可以在 Docker Hub 注册帐号,分享并保存自己的镜像

Docker Hub 上已经有非常多注册用户构建和分享的镜像。
需要 Nginx Web 服务器的 Docker 镜像,或者 Asterix 开源 PABX 系统的镜像,亦或是 MySQL 数据库的镜像?
这些镜像在 Docker Hub 上都有,而且具有多种版本。

你也可以在 Docker Hub 上保存自己的私有镜像。
例如,包含源代码或专利信息等需要保密的镜像,或者只在团队或组织内部可见的镜像。

你甚至可以架设自己的私有 Registry。
私有 Registry 可以受到防火墙的保护,将镜像保存在防火墙后面,以满足一些组织的特殊需求。

容器

Docker 可以帮你构建和部署容器,你只需要把自己的应用程序或服务打包放进容器即可。
我们刚刚提到,容器是基于镜像启动起来的,容器中可以运行一个多个进程。
我们可以认为,镜像是 Docker 生命周期中的构建或打包阶段,而容器则是启动或执行阶段。

总结起来,Docker 容器就是:

  • 一个镜像格式
  • 一系列标准的操作
  • 一个执行环境

Docker 借鉴了标准集装箱的概念。标准集装箱将货物运往世界各地,Docker 将这个模型运用到自己的设计哲学中,唯一不同的是:集装箱运输货物,而 Docker 运输软件。

docker ps / docker ps -a: 列出在运行的docker容器环境,查看本机已有的容器
docker save 9610cfc68e8d > /home/myubuntu-save-1204.tar
docker load < /home/myubuntu-save-1204.tar: 加载镜像 docker pull learn/tutorial: 使用 pull 下载镜像

如何删除image(镜像):
http://yaxin-cn.github.io/Docker/how-to-delete-a-docker-image.html

Docker 镜像使用
https://www.runoob.com/docker/docker-image-usage.html

镜像打包
https://www.iteye.com/blog/wiselyman-2153202

Docker run 命令参数及使用:
https://www.jianshu.com/p/ea4a00c6c21c

安装

centos

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
sudo yum remove -y docker \
           docker-common \
           docker-selinux \
           docker-engine

curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun

sudo systemctl enable docker
sudo systemctl start docker

ubuntu 安装

https://docs.docker.com/engine/install/ubuntu/

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
apt-get remove docker docker-engine docker.io containerd runc
apt-get update
apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

apt-get update -y
apt-get install docker-ce docker-ce-cli containerd.io -y

apt-cache madison docker-ce

apt-get install docker-ce docker-ce-cli containerd.io -y

docker run hello-world

https://linux.cn/article-16531-1.html

1
sudo apt install docker.io docker-compose -y

镜像加速

https://yeasy.gitbook.io/docker_practice/install/mirror

/etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件):

1
2
3
4
5
6
{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ]
}

注意,一定要保证该文件符合 json 规范,否则 Docker 将不能启动。
之后重新启动服务。

1
2
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

阿里云加速

https://help.aliyun.com/document_detail/60750.html

可视化

mac 下载了客户端之后,可以点击 docker 的图标,然后点击 Dashboard 就可以了看到镜像和容器了

https://mp.weixin.qq.com/s/3ysrUHRVOeiFSjTJcN6E5g

https://github.com/portainer/portainer

自建镜像仓库

https://github.com/goharbor/harbor