1. 程式人生 > >Docker容器的原理與實踐(上)

Docker容器的原理與實踐(上)

系統 rest 引擎 服務器 分類 file creat 產品 maintain

歡迎訪問網易雲社區,了解更多網易技術產品運營經驗。

虛擬化

是一種資源管理技術,將計算機的各種資源予以抽象、轉換後呈現出來, 打破實體結構間的不可切割的障礙,使用戶可以比原本更好的方式來應用這些資源。


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