Docker入門(一)

一、虛擬化技術分類

虛擬化技術分類:kernel級別、容器級別、庫級別、應用級別

1、內核級別的虛擬化Xen或者Kvm

這種虛擬化技術隔離效果最好,但是性能消耗也高
vm的user進程需要發起system call的時候,需要調用vm.kernel但是真正執行的是host.kernel
使用BT,或者HVM,加速轉換。
內存虛擬化:shadow MMU
CPU虛擬化:tagged TLB

2、容器技術:

lxc:linux container
openvz:
Docker入門(一)
xen或者kvm隔離效果比較好,
容器技術:隔離的是user space

3、庫虛擬化:

wine
cywin

4.應用級別虛擬化:

jvm
...

二、容器基礎概念:

Docker的核心目標:Configure Once, Run Anything

1、容器相關概念

容器規範:容器包括Docker、CoreOS的rkt。由Docker、CoreOS、Google若干公司成立Open Container initiative(OCI)的組織,定義了兩個規範:runtime spec和image format spec保證可移植性和可操作性
容器runtime:容器運行環境,類似於jvm爲java進程提供運行環境一樣。lxc(早起Docker使用)、libcontainer(現在Docker使用)和rkt(CoreOS)是目前主流的runtime
容器管理工具:lxd是lxc對應的管理工具,runc是docker engine的管理工具,rkt cli和rkt的管理工具
容器定義工具:docker imange/docker file/ACI (CoreOS的rtk容器的image格式)
registries:存放image //https://quay.io https://hub.docker.com
容器OS:專門運行容器的os //CoreOS,atomic,ubuntu core

2、容器相關技術

容器編排技術:docker swarm/kubernetes/mesos+marathon
容器管理平臺:Rancher/ContainerShip
基於容器的Paas:Deis/Flynn/Dokku

3、容器支持技術

容器網絡:flanne/weave/openvswtich/ip netns/calico ....
服務發現:etcd,consul,zookeeper
監控:docker ps/top/stats sysdig,weave Scope,cAdvisor/Heapster
數據管理:Rex-Ray
日誌管理:logsput /docker logs
安全性:OpenSCAP

4、CGroup + NameSpace + AUFS

容器虛擬化依賴到的NS:name space
pstree:
PID 1:用戶和內核交互的進程
假如us1中的進程,需要使用root權限和內核交互,它是否能夠看到id號爲1的進程,並且各us又是隔離的?
yum -y install psmisc //安裝該包
內核級別,環境隔離;類似chroot機制
PID NameSpace: kernel 2.6.24虛擬出各種pid,每一個用戶空間都可以虛擬一個pid爲1的進程
PID隔離
Network NameSpace: kernel 2.6.29 實現網絡隔離
網路設備,網絡棧,端口號等網絡資源隔離
User NameSpace:用戶隔離,每一個userspace可有同樣的用戶名的用戶
用戶和yoghurt組資源隔離,kernel 3.8 +
IPC NameSpace:進程間通信 kernel 2.6.79
信號量,消息隊列和共享內存等隔離
UTS NameSpace: kernel 2.6.19
主機名和域名的隔離
Mount NameSpace: us1能看到的fs一定是自己能夠看到的fs,us2掛載的專有設備,fs是us1不能看到的
掛載點隔離(FS)隔離;kernel 2.4.19

爲了對不同namespace訪問
API:clone(),setns(),unshare();

clone:實現線程的系統調用,來實現新線程的。
setns:設定namespace的屬性,假如某個進程到某個NS
unshare:非共享機制,進程脫離一個NS,關聯到另一個NS

查看:
mount //可以查看掛載情況
lssubsys -m //查看各個名稱空間的掛載情況

5、各容器的資源限制:CGroup

一個NS一個佔用整個 userspace 的100%,其他NS就沒資源用了,因此出現了CGroup
CGroup: linux control group:控制組
內核級別:限制,控制與一個進程組羣的資源;
可以限制:內存,cpu等
kernel 2.6.24 收入內核
資源:CPU,內存,IO

CGroup的功能:
Resource limitation:資源限制
Prioritization:優先級控制;哪一個NS更優先獲得CPU和資源
Account:統計和審計,主要爲了計費
Control:掛起和恢復 進程
查看:mount -t cgroup
/sys/fs/cgroup
進程啓用在哪裏,代表只能使用多少資源
倒置的樹狀結構。
每一資源都是一棵樹,cpu是一個,內存是一個,io也是一個,..也可以內存和cpu一棵樹
還有其他很多的資源等。有的是重合的,有的是獨立的。
術語集:
task(任務):cgroups的術語中,task就表示系統的一個進程。
cgroup(控制組):cgroups 中的資源控制都以cgroup爲單位實現。cgroup表示按某種資源控制標準劃分而成的任務組,包含一個或多個子系統。
一個任務可以加入某個cgroup,也可以從某個cgroup遷移到另外一個cgroup。
subsystem(子系統):cgroups中的subsystem就是一個資源調度控制器(Resource Controller)。比如CPU子系統可以控制CPU時間分配,內存子系統可以限制cgroup內存使用量。
hierarchy(層級樹):hierarchy由一系列cgroup以一個樹狀結構排列而成,
每個hierarchy通過綁定對應的subsystem進行資源調度。
hierarchy中的cgroup節點可以包含零或多個子節點,子節點繼承父節點的屬性。
整個系統可以有多個hierarchy。
圖1:
Docker入門(一)
CGroup的子系統(subsystem):
blkio// 塊設備的io資源分配,disk
cpu //設定cpu的限制 ,僅能使用40%
cpuacct //報告cgroup中所使用的cpu資源
cpuset //爲cgroup中的任務分配cpu和內存資源,
分配你使用哪一個cpu 和memory,分配可以分配整個
memory //設定內存的使用限制
限制內存使用的空間,例如分配的是1個核心,但是僅運行使用40%
devices //控制cgroup中的任務對設備的訪問;
freezer //掛起和回覆cgroup中的任務;
net_cls(classid),使用等級級別標識符來標記網絡數據包,以實現基於tc完成對不同的cgroup中產生的流量的控制;
perf_event:使用後使cgroup中的任務可以進行統一的性能測試
hugetlb;大的tlb,大內存頁,hugetlb讓大內存頁提高命中率,對HugeTLB系統進行限制;

6、AUFS: union FS

Union FS:它支持對文件系統的修改作爲一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統下
Union 文件系統是 Docker 鏡像的基礎。鏡像可以通過分層來進行繼承,基於基礎鏡像(沒有父鏡像)
另外,不同 Docker 容器就可以共享一些基礎的文件系統層,同時再加上自己獨有的改動層,大大提高了存儲的效率

UnionFS:把不同的物理位置的目錄,合併到同一個目錄中
假如有兩個文件或者目錄名一樣?
疊加:先後順序,最前面的纔是可寫的
AUFS:Another UnionFS 、Alternative UFS、Advanced UFS
但是AUFS不是內核的版本,但是ubuntu是沒有的,
Docker 依賴於AUFS,用於提高性能

Docker目前支持的 Union 文件系統種類包括 AUFS, btrfs, vfs 和 DeviceMapper

原因:
之前複製bin,sbin等程序到一個目錄中,chroot後可以執行
ns1和ns2一個需要ls,一個需要cat命令,但是ls和cat命令有重複使用的庫,可以把該庫做成一個聯合庫(只讀)
可以把公共部分做成一個目錄,ns1只放ls獨有的,ns2只放cat獨有的,用ls或者cat獨有的聯合底層公共的庫即可
目的:減少disk佔用

centos 不支持AUFS但是支持UNIONFS //UNIONFS沒有AUFS強悍
還有另外一種方案:Device mapper

7、Device Mapper:

多系統機制
md:multi disks
http://www.tldp.org/HOWTO/Multi-Disk-HOWTO-1.html
dm:device mapper
Kernel 2.6 引入的最重要的技術之一,用於在內核中支持邏輯卷管理的通用設備的映射機制;
從邏輯設備到物理設備的映射框架機制,在該機制下,用戶可以很方便的根據自己的需要制定實現存儲資源的管理策略,
當前比較流行的 Linux 下的邏輯卷管理器如
LVM2(Linux Volume Manager 2 version)
EVMS(Enterprise Volume Management System)
dmraid(Device Mapper Raid Tool)等都是基於該機制實現?。
它包含三個重要的對象概念,mapped device、映射表、target device
mapped device:可以理解成爲內核向外提供的邏輯設備,它通過映射表描述的映射關係和 target device 建立映射

        target device:邏輯設備映射到的一個物理設備
    https://www.ibm.com/developerworks/cn/linux/l-devmapper/

爲底層塊設備提供抽象設備,

Mapped Device:映射的設備
Mapping table:虛擬設備到物理設備的映射
Target Device:被映射的設備

lVM就依賴於device mapper機制。但是不建議device mapper在docker技術中使用,因爲有諸多不穩定性。

8、Docker的層級概念

Linux內核是第0層-->Docker鏡像,是一個只讀的鏡像,位於第1層,它不能被修改或不能保存狀態。
一個Docker鏡像可以構建於另一個Docker鏡像之上,這種層疊關係可以是多層的。
第1層的鏡像層我們稱之爲基礎鏡像(Base Image),其他層的鏡像(除了最頂層)我們稱之爲父層鏡像(Parent Image)。
這些鏡像繼承了他們的父層鏡像的所有屬性和設置,並在Dockerfile中添加了自己的配置。

Docker鏡像通過鏡像ID進行識別。鏡像ID是一個64字符的十六進制的字符串。
但是當我們運行鏡像時,通常我們不會使用鏡像ID來引用鏡像,而是使用鏡像名來引用。
要列出本地所有有效的鏡像,可以使用命令

可以用同一個鏡像啓動多個Docker容器,這些容器啓動後都是活動的,彼此還是相互隔離的。對其中一個容器所做的變更只會侷限於那個容器本身。
附件1:進程間通信常用的方式:
C方法包括管道(PIPE)、消息排隊、旗語、共用內存以及套接字(Socket)
圖layer:
Docker入門(一)

三、Docker入門:

假如 運行了三個Nginx容器
第一個cn(conainer) 使用80port,第二個cn也是用80 port,但是內核之有一個80端口
方法:映射,
kernel: 8080 -> cn2.80
kernle: 888 -> cn1.80

==============================
啓動docker容器,需要加載images,server從dockerHUB上下載images
把所依賴到的多個images,疊加爲一個UnionFS,然後在該容器中運行
可以從公共dockerhub下載,也可以自制
可以共享讓別人訪問。
可以創建私有hub

1、Docker架構

圖3:
Docker入門(一)

docker client:docker的client工具,用戶使用docker的接口,docker client與docker daemon通信。並將結果返回給client
docker daemon:運行在宿主機,Docker的守護進程,用戶可通過docker client與其交互;
image :只讀的,基於aufs或者UnionFS疊加在一起,用來創建container
一個鏡像可以運行多個container;鏡像文件可以通過Dockerfile創建,也可以從docker hub/registry 下載
repository
公共倉庫 //提供有base image Docuer hub/registry
私有倉庫 //docker repository
docker container:docker的運行實例,容器是一個隔離環境
docker link:各docker之間的通信,openvswtich,netns構建,
docker volume:容器中的數據的持久化
graph:維護和下載鏡像信息,以及它們之間的關係
graph-driver:用於實現和graphdb交互的接口
docker-daemon:藉助於graphDB來及其所維護的所有容器,以及他們之間的連接關係
例如運行多個容器的話,LAMP,要運行3個容器,三個容器要連接起來,這叫做鏈接機制。一個container可能建立n個鏈接關係
graphDB:各容器之間的鏈接關係
graph:維護已經下載的各鏡像的關係

2、Image & Container

Image: 一個只讀的鏡像模板。可以自己創建一個鏡像也可以從網站上下載鏡像供自己使用。鏡像包含了一個RFS.一個鏡像可以創建很多容器。
Container:由docker client通過鏡像創建的實例,用戶在容器中運行應用,一旦創建後就可以看做是一個簡單的RFS,每個應用運行在隔離的容器中,享用獨自的權限,用戶,網絡。確保安全與互相干擾
兩者在創建後,都是一堆layer的統一視角,唯一的卻別是鏡像最上面那一層是隻讀的,不可以修改,但是容器最上面一層是rw的,提供給用戶操作
repository:倉庫,最大的是docker hub,類似於google 的aosp,當然也可以本地搭,比如mig事業羣就有自己的repo。
鏡像:包含了啓動docker容器所需要的文件系統層級結構,及其內容
一個應用程序運行所需的:程序文件、庫文件、配置文件、等
基於UnionFS採用分層的結構實現;
rootfs:用戶空間,完整而獨立的根FS,
bootfs:最底層,引導啓動一個容器必須的FS和OS的kernel,主要是用於區分不同container

