2

Docker | 基础知识学习笔记

 2 years ago
source link: https://ijayer.github.io/post/tech/devops/docker/20170408-docker-basic-notes/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Docker | 基础知识学习笔记

2017-04-08 1950 words 4 mins read 22 times read

Docker要求64bit系统(x86 or arm)
Docker要求Linux内核:3.10+

Docker简介

Docker:Go 实现,对进程进行封装隔离,操作系统层面的虚拟化技术。
Docker虚拟技术:容器内的应用进程直接运行在宿主的内核, 容器没有自己的内核,也没有虚拟硬件资源。
传统虚拟技术:Hypervisor: 虚拟一套硬件—>运行一个操作系统—>运行应用进程

Dcoker & VM Compare

Docker基本概念

Engine

Docker Engine是Docker的主程序,主要包含Docker Client和Docker Server,可以创建Docker镜像并运行Docker容器。Docker Engine里最主要的命令是 Docker Cli(docker) 和 Docker Daemon(dockerd)

Image

  • Docker镜像(Image),特殊的文件系统, 提供容器运行时所需的程序、库、资源、配置文件等外, 还包括运行时的一些配置文件(匿名卷、环境变量、用户);镜像不包含任何动态数据,其内容构建好后不会发生变化。

  • 分层存储,Docker Image采用分层存储架构,其实体由多层文件系统联合组成。

  • 相关技术介绍:

Container

  • Docker容器:镜像运行的实体(类&类的实例),其实质是进程——运行在自己独立的命名空间Namespace,拥有自己的root文件系统,网络配置,进程空间,用户空间等;该进程运行在一个与宿主机环境隔离的空间内,不受宿主影响。

  • 容器存储层:容器以镜像为基础,在其上创建的一个为容器运行时进行读写而准备的存储层。

  • 容器生命周期:容器消亡,容器存储层也消亡;故容器存储层要求保持无状态化——即在其上不存储任何数据。

  • 数据卷生命周期:独立于容器,不会随容器消亡而消亡;推荐文件写入使用数据卷或绑定宿主机目录,这些位置的读写会跳过容器存储层。

Repository

  • Docker Registry

    Docker Registry:集中存储,分发镜像的服务。 一个Docker Registry可包含多个仓库(Repository),一个Repository可包含多个标签(Tag),每个标签对应一个镜像。

    仓库命名:<用户名>/<软件名>——boyzhe/ubuntu,boyzhe——Docker Registry用户名,ubuntu——软件名

    镜像命名:<仓库名>:<标签>,指定哪个软件哪个版本的镜像,如果Tag未给出则表示latest(ubuntu:14.04 | ubuntu:16.04 | ubuntu:latest)

  • Docker Registry 公开服务

    Docker Hub
    CoreOS Quary.io
    Google Container
    阿里云加速器

  • Docker Registry 私有服务

    Docker Registry
    VMWare Harbor

Docker核心元件

Linux核心

  • Namespace - 隔离不同Container的执行空间
  • Cgroup - 分配硬件资源
  • AUFS(chroot) - 建立不同Container的档案系统
  • SELinux - 确保Container网络安全
  • Netlink - 确保Container间的进程通信
  • Netfilter - 网络防火墙封包过滤
  • AppArmor - 保护Container的网络及执行安全
  • Linux Bridge - 让不同主机上的不同Container通信

Docker核心

  • Docker Client - 调用Docker Daemon(运行在本机或其他客户端)
  • Docker Daemon - Docker守护进程,执行Docker功能(本机)
  • Libcontainer - 和Linux核心通信的library(本机)
  • Docker image - 建立容器的镜像库(本机或云端)

Docker+Linux核心系统架构图

Docker执行

Docker执行过程

  1. 安装了Docker的Linux及硬件
  2. 执行Docker Client, 呼叫Docker Daemon(unix:///var/run/docker.sock)
  3. Docker Daemon响应Client, 通过Libcontainer要求Linu核心建立Container
  4. Linux核心响应请求,启动核心namespace建立独立空间(pid, network, IPC, UTS, mount等);Daemon根据client参义分配CPU,记忆体或磁盘IO等。注:此时Container没有任何东西
  5. Daemon检查本机现有镜像列表,看是否有符合要求的本地镜下载使用过
  6. 如果step-5有,Daemon则直接载入本地镜像到step-4的建空Container,至此Container启动完成
  7. 如果step-5没有,Daemon则到Docker Registry下载Client参数要求的Image
  8. 填入step-7下载的Image到step-4建立的空Container,Container启动完成

从以上流程可知,Docker Container执行的调度方式就是Client的参数;事实上,执行Docker时的参数就是决定Linux核心建立Namespace以及设定网络,存储的方法。

*注*:Docker Client和另一台主机的Daemon连接可以用https取代unix, 但十分危险,要确保安全性后才可以这样做!

Docker执行过程图

See Also

Thanks to the authors 🙂

Author zher

LastMod 2017-04-08

License CC BY-NC-ND 4.0

Docker | 常用命令 Docker | Install

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK