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
OSX 10.10.3及以上
2010及之后的Mac (需要CPU 支持EPT)
轻量级的OS X虚拟化解决方案
提供C API用于在用户端虚拟化技术交互
支持版本
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 busyboxdocker volume create --name hellodocker run -it -v hello:/world --name busybox-volume-hello busybox
docker network
系统日志
docker history
docker logs
docker-machine
部署常用系统
部署advisor监控(http://192.168.64.4:8080/containers/)
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
部署私有仓库(http://192.168.64.4:8080/containers/)
docker run -d -p 50001:5000 \ --restart=always \ -v ~/dockermapping/registry:/var/lib/registry \ --name registry registry
部署jinkins(http://mydocker.com:8089/)
docker run -d --restart=always \ -p 8089:8080 \ -u root \ -v ~/dockermapping/jenkins:/var/jenkins_home \ --name jenkins jenkins
设置受信仓库和镜像仓库
/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容器的原理与实践 (下)
本文来自网易实践者社区,经作者陈志良授权发布。
相关文章:
【推荐】 关于扁平化视觉设计趋势的一些小分享
【推荐】 云架构师进阶攻略(1)