3、安裝

安裝Docker:
https://mirrors.aliyun.com/docker-engine/yum/repo/main/centos/7/
yum install docker-engine
[root@node1 ~]# rpm -ql docker-engine |egrep -v "share"
/etc/udev/rules.d/80-docker.rules
/usr/bin/docker
/usr/bin/docker-containerd
/usr/bin/docker-containerd-ctr
/usr/bin/docker-containerd-shim
/usr/bin/docker-init
/usr/bin/docker-proxy
/usr/bin/docker-runc
/usr/bin/dockerd
/usr/lib/systemd/system/docker.service

docker子命令有很多

systemctl start docker.service
docker images //查看鏡像
docker search centos
Name DESCRIPTION STARS STARS OFFICAL AUTOMATED
星 自動生成
darksheer/centos //用戶名:鏡像名
docker pull busybox //拉取官方鏡像 base iamge
tag : lastest //最新版本,默認最新版本

docker pull hub.mt.com:5000/busybox //執行私有倉庫獲取image,必須支持ssl。或者禁止使用tls
docker help run //運行
docker run [OPTIONS] IMAGS [COMMAND] [AEG,...]
//image應該有一個運行起來後,默認運行的命令。
-t --tty=false 分配一個默認的僞終端
-i --interactive=false 打開之後運行在交互式

[root@node1 ~]# docker run -it busybox:latest /bin/sh
docker ps //查看正在運行的 docker
需要藉助於外 volume 保存創建的數據。

docker help commit //基於當前容器的所有修改,創建一個新的images
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

四、Docker命令詳解

1、docker常用命令:

容器生命週期管理 — docker [run|start|stop|restart|kill|rm|pause|unpause]
容器操作運維 — docker [ps|inspect|top|attach|events|logs|wait|export|port]
容器rootfs命令 — docker [commit|cp|diff]
鏡像倉庫 — docker [login|pull|push|search]
本地鏡像管理 — docker [images|rmi|tag|build|history|save|import]
其他命令 — docker [info|version]

docker run -it centos:latest /bin/bash
run命令:
--name //指定一個容器名
-i --interactive=false 交互模式
-t --tty=false //終端
--net=default //橋相關
-d,--detach=false //後臺運行容器
ifconfig //docker0 一個虛擬接口
一半在虛擬機, 一半在宿主機
docker kill c98dac012556 //kill 掉容器,容器ID
docker ps -a //可以查看所有的。關閉後,默認還是會佔用內存,可以在啓動的時候
docker run --rm //退出則,rm自動移除容器
docker rm c98dac012556 //刪除該容器

docker image的創建:
1.基於dockerfile
2.基於運行中的容器修改
//僅僅是打包最上面一層,只有最上面一層是可寫的。
注:docker help $OPTIONS //查看幫助信息

2、repo/image相關概念

registry:保存docker鏡像及docker鏡像層次結構和元數據,用於管理和維護下載的image的組件
包含了n個倉庫,每個倉庫包含了n個image
repository:鏡像庫,可以認爲是registry的一個組件
一個resitry可以有多個倉庫(repository),
例如: centos系列的,ubuntu的,aix的,等...
或者:tom的,jerry的,
由具有某個功能的鏡像的所有相關版本構成的集合;
index:管理用戶的賬號、訪問權限、鏡像及鏡像標籤相關的
docker search centos//就是根據index進行查找的
graph:本地端的,從registry中下載的各docker鏡像需要保存在本地,此功能由graph完成
/var/lib/docker/graph ,目錄中保存下載的docker 鏡像的相關數據。

