zoukankan      html  css  js  c++  java
  • Docker的基础知识(一)

    Docker的基础知识(一)

    1.什么是Docker?

    Docker是一种更轻量化的方式,使用Docker不需要安装客户OS;

    Docker镜像中只隔离并安装服务器运行所需的程序和库文件,与主机共享OS资源,大大减少了镜像的体积。
    Docker层级图.png

    相对于虚拟机,Docker提供了专门创建并部署镜像的功能和镜像上传和下载(push/pull)的功能。

    2.Docker镜像和容器

    基础镜像概念:它是指仅Linux发行版userland中安装的文件,一般为Linux发行版本的名称;“Docker镜像”通常是指安装基础镜像所需的程序、库、源代码之后创建的一个文件。

    userland:即用户空间;在linux中,用户区是GNU,应用程序驻留在用户区中,而Linux内核(和大多数驱动程序)驻留在内核空间中。
    引用:https://www.linux.org/threads/gnu-userland.11066/

    Docker镜像:只将基础镜像中变化的部分创建为镜像,运行时将基础镜像与可变部分合并运行;
    Docker“层”的概念:Docker不创建整个镜像,只针对变化的部分进行创建,然后继续引用父镜像;

    上传和下载镜像是会同时上传/下载子镜像和父镜像,之后只传输内容有变化的镜像。

    Docker镜像.png

    Docker容器
    Docker容器是处于运行状态的镜像,使用一个镜像可以创建多个容器;
    镜像可以理解为可执行.exe文件,容器是进程;
    已经运行的容器中,可以将更改的部分创建为镜像。

    Dokcer Engine

    Dokcer Engine是一个C/S架构的应用程序,主要包含:

    • 常驻后台进程Dockerd
    • 一个用来和Dockerd交互的REST API Server
    • 命令行CLI接口,通过REST API进行交互

    Docker 架构

    Docker使用C/S架构,Docker客户端和Docker守护进程通信,Docker守护进程负责构建、运行和分发Docker容器;
    Docker客户端和守护进程可以在同一个系统上运行,也可以将Docker客户端连接到远程Docker守护进程;Docker客户端和守护进程使用REST API通过UNIX套接字或者网络接口进行通信。

    Docker daemon用来监听Docker API的请求和管理Docker对象,比如镜像、容器、网络等。
    Docker Client是与Docker进行交互最主要的方法,比如可以通过docker run来运行一个容器,然后Docker Client会把命令发送给Docker Daemon。
    Docker Registry用来存储Docker镜像的仓库;默认情况下,我们使用docker pull或者docker run命令,就会从docker镜像仓库中去拉取镜像,使用docker push命令,会将我们构建的镜像推送到对应的镜像仓库中。
    Images镜像,只将基础镜像中变化的部分创建为镜像,运行时将基础镜像与可变部分合并运行。
    Containers容器,容器是一个镜像的可运行的实例,使用Docker REST API或者CLI来操作容器;容器的实质是进程,但与直接在宿主机执行的实例进程不同,容器进程属于自己的独立命名空间。容器可以拥有自己的root文件系统、网络配置、进程空间、用户ID。容器内的经常是运行在一个隔离环境里,使用起来,就好像在一个独立于宿主机的系统下操作一样,使得容器封装的应用比直接在宿主机运行更安全。

    Docker核心

    Docker namespace

    Linux内核2.4.19中开始陆续引用namespace概念。目的是将某个特定的全局系统资源通过抽象的方法使得namespace中的进程看起来拥有它们自己的隔离的全局系统资源实例。

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

    Docker CGroups

    Docker Namespace来隔离docker其运行环境,使得容器中的进程看起来就像在一个独立的环境中运行;但仅允许环境隔离不够,因为这些进程是可以不受限制的使用系统资源。
    Docker CGroups的目的是为了防止进程占用太多的资源而影响到其他进程;另外,在系统资源耗尽时,Linux内核会触发OOM这会让一些被杀掉的进程无辜死掉;因此为了让容器中的进程更加可控,使用Docker CGroups来限制容器中的进程允许使用的系统资源。

    Docker UnionFS

    UnionFS可以把文件系统上的多个目录内容联合挂载到同一目录下,而目录的物理位置是分开的。

    bootfs: 包含操作系统boot loader和kernel;用户不会修改这个文件系统,一旦启动成功后,整个Linux内核加载进内存,之后bootfs会被卸载,从而释放内存。

    rootfs: 包含典型的目录结构(/dev,/bin/,/etc,/usr,/lib,/tmp等);Linux系统在启动时,rootfs首先会被挂载为只读,启动完成后被修改为读写模式。

    Dockerfile:

    FROM ubuntu:14.04
    ADD run.sh /
    VOLUME /data
    CMD ["./run.sh"]
    

    联合文件系统对应的层次结构:

    顶上两层,是Docker为Docker容器新建的内容,二这两层属于容器范畴,分别为docker的初始层init layer和可读可写层read-write layes。

    init layer:
    大多是初始化容器环境时,与容器相关的环境信息,如容器主机名、host信息等。

    read-write layes:
    docker容器内的进程只对可读可写层拥有写权限,对其他层的进程而言都是只读的。

    作者:ccku
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如有问题或建议,请多多赐教,非常感谢。
  • 相关阅读:
    [UOJ#391]GEGEGE
    [GOODBYE WUXU][UOJ]
    codeforce 1110F
    [atcoder][abc123D]
    [atcoder][agc001]
    Luogu1070-道路游戏-动态规划
    Luogu 2577[ZJOI2005]午餐
    Luogu 1169 [ZJOI2007]棋盘制作
    Luogu 1273 有线电视网
    Luogu 2279 [HNOI2003]消防局的设立
  • 原文地址:https://www.cnblogs.com/ccku/p/13435456.html
Copyright © 2011-2022 走看看