zoukankan      html  css  js  c++  java
  • Docker容器的原理与实践(上)

    本文来自网易云社区

    虚拟化

    是一种资源管理技术,将计算机的各种资源予以抽象、转换后呈现出来, 打破实体结构间的不可切割的障碍,使用户可以比原本更好的方式来应用这些资源。

    Hypervisor

    • 一种运行在基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件。
    • Hypervisor可以捕获CPU的指令,为指令访问硬件控制器和外设充当中介。

    两种模型

    • 本地虚拟化
      hypervisor直接运行在硬件之上,在hypervisor上面是虚拟机
      • 特点
        • 需要硬件支持
        • 虚拟机监视器作为主操作系统
        • 运行效率高
    • 主机虚拟化
      hypervisor运行在操作系统之上
      • 特点
        • VMM作为应用程序运行在主操作系统中
        • 运行效率一般比本地虚拟化低

    几种分类

    • 硬件仿真
      将一个OS(Host)的服务转换并显示成另外一个OS(Guest)

      • 优点
        • Guest OS无需修改,不需要等到硬件实际可用时就可对自己的实际代码进行验证
      • 缺点
        • 需要模拟指令,速度非常慢
    • 全虚拟化
      在硬件和Guest OS之间捕获和处理那些对虚拟机敏感的指令,使客户操作系统无须修改就能运行

    + 优点     + Guest OS无需修改,速度和功能都非常不错+ 缺点     + 基于Hosted模式的全虚拟产品性能不是特别优异
    
    • 半虚拟化
      与全虚拟化有些类似,也是利用Hypervisor实现对底层硬件的共享访问,在Hypervisor上面运行的Guest OS已经集成与半虚拟化有关的代码,包含缩短硬件访问过程所需的驱动程序,通过这种方法无须重新编译和捕获特权指令,性能接近物理机

    + 优点     + 与全虚拟化相比,架构更精简,通过修改Guest OS可以最大限度的减少处理开销+ 缺点     + 需要对Guest OS修改
    
    • 硬件辅助虚拟化
      Intel/AMD硬件产商对集成了优化hypervisor的指令集来提高性能(Intel的VT,AMD的AMD-V)
      • 优点
        • 通过引入硬件技术,是虚拟化技术更接近物理机
    • 操作系统级虚拟化
      操作系统提供一组空间彼此隔离,应用被限制在每个用户空间里
    + 优点     + 几乎没有任何开销,因为只是共享OS和主机而没有通过虚拟机+ 缺点     + 缺乏灵活性,不能在任意OS上面实施,用户共享主机和OS需要注意版本
    

    虚拟化与容器差异

    虚拟化的好处

    • 更高的资源利用率
    • 降低管理成本
    • 提高使用灵活性

    Docker的优势

    • 轻量,秒级的快速启动速度
    • 简单、易用、活跃的社区
    • 标准统一的打包、部署、运行方案
    • 镜像支持增量分发,易于部署
    • 性能尤其是内存和IO的开销

    虚拟化产品概览

    Docker容器实战

    Build, Ship, and Run Any App, Anywhere

    安装

    Docker Toolbox

    Toolbox使用Machine和VirtualBox在虚拟机中创建了一个引擎来运行容器

    Docker For MAC

    • Hypervisor Framework
      • 轻量级的OS X虚拟化解决方案
      • 提供C API用于在用户端虚拟化技术交互
      • 支持版本
        • OSX 10.10.3及以上
        • 2010及之后的Mac (需要CPU 支持EPT)
    • bhyve FreeBSD下的虚拟技术
    • xhyve
      • 基于Hypervisor.framework,完全运行在用户态
      • 很小230k,不依赖于其他软件和库
      • 是bhyve的OS X移植版,Mac上玩Linux多了一种选择
    • HyperKit 基于xhyve/bhyve,构建在Hypervisor.framework之上,OSX上运行的轻量级虚拟化工具包,是Docker For MAC的核心组件

    操作演示

    环境信息查看

    • docker info
    • docker version

    生命周期管理

    • docker create
    • docker run
    • docker start
    • docker stop
    • docker restart
    • docker pause
    • docker unpause
    • docker rm
    • docker kill
    • docker exec

    镜像仓库命令

    • docker login
    • docker logout
    • docker pull
    • docker push
    • docker search

    镜像管理

    • docker images
    • docker rmi
    • docker commit
    • docker build
    • docker tag

    运维命令

    • docker attach
    • docker inspect
    • docker port
    • docker rename
    • docker stats
    • docker top

    资源管理

    • docker volume
    docker run -itd -v /volumedata:/volume --name busybox-volume busybox
    docker volume create --name hellodocker run -it  -v hello:/world --name busybox-volume-hello busybox
    
    • docker network

    系统日志

    • docker history
    • docker logs

    docker-machine

    部署常用系统

    部署advisor监控()

    docker run 
    --volume=/:/rootfs:ro 
    --volume=/var/run:/var/run:rw 
    --volume=/sys:/sys:ro 
    --volume=/var/lib/docker/:/var/lib/docker:ro 
    --publish=8080:8080 
    --detach=true 
    --name=cadvisor 
    google/cadvisor:latest
    

    部署私有仓库()

    docker run -d -p 50001:5000  
    --restart=always 
    -v ~/dockermapping/registry:/var/lib/registry 
    --name registry registry
    

    设置受信仓库和镜像仓库

    /etc/default/docker/var/lib/boot2docker/etc/sysconfig/docker
    

    Dockerfile构建

    Dockerfile是对镜像创建过程的描述脚本

    例子1:构建JDK8镜像
    FROM centos:latest
    MAINTAINER CZL
    ADD jdk-8u131-linux-x64.tar.gz /opt
    RUN ln -s /opt/jdk1.8.0_131/ /opt/jdk
    ENV JAVA_HOME /opt/jdk
    ENV PATH $JAVA_HOME/bin;$PATH
    CMD /opt/jdk/bin/java -version
    
    例子2:构建包含consul-template的nginx镜像
    FROM nginx:1.13.1MAINTAINER czl
    RUN apt-get update
    RUN apt-get -qqy install wget unzip vim iputils-ping curl
    RUN wget https://releases.hashicorp.com/consul-template/0.18.3/consul-template_0.18.3_linux_amd64.zipRUN unzip consul-template_0.18.3_linux_amd64.zip
    RUN mv consul-template /usr/local/bin/ADD ./start.sh /usr/local/bin/start.sh
    RUN chmod +x /usr/local/bin/start.sh
    CMD [ "/usr/local/bin/start.sh" ]
    

    Maven插件构建

    <plugin>    <groupId>com.spotify</groupId>    <artifactId>docker-maven-plugin</artifactId>    <version>0.4.13</version>    <executions>        <execution>            <id>build-image</id>            <phase>package</phase>            <goals>                <goal>build</goal>            </goals>        </execution>    </executions>    <configuration>        <imageName>${docker.registry}/${project.artifactId}:${project.version}</imageName>        <dockerDirectory>${project.build.outputDirectory}</dockerDirectory>        <!--<dockerHost>https://192.168.99.100:2376</dockerHost>-->        <!--<dockerCertPath>${basedir}/certs</dockerCertPath>-->        <resources>            <resource>                <directory>${project.build.directory}</directory>                <include>${project.build.finalName}.jar</include>            </resource>        </resources>    </configuration></plugin>
    

    Docker Compose编排

    version: '2'services:  consul-server:    hostname: consul-server    image: consul    mem_limit: 640m    ports:      - "8400:8400"      - "8500:8500"      - "8600:53/udp"  nginx-server:    hostname: nginx-server    image: mydocker.com:50001/nginx-consul-template    ports:      - "81:80"    volumes:      - ~/xuexibao/czllearnworkspace/document/docker-compose/nginx-consul-template/mapping/:/data    command: [sh,"/data/start.sh"]
    networks:  default:    external:      name: eureka-network
    

    网易云容器服务为用户提供了无服务器容器,让企业能够快速部署业务,轻松运维服务。容器服务支持弹性伸缩、垂直扩容、灰度升级、服务发现、服务编排、错误恢复及性能监测等功能。

    本文来自网易云社区,经作者陈志良授权发布。

    原文:Docker容器的原理与实践(上)

    了解 网易云 :

    网易云官网:https://www.163yun.com

    网易云社区:

    新用户大礼包:https://www.163yun.com/gift

    更多网易研发、产品、运营经验分享请访问网易云社区

  • 相关阅读:
    年轻人的第一个 Spring Boot 应用,太爽了!
    面试问我 Java 逃逸分析,瞬间被秒杀了。。
    Spring Boot 配置文件 bootstrap vs application 到底有什么区别?
    坑爹的 Java 可变参数,把我整得够惨。。
    6月来了,Java还是第一!
    Eclipse 最常用的 10 组快捷键,个个牛逼!
    Spring Cloud Eureka 自我保护机制实战分析
    今天是 Java 诞生日,Java 24 岁了!
    厉害了,Dubbo 正式毕业!
    Spring Boot 2.1.5 正式发布,1.5.x 即将结束使命!
  • 原文地址:https://www.cnblogs.com/163yun/p/9436430.html
Copyright © 2011-2022 走看看