與鏡像相關的命令:images,search,pull,push,login,logout
創建鏡像:commit,build
刪除本地鏡像:rmi
[root@node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos newuser 60c8bd28f7e1 About an hour ago 281MB
busybox latest c75bebcdd211 7 days ago 1.11MB
centos latest 8140d0c64310 11 days ago 193MB
//newuser和latest都屬於 centos鏡像庫[倉庫],
latest和newuser是image 名字,centos和busybox是兩個倉庫

五、Docker安裝和實驗

老版本的叫做docker-engine,新版本的叫做docker-ce

1、上安裝 (epel源)

CentOS7上安裝
yum install docker -y
CentOS6安裝
yum install docker-io -y

2、簡單實驗

實驗1:關閉後刪除容器
[root@node1 ~]# docker run -it centos:latest /bin/bash
在home中 useradd centos
[root@node1 ~]# docker commit faecb4def9d5 centos:newuser

[root@node1 ~]# docker images
有 newuser
[root@node1 ~]# docker kill faecb4def9d5
[root@node1 ~]# docker rm faecb4def9d5
[root@node1 ~]# docker ps -a
沒有之前的容器了
[root@node1 ~]# docker run -it --rm centos:newuser /bin/bash
rm用於關閉後,就刪除容器
[root@3f20a3c7f5df /]# id centos
uid=1000(centos) gid=1000(centos) groups=1000(centos)
[root@3f20a3c7f5df /]# exit

實驗2:docker後臺運行而不退出
[root@localhost ~]# docker run -dit -h wolf1 --name wolf_mt docker.io/centos /bin/bash
5e5a2ade8c73f715e3bcd0b3a849c33082c186b5cc36914cc00286957dd77351
// -d參數保證後臺運行
[root@localhost ~]# docker exec -it wolf_mt bash
[root@wolf1 /]# exit
exit
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5e5a2ade8c73 docker.io/centos "/bin/bash" 32 seconds ago Up 30 seconds wolf_mt

[root@localhost ~]# docker run -d -h wolf --name test docker.io/centos date //對於date命令執行一次後就結束了,因此就直接退出了
2f108a4b4753567bbecee6bcf0cb8303184fc0e17d3b8c39e11df7021e286316
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2f108a4b4753 docker.io/centos "date" 55 seconds ago Exited (0) 52 seconds ago test

實驗3:docker export(import)和save(load)的區別
docker save -o images.tar postgres:9.6 mongo:3.4 //將鏡像庫中的postgres和mongo打包
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3623943d369f postgres:9.6 "docker-entrypoint..." 3 hours ago Up 3 hours 5432/tcp postgres

docker save -o b.tar postgres //image名字
docker save -o c.tar postgres:9.6 //NAMES字段,這個文件是layer級別的(很長一串數字表示的)
ls -al
-rwxrwxrwx 1 root root 277886464 8月 26 14:40 b.tar
-rwxrwxrwx 1 root root 277886464 8月 26 14:41 c.tar
docker save如果指定的是container,docker save將保存的是容器背後的image。
docker load -i images.tar //加載鏡像 ,如果本地鏡像庫已經存在這兩個鏡像,將會被覆蓋。

用途:打包鏡像然後上傳到其他鏡像

docker export是用來將container的文件系統進行打包 //看到的是和根fs一樣的文件
#docker export -o rtools.tar caf6f35bfbbd /容器id/容器名
進入之後,看到的是容器的fs
docker export -o postgres-export.tar postgres
docker import postgres-export.tar postgres:latest
docker import將container導入後會成爲一個image,而不是恢復爲一個container

docker import可以指定IMAGE[:TAG],說明我們可以爲鏡像指定新名稱。如果本地鏡像庫中已經存在同名的鏡像,則原有鏡像的名稱將會被剝奪,賦給新的鏡像。原有鏡像將成爲孤魂野鬼,只能通過IMAGE ID進行操作。

用途:主要用來製作基礎鏡像比如你從一個ubuntu鏡像啓動一個容器,然後安裝一些軟件和進行一些設置後給別人使用

實驗4:配置國內docker 倉庫
注:使用默認的docker reg去pull鏡像下載較慢
可以配置daocloud、ali等
1)https://dev.aliyun.com/search.html 註冊並登陸
點擊鏡像加速器->複製“您的專屬加速器地址”->修改json文件
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ysupenjm.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

參考博客:
http://wiki.ubuntu.org.cn/OpenVZ
https://blog.csdn.net/xingwangc2014/article/details/50449851
https://www.cnblogs.com/xcloudbiz/articles/5526262.html
https://segmentfault.com/a/1190000009583199 //容器的runtime
https://blog.csdn.net/zjin_hua/article/details/52041757
https://ruby-china.org/topics/22004

https://blog.csdn.net/lwyeluo/article/details/51765309 //源碼安裝
https://www.server110.com/docker/201411/11121.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章