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)
Docker容器的原理與實踐(上)