docker笔记-进阶版

一、进阶基础
  1. 虚拟化:其核心是对资源的抽象。目的是为了再同一个主机上同时运行多个系统或者应用,从而提升系统资源的利用率,降低成本。

  2. 虚拟化分为了很多,其中的2个有完全虚拟化和操作系统级虚拟化。

    docker是虚拟化技术中的操作系统级虚拟化,直接复用宿主机的操作系统。即宿主机内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程。
    虚拟机vmware软件则是完全虚拟化,其模拟完整的底层硬件环境和特权指令的执行过程。
    
  3. 核心概念

    镜像:生成容器模本(源代码)。由多个只读层组成。与容器的唯一区别是,容器在这些只读层上面添加了一层可读写的容器层。
    容器:镜像的一个实例;由只读镜像层和可读写容器层组成。表现为一个微型操作系统和一个(组)应用。
    仓库:存放镜像的地方;实际上为Registry仓库注册服务器,仓库只是相对于某个镜像的而言的。即仓库存放mysql镜像,有为很多版本。Registry仓库注册服务器则有很多仓库,比如mysql仓库和redis仓库等。注册索引(index)则是负责维护用户的账号,权限等管理。
    
    层:联合文件系统,是一种轻量级的高性能分层文件系统,每次修改作为一次提交,并层层叠加。多个层就可以组成一个镜像,即联合文件系统是实现docker镜像的技术基础。
    
  4. 新增的一些命令

    # 镜像
    # 镜像详情
    docker inspect mysql:7
    # 镜像分层信息
    docker history tomcat:7
    # 镜像清理,一些临时镜像文件和没有使用的镜像
    docker prune -af
    # 镜像创建,四种commit import builid,load
    docker commit -m 'add a new file' -a 'docker nb' 容器id qsmtomcat:0.1
    # 镜像上传
    docker push qsmtomcat:1.0
    
    # 容器
    # 容器run,等于create和start
    docker run -it -p 9999:8080 --name mytomcat 镜像id
    # 容器导出
    docker export -o qsm.tar ce5
    # 容器导入
    docker import qsm.tar - test/qsmtomcat:1.0
    # 容器信息,inspect详情。top进程。stats统计信息,cup内存,网络等
    docker stats 容器id
    # 容器查看变更 diff 容器内一些数据修改;
    docker diff 容器id
    # 容器,更新配置update,一些运行时资源配置。
    docker update--cpu-quota 100000 容器id/name
    
    # 仓库
    # 可以使用registry镜像搭建本地仓库
    docker run -d -p 5000:5000 registry:2
    
  5. docker的数据管理

    一是使用数据卷

    即容器内的数据直接映射到本地主机环境。有2种方式可以实现

    #  第一种,--mount
    docker run -d -P --name web --mount type=bind,source=/webapp,destination=/opt/webapp training/webapp python app.py
    # 第二种,在run命令的时候直接-v
    docker run -it -p 8888:8080 --name qsmtomcat2 -v /local/tomcat/webapps/ /usr/local/tomcat/webapps tomcat镜像id
    # 第三种,在dockerfile中指定Volume,宿主机的模板可以用docker inspcet 容器id看到。
    

    二是使用数据卷容器

    使用特点的容器维护数据,可以实现各个容器之间的数据共享。

    # 首先创建一个容器
    docker run -it -v /dbdata --name dbdata ubuntu
    # 其他容器使用--volumes-from 来指定容器
    docker run -it --volumes-from dbdata --name db1 ubuntu
    

    具体详细实现和相关问题可以参考Docker之数据卷容器

  6. docker的容器访问

    一是使用端口映射,二是容器互联

    前者在run命令的时候使用-p指定或者-P随机指定。

    后者是创建一个容器之后,在另外一个容器–link 第一个容器名

  7. Dockerfile

    基础的操作系统镜像有busybox debian centos ubuntu等

    需要多加练习

二、实现原理
  1. 基本架构

    C/S组件+仓库

    C端:用户使用的Docker可执行命令就是客户端程序。
    S端:dockerd,接受请求。docker-proxy端口映射。containerd具体处理与容器相关的请求,containerd-shim,为runC容器提供支持,并且作为容器内进程的根进程。
    仓库:存放镜像
    

在这里插入图片描述

  1. 底层实现:namespace、cgroup,UnionFS

    namespace命名空间保证了一套独立的运行环境

    进程命名空间:独立的一套进程管理方法
    IPC命名空间:进程间的交互方式,信号量,消息队列,共享内存
    网络命名空间:一对虚拟接口(虚拟网卡)veth,在docker0网桥上。
    挂载命名空间:文件挂载。
    UTS命名空间:独立的主机名和域名。163.com:这个是域名。
    用户命名空间:一套用户管理方法。
    

    cgroup控制组对共享的系统资源进行控制分配等。避免竞争。

    资源限制
    优先级
    资源审计
    隔离
    控制
    

    UnionFS联合文件系统,是镜像的基础,镜像是由多个层组成。

    UnionFS是一种轻量级的高性能分层文件系统。层是可以继承的。层除了有基础文件,还有一个json文件,将静态的镜像右dockerd变为动态的容器。
    
  2. docker网络

    一共有5种方式

    bridge模式

    bridge模式是docker默认的,也是开发者最常使用的网络模式。在这种模式下,docker为容器创建独立的网络栈,保证容器内的进程使用独立的网络环境,实现容器之间、容器与宿主机之间的网络栈隔离。同时,通过宿主机上的docker0网桥,容器可以与宿主机乃至外界进行网络通信

    host模式

    由于容器和宿主机共享同一个网络命名空间,换言之,容器的IP地址即为宿主机的IP地址。所以容器可以和宿主机一样,使用宿主机的任意网卡,实现和外界的通信

    container模式

    docker中一种较为特别的网络的模式。在这个模式下的容器,会使用其他容器的网络命名空间

    none模式

    在这种模式下,容器有独立的网络栈,但不包含任何网络配置,只具有lo这个loopback网卡用于进程通信

    用户定义模式

    在用户定义网络模式下,开发者可以使用任何docker支持的第三方网络driver来定制容器的网络

  3. docker compose

    我们知道使用Dockerfile模板文件可以让用户很方便的定义一个单独的应用容器,其实在工作中,经常会碰到需要多个容器相互配合来完成的某项任务情况,例如工作中的web服务容器本身,往往会在后端加上数据库容器,甚至会有负责均衡器,比如LNMP服务。
    因此,docker compose可以批量的操作多个应用容器。

    三个要素:services,networks ,volumes

    样例yml文件:

    version: "3.7"
    services:
      redis:
        image: redis:alpine
        ports:
          - "6379"
        networks:
          - frontend
        deploy:
          replicas: 2
          update_config:
            parallelism: 2
            delay: 10s
          restart_policy:
            condition: on-failure
      db:
        image: postgres:9.4
        volumes:
          - db-data:/var/lib/postgresql/data
        networks:
          - backend
        deploy:
          placement:
            constraints: [node.role == manager]
    networks:
      frontend:
      backend:
    volumes:
      db-data:
    

【完】


本笔记为进阶版,更多技术细节如高级网络、LXC等可以参考docker笔记-终极版(待续)。

若查看基础版,请移步指docker基础版笔记






【正在去BAT的路上修行!!!】

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值