zoukankan      html  css  js  c++  java
  • 【Docker(一)】走进Docker的第一步

    学习资源

    学习新的技术,最开始要做的就是找学习资源了;好的资源能够节省我们很多的时间。

    1、《Docker —— 从入门到实践》[GitBook] 一本不错的学习docker的书,在github上更新维护。GitBook上的阅读体验很棒。

    2、docs.docker.com 最好的学习资料就是官方文档了。但是是全英文的,英文差的话,可以安装如Saladict 沙拉查词浏览器翻译插件。

    3、Docker中文社区,https://www.dockerchina.cnhttps://www.docker.org.cn 没事儿可以上去看看一些相关的文章和相关动态。

    4、搬运:学习资源汇总

    5、书籍,可以通过微信读书APP,搜索Docker相关书籍进行阅读;不差钱也可购买纸质版书籍。

    什么是Docker?

    根据官方的定义,Docker是以Docker容器为资源分割和调度的基本单位,封装整个软件运行时环境,为开发者和系统管理员设计的,用于构建、发布和运行分布式应用的平台。它是一个跨平台、可移植并且简单易用的容器解决方案。

    关键词: 容器
    那么Docker是容器吗? 并不是,Docker是一种运行于操作系统上的软件,用于创建、管理和编排容器。
    容器本身并没有价值,有价值的是对容器的编排管理

    Docker的历史介绍

    Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 开放容器联盟(OCI)

    自从开源后,受到广泛的关注和讨论。甚至由于 Docker 项目的火爆,在 2013 年底,dotCloud 公司决定改名为 Docker。随后各大云技术厂商开始了对Docker的支持,并开发了基于容器的全新产品。

    以Docker为代表的容器技术的快速普及促进了围绕容器技术的相关项目日臻丰富和完善,容器本身的功能和易用性也随之增加。(如下图:图片来自《Docker:容器与容器云(第2版)》

    Docker架构与基本概念

    Docker 使用客户端-服务器架构。 Docker 客户端与 Docker 守护进程对话,后者负责构建、运行和分发 Docker 容器的繁重工作。

    Docker 客户端和守护程序可以运行在同一系统上,或者可以将 Docker 客户端连接到远程 Docker 守护程序。 Docker 客户端和守护进程使用 REST API、UNIX 套接字或网络接口进行通信。 另一个 Docker 客户端是 Docker Compose,它允许使用由一组容器组成的应用程序。

    具体Client(客户端)、Containers(容器)、Images(镜像)、Registry(仓库)、Docker daemon(守护进程)的关系图如下:

    Docker Client

    Docker 客户端 (docker) 是许多 Docker 用户与 Docker 交互的主要方式。 当使用诸如 docker run 之类的命令时,客户端会将这些命令发送到 dockerd,后者会执行这些命令。 docker 命令使用 Docker API。 Docker 客户端可以与多个守护进程通信。

    Docker daemon

    Docker 守护进程 (dockerd) 监听 Docker API 请求并管理 Docker 对象,例如图像、容器、网络和卷。 守护进程还可以与其他守护进程通信以管理 Docker 服务。

    Images(镜像)

    官网介绍:

    An image is a read-only template with instructions for creating a Docker container. Often, an image is based on another image, with some additional customization. For example, you may build an image which is based on the ubuntu image, but installs the Apache web server and your application, as well as the configuration details needed to make your application run.

    You might create your own images or you might only use those created by others and published in a registry. To build your own image, you create a Dockerfile with a simple syntax for defining the steps needed to create the image and run it. Each instruction in a Dockerfile creates a layer in the image. When you change the Dockerfile and rebuild the image, only those layers which have changed are rebuilt. This is part of what makes images so lightweight, small, and fast, when compared to other virtualization technologies.

    翻译:

    镜像是一个只读模板,包含创建 Docker 容器的说明。 通常,一个镜像基于另一个镜像,并带有一些额外的自定义。 例如,您可以构建一个基于 ubuntu 镜像的镜像,但安装 Apache Web 服务器和您的应用程序,以及使您的应用程序运行所需的配置详细信息。

    您可以创建自己的映像,也可以仅使用其他人创建并在仓库中发布的镜像。 要构建您自己的镜像,您需要使用简单的语法创建一个 Dockerfile,用于定义创建镜像和运行镜像所需的步骤。 Dockerfile 中的每条指令都会在镜像中创建一个层。 当您更改 Dockerfile 并重建映像时,只会重建那些已更改的层。 与其他虚拟化技术相比,这是使映像如此轻巧、小巧和快速的部分原因。

    简单的说,镜像原理上就相当于一个root文件系统,而且是只读的。在使用上,可以基于一个镜像构建另一个镜像,可以通过Dockerfile去自定义镜像(Dockerfile是什么,后续介绍,理解成一个配置文件);可以其他人创建并在仓库中发布的镜像。(仓库:类比maven)

    Containers(容器)

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

    registries (仓库)

    仓库(Repository)是集中存放镜像的地方,它和我们的Maven仓库是一样的。

    官网介绍:

    A Docker registry stores Docker images. Docker Hub is a public registry that anyone can use, and Docker is configured to look for images on Docker Hub by default. You can even run your own private registry.

    When you use the docker pull or docker run commands, the required images are pulled from your configured registry. When you use the docker push command, your image is pushed to your configured registry.

    翻译:

    Docker 仓库存储 Docker 镜像。 Docker Hub 是一个任何人都可以使用的公共注册中心,Docker 默认配置为在 Docker Hub 上查找镜像。 您甚至可以运行自己的私有仓库。

    当您使用 docker pulldocker run 命令时,所需的图像将从您配置的仓库中提取。 当您使用 docker push 命令时,您的镜像将被推送到您配置的仓库。

    Docker的底层技术介绍

    Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroupnamespace,以及 OverlayFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 版本开始,则进一步演进为使用 runCcontainerd。如下图Docker 在Linux上的架构(图片来自《Docker —— 从入门到实践》

    runc 是一个 Linux 命令行工具,用于根据 OCI容器运行时规范 创建和运行容器。

    containerd 是一个守护程序,它管理容器生命周期,提供了在一个节点上执行容器和管理镜像的最小功能集。

    Docker vs 虚拟机

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

    如下图(图片来自:链接)传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

    再来看个指标对比

    对比项 虚拟机VMware 容器Docker
    启动 分钟级 秒级
    磁盘使用 GB级 MB级
    性能 弱于原生 接近原生
    系统支持量 单机支持几十个 单机支持上千个
    耗费资源 较多 较少
    版本支持 不支持 支持版本升级和回滚

    Docker的应用场景

    • web应用的自动化打包和发布;
    • 自动化测试和持续集成、发布;
    • 在服务型环境中部署和调整数据库或其他的后台应用;
    • 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。

    为什么要用Docker

    • 更高效的利用系统资源
    • 更快速的启动时间
    • 一致的运行环境
    • 持续交付和部署
    • 更轻松的迁移
    • 更轻松的维护和扩展

    反正就是,各种快、各种好、各种牛逼就对了。

    安装

    官网地址:https://docs.docker.com/get-docker/

    《Docker--从入门到实践》中安装指南:https://yeasy.gitbook.io/docker_practice/install

    镜像加速

    国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。国内很多云服务商都提供了国内加速器服务,例如:

    由于镜像服务可能出现宕机,建议同时配置多个镜像。

    具体配置镜像 参考:https://yeasy.gitbook.io/docker_practice/install/mirror

    参考资料

  • 相关阅读:
    (数据科学学习手札48)Scala中的函数式编程
    Java中的集合(十三) 实现Map接口的Hashtable
    Java中的集合(十二) 实现Map接口的WeakHashMap
    Java中的集合(十一) 实现Map接口的TreeMap
    Java集合(十)实现Map接口的HashMap
    Java集合(九)哈希冲突及解决哈希冲突的4种方式
    Java集合(八)哈希表及哈希函数的实现方式
    Java中的集合(七)双列集合顶层接口------Map接口架构
    Java中的集合(六)继承Collection的Set接口
    Java中的集合(五)继承Collection的List接口
  • 原文地址:https://www.cnblogs.com/nm666/p/15249753.html
Copyright © 2011-2022 走看看