學習 Docker - 入門



Docker簡介

一種虛擬容器技術。

  • 一種虛擬化分方案;
  • 操作系統級別的虛擬化;
  • 只能運行相同或相似內核的操作系統;
  • 依賴與linux內核特性:Namespace和Cgroups(Control Group)

虛擬機技術和容器技術最大的區別就是對資源的占用。

Docker目標

  • 提供簡單輕量的建模方式
  • 職責的邏輯分離
  • 快速高效的開發生命周期
  • 鼓勵使用面向服務的架構

Docker使用場景

  • 使用Docker容器開發、測試、部署服務
  • 創建隔離的運行環境
  • 搭建測試環境
  • 構建多用戶的平台即服務(PaaS)基礎設施
  • 提供軟件即服務(SaaS)應用程序
  • 高性能、超大規模的宿主機部署

Docker的基本組成

  • Docker Client 客戶端
  • Docker Daemon 守護進程
  • Docker Image 鏡像
  • Docker Container 容器
  • Docker Registry 倉庫

Docker Client 客戶端

  • C/S架構
  • 本地/遠程調用

Docker客戶端向服務器端發出請求,也就是守護進程。守護進程處理完所有工作將結果返回給客戶端。Docker客戶端對服務器端的訪問既可以在本地也可以在遠程。

客戶端訪問守護進程

Docker Image 鏡像

  • 容器的基石
  • 層疊的只讀文件系統

Docker鏡像是容器的基石,保存了啟動容器的條件,容器基於鏡像啟動和運行。 Docker鏡像是一個層疊的只讀文件系統,他的最底端是一個引導文件系統及bootfs。 Docker用戶幾乎永遠都不會和引導文件系統有交互,實際上當一個容器啟動后,bootfs會被移到內存中,引導文件將被卸載。

Docker鏡像的第二層是rootfs(root文件系統),位於引導文件系統之上,可以有多種操作系統。 在傳統的linux系統中root文件系統最先會以只讀的方式加載,當引導和啟動完成后他才會被切換成讀寫模式。 但是在Docker里,root文件系統永遠只能是只讀,並且Docker會用聯合加載系統在rootfs之上加載更多的只讀文件系統。 聯合加載只得是一次加載多個文件系統。但是在外面開來只有一個文件系統。聯合加載會將各層文件系統加載到一起, 這樣最終的文件系統會包含所有的文件及目錄。Docker將這樣的文件系統稱為鏡像。 一個鏡像可以放到另一個鏡像頂部,位於下面的鏡像稱為父鏡像。以此類推,直到鏡像棧的最底部。最底部的鏡像稱為基礎鏡像。 也就是bootfs文件系統。

Docker Container 容器

  • 容器通過鏡像來啟動
  • 啟動和執行階段
  • 寫時復制(copy on write)

learn_docker_img_006

一個容器中可以運行用戶的一個或多個進程。當一個容器啟動時,Docker會在鏡像的最頂層增加一個讀寫文件系統,我們在Docker中運行的程序就是在這個層運行並執行的。第一次啟動Docker時,讀寫層是空的,當文件發生變化后都會應用到這一層。比如修改一個文件,先將該文件從只讀層復制到讀寫層,然后隱藏只讀層,這就是Docker的寫時復制。

當創建一個容器時,Docker會創建一個鏡像棧,在棧的最頂層增加讀寫層,這個讀寫層和下面的鏡像層以及一些配置數據就構成了一個容器。 容器的這個特點及鏡像分層,可以讓我們快速的構建鏡像,並運行包含我們自己的應用程序和服務的容器。

Docker Registry 倉庫

  • 共有
    • Docker Hub
  • 私有

Docker用倉庫來保存用戶構建的鏡像。

learn_docker_img_002

從上圖可以看出,Docker客戶端調用守護進程從而操作Docker的容器,而容器是通過鏡像來創建的,而鏡像又保存在倉庫中。


Docker容器的相關技術

Docker依賴的Linux內核特性

  • Namespaces 命名空間
  • Control groups(cgroups)控制組

Namespaces 命名空間

  • PID(Process ID) 進程隔離
  • NET(Network) 管理網絡接口
  • IPC(Inter Process Communication) 管理跨進程通信的訪問
  • MNT(Mount) 管理掛載點
  • UTS(Unix Timeshring System) 隔離內核和版本標識

編程語言中命名空間實現封裝,即代碼隔離。 操作系統中命名空間實現系統資源的隔離,進程、網絡、文件系統...

各種隔離的資源時如何管理起來的,這就用到了Cgroups。

Control groups(cgroups)控制組

  • 資源限制
  • 優先級設定
  • 資源計量
  • 資源控制

Docker容器的能力

  • 文件系統隔離:每個容器都有自己的root文件系統
  • 進程隔離:每個容器都運行在自己的進程環境中
  • 網絡隔離:容器間的虛擬網絡接口和IP地址都是分開的
  • 資源隔離和分組:使用Cgroups將CPU和內存等資源獨立分配給每個Docker容器

