歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Docker詳解

Docker詳解

日期:2017/2/27 15:56:55   编辑:Linux教程
簡介
  • 針對可移植的應用的簡單輕量虛擬環境
  • 基於容器提供沙箱,基於cgroup和namespace做到資源的隔離
  • 快速,啟動容器就是啟動進程
  • 輕量,只需要應用運行的依賴
  • 容器即目錄,故傳輸方便
  • 使用aufs或者devicemapper等技術作為存儲引擎,節省空間
  • 倉庫機制,可相互分享,搜索等

概念
  • cgroups
  • lxc
  • aufs
  • devicemapper
  • namespace

概念-cgroups
cgroups全稱control groups,是linux內核提供的一種限制、記錄和隔離進程組所使用物理資源的一種機制。在2.6.24之後的內核中都已經支持cgroups。詳細的介紹請參考cgroups詳解和cgroups官方文檔。

應用場景: 進程隔離 資源統計 * 進程控制
基本概念: task,被cgoups管理的進程 control group,分配資源的基本單位 hierarchy,層級,也就是限制的繼承關系 subsystem,資源控制器

概念-lxc
lxc全稱是linux container,是基於cgroups和chroot等內核特性的一組工具,用於構建虛擬環境。通過一系列的命令行工具可以創建,修改,刪除虛擬環境。具體用法可參考ubuntu官方文檔和LXC官方文檔。

概念-aufs
aufs全稱是advance(another) union file system,是一種聯合文件系統。這種文件系統最重要的一個特性就是有一個層的概念和復制時拷貝,可以做到當文件系統改變時只影響其中一層,其他層保持不變。舉個例子,整個文件系統就像由一層一層的玻璃組成的,你從上往下看能看到所有的圖案(如果上下層的玻璃完全重合則只能看見上層的玻璃對應的圖案),而當你需要新增或者修改圖案時就只能在最上層的玻璃上操作。具體的一些操作例子可參考geekstuff的aufs演示和aufs官方文檔

概念-devicemapper
官方說,使用了LVM的鏡像功能的高級變種作為一種存儲引擎。簡單來說,devicemapper是內核的邏輯卷管理框架,它可以做到將多個設備的塊映射到一個邏輯卷上,然後對外提供IO服務。具體可參考Linux內核中的Device Mapper機制

概念-namespace
內核級別的資源隔離方案,PID和Network等不再是全局性的而是屬於特定的Namespace,每個Namespace對其他的Namespace都是透明的。具體可參考Linux Namespaces機制

基礎
  • 安裝
  • 拉取
  • 運行
  • 提交
  • 再運行

基礎-安裝
依賴
內核需要3.8以上, ubuntu-12.04以上,centos-6.5最新內核
ubuntu
curl -s https://get.docker.io/ubuntu/ | sudo sh

centos
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum install -y docker-io

基礎-拉取
命令
docker pull ubuntu

解釋
Docker官方的index上拉取倉庫

注意 其實拉取的過程就是復制的過程

基礎-運行
命令
docker run -i -t ubuntu /bin/bash

解釋
從ubuntu這個鏡像運行一個container,container裡的進程為bash

基礎-提交
命令
docker  commit id user/name
docker push user/name

解釋
在容器裡執行一些改動之後,將這些改動提交到倉庫裡去,也就是添加了一個新的鏡像;然後把這個新的鏡像推送到Docker的index上去。

基礎-再運行
命令
docker pull user/name
docker run -i -t user/name /bin/bash

解釋
再次從index上拉取鏡像,然後從新的鏡像啟動container。

高級
  • Dockerfile
  • Link
  • 端口映射

高級-Dockerfile-簡介
簡介
描述了一個image應該是什麼樣的,然後通過 docker build 來生成image

高級-Dockerfile-指令參考
指令參考
  • FROM 當前鏡像基於哪個鏡像生成
  • AUTHOR 鏡像作者
  • ADD 向鏡像裡添加文件
  • RUN 運行一些安裝和命令或者腳本
  • EXPOSE 指定鏈接時暴漏給其他容器的端口
  • CMD 啟動容器時默認執行的命令
  • ENTRYPOINT 啟動容器時運行的程序

CMD和ENTRYPOINT的區別
就是命令和選項的區別,ENTRYPOINT是命令,CMD是選項

高級-Dockerfile-演示
演示
命令
docker build -t image_name /path/to/dockerfile_dir

解釋
通過指定Dockerfile所在路徑,docker自動構建image

高級-link-簡介
簡介
一種讓Container之間相互通信更友好的方式,被鏈接的container的信息直接在其他container的環境變量裡得以體現。

高級-link-演示
演示
命令
docker run -d --name redis redis
docker run -d --name consumer --link redis:redis ubuntu /bin/bash

解釋
首先啟動一個redis的container,然後將該container鏈接到consumer這個container上,然後我們可以從這個容器裡通過環境變量訪問到redis的相關信息。

高級-端口映射-簡介
簡介
一種讓container提供公網服務的技術,底層為iptables的DNAT技術實現。

高級-端口映射-演示
演示
命令
docker run -d --name redis -p 6379 redis

解釋
將物理機的6379端口映射到redis這個container的6379端口上。

擴展
  • 網絡相關
  • 開機啟動

擴展-網絡相關-簡介
簡介
傳統上,Docker的網絡技術其實就是基於網橋和iptables的技術,0.11版本引入host模式的網絡模式,允許container完全共享物理機的網絡,不再需要iptables做映射。

擴展-網絡相關-演示
演示
命令
docker run -d --name redis --net host redis /sbin/ip addr

解釋
直接使用物理機的網絡

擴展-開機啟動
外部
也就是如何開機啟動對應的容器,主要有兩步操作: 1. 關閉Docker的自動啟動特性-r=false 2. 配合upstart或者systemd的配置文件,調用Docker命令來開機啟動

內部
也就是如何在啟動容器時再其內部自動啟動進程。很遺憾,目前Docker容器和systemd還不兼容。目前我用的方案是supervisor來管理容器內的進程。詳見upops項目的Dockerfile
Copyright © Linux教程網 All Rights Reserved