在 Ubuntu 中安裝 Docker

安裝前的檢查

  • 內核版本

      $ uname -a
    
  • 檢查Device Mapper

      $ ls -l /sys/class/misc/device-mapper
    

Ubuntu中安裝Docker的方式

  • 安裝Ubuntu維護的版本

      $ sudo apt-get install -y docker.io
      $ source /etc/bash_completion.d/docker.io
    
  • 安裝Docker維護的版本

    1. 檢查APT對HTTPS的支持,查看/usr/lib/apt/methods/https文件是否存在。如果不存在,運行安裝命令。

        $ apt-get update
        $ apt-get install -y apt-transport-https
      
    2. 添加Docker的APT倉庫

        $ echo deb https://get.docker.com/ubuntu docker main > /etc/apt/sources.list.d/docker.list
      
    3. 添加倉庫的key

        $ apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
      
    4. 安裝

        $ apt-get update
        $ apt-get install -y lxc-docker
      
  • 安裝Docker維護的版本(簡易步驟,使用Docker提供的sh腳本)

      $ sudo apt-get install -y curl
      $ curl -sSL https://get.docker.io/ubuntu/ | sudo sh
    

    啟動docker若出現下面錯誤:

      FATA[0000] Error loading docker apparmor profile: fork/exec /sbin/apparmor_parser: no such file or directory ()
    

    請安裝apparmor軟件即可

      $ sudo apt-get install apparmor
    

使用非root用戶運行Docker

一般安裝完Docker運行時需要加sudo來操作,其實可以增加用戶歸屬的用戶組來實現不用root權限運行Docker。

  1. 添加名字為docker的用戶組

     $ sudo groupadd docker
    
  2. 將當前用戶添加到當前用戶組中

      $ sudo gpasswd -a ${user} dokcer
    
  3. 重新啟動docker服務

      $ sudo service docker restart
    

針對當前用戶不會立馬生效,需要注銷后重新登錄以獲取用戶組權限。


在 Windows 中安裝 Docker

使用虛擬機實現,守護進程在虛擬機中。

learn_docker_img_003


在 OS X 中安裝 Docker

learn_docker_img_004

在OS X 上Docker的運行環境

在OS X上安裝Docker前我們先看一下Docker的運行要求.

  • Linux容器技術
  • 操作系統級別的虛擬化
  • 依賴於linux內核的Namespaces和Cgroups

Boot2Docker

OS X的內核是Unix,而且一般root用戶蘋果是不給用戶的。所以要運行Docker在OS X上和在Windows上一樣,需要借助虛擬機來實現。

  • 輕量級的Linux發行版,為Docker定制
  • Virtualbox VM
  • Docker客戶端
  • 管理工具

安裝前的檢查

  • 系統要求:OS X 10.6 "Snow Leopard"以上版本

安裝步驟

  • 訪問github上的Boot2Docker

      https://github.com/boot2docker/boot2docker
    
  • 下載Boot2Docker-1.7.0.pkg
  • 安裝Boot2Docker-1.7.0.pkg

Boot2Docker的啟動過程

  • 打開命令行窗口
  • 創建 $HOME/.boot2docker/目錄
  • 創建VirtualBox ISO
  • 啟動虛擬機並運行Docker守護進程

Boot2Docker的啟動命令

  • $ mkdir -p ~/.boot2docker
  • $ if [ ! -f ~/.boot2docker/boot2docker.iso ]; then cp /usr/local/share/boot2docker/boot2docker.iso ~/.boot2docker/ ; fi
  • $ /usr/local/bin/boot2docker init
  • $ /usr/local/bin/boot2docker up
  • $ /usr/local/bin/boot2docker shellinit
  • $ docker version

learn_docker_img_005

驗證Boot2Docker及Docker安裝成功

  • 運行命令 $ docker run ubuntu echo hello world 如果打印如下日志,說明安裝成功

      bash-3.2$ docker run ubuntu echo hello world
      Unable to find image 'ubuntu:latest' locally
      latest: Pulling from ubuntu
      428b411c28f0: Pull complete 
      435050075b3f: Pull complete 
      9fd3c8c9af32: Pull complete 
      6d4946999d4f: Already exists 
      ubuntu:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
      Digest: sha256:45e42b43f2ff4850dcf52960ee89c21cda79ec657302d36faaaa07d880215dd9
      Status: Downloaded newer image for ubuntu:latest
      hello world
      bash-3.2$ 

 


參考:

mac安裝docker指南: http://docs.docker.com/installation/mac/#command-line-docker-with-boot2docker

極客學院視頻: http://www.jikexueyuan.com/path/docker/

doker入門指南: http://my.oschina.net/dlpinghailinfeng/blog/384803

 

pdf文件下載地址: http://pan.baidu.com/s/1c1corG8


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM