Docker入門(mén)
1. 簡(jiǎn)介
(1)容器(Container) vs 虛擬機(jī)(Virtual Machine)
容器在Linux上本機(jī)運(yùn)行,并與其他容器共享主機(jī)的內(nèi)核。 它運(yùn)行一個(gè)獨(dú)立的進(jìn)程,不占用任何其他可執(zhí)行文件的內(nèi)存,使其輕量級(jí)。
相比之下,虛擬機(jī)(VM)運(yùn)行一個(gè)完整的“客戶(hù)”操作系統(tǒng),通過(guò)虛擬機(jī)管理程序?qū)χ鳈C(jī)資源進(jìn)行虛擬訪問(wèn)。 通常,VM提供的環(huán)境比大多數(shù)應(yīng)用程序需要的資源更多。
容器優(yōu)勢(shì):
- 更高效利用系統(tǒng)資源
- 更快啟動(dòng)時(shí)間
- 一致的運(yùn)行環(huán)境
- 輕松遷移
- 容易維護(hù)拓展
- 持續(xù)交付和部署
(2) 容器(container) 鏡像(image) 倉(cāng)庫(kù)(repository) registry
鏡像是一個(gè)特殊的文件系統(tǒng),除了提供容器運(yùn)行時(shí)所需的程序、庫(kù)、資源、配置等文件外,還包含了一些為運(yùn)行時(shí)準(zhǔn)備的一些配置參數(shù)。鏡像不包含任何動(dòng)態(tài)數(shù)據(jù),其內(nèi)容再構(gòu)建之后不會(huì)改變。
容器是鏡像運(yùn)行時(shí)的實(shí)體,可以被創(chuàng)建、啟動(dòng)、停止、刪除、暫停等。容器的實(shí)質(zhì)是獨(dú)立的進(jìn)程。
倉(cāng)庫(kù)是鏡像的集合,倉(cāng)庫(kù)有多個(gè)Tag,每個(gè)Tag對(duì)應(yīng)一個(gè)鏡像。
Registry是倉(cāng)庫(kù)的集合,是一種集中存儲(chǔ)、分發(fā)鏡像的服務(wù)。公開(kāi)的registry有docker hub等,也可以搭建私有的registry
2. Docker安裝
docker store注冊(cè)登錄,下載dmg安裝
https://store.docker.com/editions/community/docker-ce-desktop-mac
(3) 簡(jiǎn)單配置
啟動(dòng)docker,登錄docker id
添加國(guó)內(nèi)鏡像地址 http://cbe850dc.m.daocloud.io
(3) 驗(yàn)證安裝
docker --version #版本信息
docker version #詳細(xì)版本信息
docker info #統(tǒng)計(jì)信息
docker run hello-world #從默認(rèn)registry的鏡像倉(cāng)庫(kù)下載并運(yùn)行hello-world鏡像
docker image ls #顯示本地已有的鏡像,其中有hello-world鏡像
2. 實(shí)現(xiàn)hello-docker
該部分利用docker容器技術(shù),實(shí)現(xiàn)了一個(gè)基于flask的網(wǎng)頁(yè)
(1) 準(zhǔn)備
ifconfig -a#查看本機(jī)在虛擬網(wǎng)絡(luò)vboxnet1中的IP地址,192.168.99.1
#vboxnet1: inet 192.168.99.1 netmask 0xffffff00 broadcast 192.168.99.255
mkdir hello#創(chuàng)建空目錄hello
cd hello #進(jìn)入目錄
touch Dockerfile #創(chuàng)建Dockerfile, docker鏡像描述文件
touch app.py #創(chuàng)建app.py, flask網(wǎng)頁(yè)服務(wù)端代碼
touch requirements.txt #創(chuàng)建python額外依賴(lài)包列表文件
(2) Dockerfile
# 使用docker官方提供的python運(yùn)行環(huán)境鏡像
FROM python:2.7-slim
# 設(shè)置工作目錄
WORKDIR /app
# 將當(dāng)前目錄下的內(nèi)容拷貝到工作目錄
ADD . /app
# 安裝python鏡像額外的python包
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# 把容器的80端口暴露到外部
EXPOSE 80
# 定義環(huán)境變量
ENV NAME Docker
# 容器啟動(dòng)運(yùn)行的命令
CMD ["python", "app.py"]
(3) app.py
# -*- coding: utf-8 -*-
from flask import Flask
from redis import Redis, RedisError
import os
import socket
# 連接Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)
#創(chuàng)建Flask網(wǎng)頁(yè)
app = Flask(__name__)
#定義訪問(wèn)網(wǎng)頁(yè)根目錄的處理邏輯
@app.route("/")
def hello():
try:
visits = redis.incr("counter")
except RedisError:
visits = "<i>cannot connect to Redis, counter disabled</i>"
html = "<h3>Hello {name}!</h3>" \
"<b>Hostname:</b> {hostname}<br/>" \
"<b>Visits:</b> {visits}"
return html.format(name=os.getenv("NAME", "Docker"), hostname=socket.gethostname(), visits=visits)
if __name__ == "__main__":
#制定Flask網(wǎng)頁(yè)服務(wù)端運(yùn)行在80端口,接受所有ip對(duì)服務(wù)端的80端口的訪問(wèn)
app.run(host='0.0.0.0', port=80)
(4)requirements.txt
Flask
Redis
(5)創(chuàng)建hello鏡像
docker build -t hello . #創(chuàng)建鏡像,-t指定鏡像名稱(chēng)
docker image ls #查看新創(chuàng)建的鏡像
#REPOSITORY TAG IMAGE ID CREATED SIZE
#hello latest d01960578789 41 seconds ago 132MB
#python 2.7-slim 02ca219cf841 2 weeks ago 120MB
(6)運(yùn)行hello
docker run -d -p 4000:80 hello #由hello鏡像創(chuàng)建容器,-d讓容器后臺(tái)運(yùn)行,-p指定宿主機(jī)器與容器間的端口映射
瀏覽器訪問(wèn) http://192.168.99.1:4000
(7)操作docker鏡像和容器
docker --help #查看docker幫助
docker image --help #查看image幫助
docker container --help #查看container幫助
docker image ls #查看本地已有image列表
docker image rm 完整鏡像名稱(chēng)/鏡像id/鏡像id前綴 #刪除鏡像
docker container ls #查看正在運(yùn)行的容器列表
docker container stop 容器名稱(chēng)/容器id #終止運(yùn)行的容器
docker container rm 容器名稱(chēng)/容器id #刪除運(yùn)行的容器
(8)分享鏡像
docker login #用docker hub的賬號(hào)密碼登錄
docker tag hello liangkw16/hello:v1 #給鏡像打標(biāo)簽 標(biāo)簽格式:docker hub用戶(hù)名/倉(cāng)庫(kù)標(biāo)識(shí):版本標(biāo)識(shí)
docker image ls #查看打過(guò)標(biāo)簽的image, 一個(gè)image可以有多個(gè)tag
docker push liangkw16/hello:v1 #向默認(rèn)registry提交鏡像
docker container ls#
#CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
#18eb9e1f1b46 hello "python app.py" 14 minutes ago Exited (0) 10 minutes ago clever_chebyshev
docker container stop 18e#停止容器,18e為容器id前綴
docker container rm 18e#刪除容器,18e為容器id前綴
docker image rm liangkw16/hello:v1 #刪除本地鏡像
docker image rm hello:latest #刪除本地鏡像
docker run -p 4000:80 liangkw16/hello:v1 #從registry獲取鏡像并運(yùn)行
(9)創(chuàng)建私有倉(cāng)庫(kù)
為保證鏡像上傳和下載的速度,搭建一個(gè)本地測(cè)試用的私有倉(cāng)庫(kù),地址為 192.168.99.1:5000, 客戶(hù)端配置insecure-registries,并重啟docker
docker run -d -p 5000:5000 --restart=always --name registry registry:2 #通過(guò)運(yùn)行官方鏡像registry來(lái)創(chuàng)建私有倉(cāng)庫(kù),默認(rèn)倉(cāng)庫(kù)的位置是/var/lib/registry, 可以用 -v 上傳路徑:下載路徑 來(lái)指定鏡像文件上傳和下載路徑
docker image ls#查看本地鏡像
#REPOSITORY TAG IMAGE ID CREATED SIZE
#liangkw16/hello v1 32f1961021f9 18 minutes ago 132MB
#registry 2 b2b03e9146e1 9 days ago 33.3MB
#python 2.7-slim 02ca219cf841 2 weeks ago 120MB
docker tag python:2.7-slim 192.168.99.1:5000/python:2.7-slim #將本地已下載python鏡像重新標(biāo)簽
docker push 192.168.99.1:5000/python:2.7-slim #將python鏡像上傳到本地registry
修改Dockerfile中的From后的python鏡像為本地鏡像
# 使用docker官方提供的python運(yùn)行環(huán)境鏡像
FROM 192.168.99.1:5000/python:2.7-slim
# 設(shè)置工作目錄
WORKDIR /app
# 將當(dāng)前目錄下的內(nèi)容拷貝到工作目錄
ADD . /app
# 安裝python鏡像額外的python包
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# 把容器的80端口暴露到外部
EXPOSE 80
# 定義環(huán)境變量
ENV NAME Docker
# 容器啟動(dòng)運(yùn)行的命令
CMD ["python", "app.py"]
重新build鏡像,并push到本地私有倉(cāng)庫(kù)
docker build -t hello .#重新build鏡像
docker tag hello:latest 192.168.99.1:5000/hello:v1 #重新給鏡像打標(biāo)簽
docker push 192.168.99.1:5000/hello:v1 #將鏡像push到本機(jī)私有倉(cāng)庫(kù)
docker image rm 192.168.99.1:5000/hello:v1 #刪除本地鏡像
docker run -p 4000:80 192.168.99.1:5000/hello:v1 #從本地私有倉(cāng)庫(kù)拉取鏡像并運(yùn)行
3. 負(fù)載均衡實(shí)現(xiàn)
在分布式應(yīng)用程序中,應(yīng)用程序的不同部分稱(chēng)為“服務(wù)”(services)。例如,一個(gè)視頻共享站點(diǎn),它包括存儲(chǔ)應(yīng)用程序數(shù)據(jù)的數(shù)據(jù)庫(kù)服務(wù),處理用戶(hù)上傳內(nèi)容的轉(zhuǎn)碼服務(wù),響應(yīng)用戶(hù)操作的前端服務(wù)等等。
服務(wù)只運(yùn)行一個(gè)鏡像,但指定了鏡像的運(yùn)行的方式——應(yīng)該使用哪些端口,應(yīng)該運(yùn)行多少個(gè)容器副本,以及服務(wù)所需的容量等。 可以動(dòng)態(tài)更改運(yùn)行中服務(wù)的容器數(shù)量,從而為服務(wù)分配更多計(jì)算資源。
(1) 創(chuàng)建docker-compose.yml
version: "3" #版本號(hào)
services: #服務(wù)
web: #服務(wù)名稱(chēng)
image: 192.168.99.1:5000/hello:v1 #指定鏡像
deploy: #服務(wù)部署
replicas: 5 #容器實(shí)例數(shù)量
resources: #資源情況
limits: #資源限制
cpus: "0.1" #cpu占用不能超過(guò)10%
memory: 50M #內(nèi)存占用不能超過(guò)50M
restart_policy: #重啟策略
condition: on-failure #失敗了就重啟
ports: #外部端口和內(nèi)部端口的映射
- "4000:80"
networks: #指定網(wǎng)絡(luò),容器實(shí)例共享80端口
- webnet
networks: #負(fù)載均衡網(wǎng)絡(luò)定義
webnet:
(2) 運(yùn)行負(fù)載均衡應(yīng)用
docker swarm init #初始化swarm集群,只有本機(jī)一個(gè)節(jié)點(diǎn),保證下一句不出錯(cuò)
docker stack deploy -c docker-compose.yml hello-service #通過(guò)docker-compose.yml創(chuàng)建名為hello-servcie的服務(wù),-c指定文yml件
docker service ls #查看服務(wù)列表
#ID NAME MODE REPLICAS IMAGE PORTS
#43fhqq2h0aot hello-service_web replicated 5/5 192.168.99.1:5000/hello:v1 *:4000->80/tcp
docker service ps hello-service_web #查看每一個(gè)容器實(shí)例,加后綴_web
#ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
#q3ovtqbyc9km hello-service_web.1 192.168.99.1:5000/hello:v1 linuxkit-025000000001 Running Running 11 seconds ago
#jjtvp066ugg1 hello-service_web.2 192.168.99.1:5000/hello:v1 linuxkit-025000000001 Running Running 10 seconds ago
#yomq5bxykbth hello-service_web.3 192.168.99.1:5000/hello:v1 linuxkit-025000000001 Running Running 11 seconds ago
#ca59l34iacyq hello-service_web.4 192.168.99.1:5000/hello:v1 linuxkit-025000000001 Running Running 11 seconds ago
#oy0rqrrrsgrf hello-service_web.5 192.168.99.1:5000/hello:v1 linuxkit-025000000001 Running Running 11 seconds ago
docker container ls -q #顯示容器id,也就是網(wǎng)頁(yè)顯示的hostname
瀏覽器訪問(wèn) http://192.168.99.1:4000, 不斷刷新,發(fā)現(xiàn)hostname在不斷變化,說(shuō)明service以某種順序安排不同的容器處理請(qǐng)求,以實(shí)現(xiàn)負(fù)載均衡
(3) 動(dòng)態(tài)修改service
#修改docker-compose.yml中的replicas: 5為replicas: 6
docker stack deploy -c docker-compose.yml hello-service #重新部署一下,動(dòng)態(tài)對(duì)服務(wù)的計(jì)算資源進(jìn)行了修改
docker service ls #查看服務(wù)列表
#ID NAME MODE REPLICAS IMAGE PORTS
#43fhqq2h0aot hello-service_web replicated 6/6 192.168.99.1:5000/hello:v1 *:4000->80/tcp
(4) 關(guān)閉servcie
docker stack rm hello-service #關(guān)閉servcie
docker swarm leave --force #關(guān)閉swarm集群
4. swarm集群
Swarm是一組運(yùn)行Docker并加入群集的計(jì)算機(jī),這些機(jī)器可以是物理機(jī)或虛擬機(jī),被稱(chēng)為節(jié)點(diǎn)。
- swarm manager節(jié)點(diǎn):執(zhí)行docker命令,管理swarm集群
- worker節(jié)點(diǎn):提供計(jì)算資源
Swarm集群運(yùn)行容器的策略有多種,比如:“emptiest node”,“global”等。
(1) 創(chuàng)建虛擬機(jī)
下載并安裝 Virtual Box
https://download.virtualbox.org/virtualbox/5.2.14/VirtualBox-5.2.14-123301-OSX.dmg
docker-machine create --driver virtualbox myvm1#創(chuàng)建虛擬機(jī)
docker-machine create --driver virtualbox myvm2#創(chuàng)建虛擬機(jī)
docker-machine ls#查看已有虛擬機(jī)列表
#NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
#myvm1 - virtualbox Running tcp://192.168.99.100:2376 v18.05.0-ce
#myvm2 - virtualbox Running tcp://192.168.99.101:2376 v18.05.0-ce
(2) 搭建swarm集群
docker-machine ssh myvm1 "docker swarm init --advertise-addr <myvm1 ip>" #myvm1作為swarm manager node,<myvm1 ip>為上一步myvm1的ip
#docker swarm join --token SWMTKN-1-3gux768xxiq33fw6ln1yyfcuf5j6ke5ornvgjxyhzw0f4ptve7-7anykb6sdobckza49q4awwswu 192.168.99.100:2377
docker-machine ssh myvm2 "docker swarm join --token <token> <ip>:2377" #myvm1加入到swarm集群中,<token>為myvm1的token,<ip>為myvm1的ip
docker-machine ssh myvm1 "docker node ls" #查看swarm集群中的節(jié)點(diǎn)
#ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
#abs2u42k4mfi92iwq6akdlqfv * myvm1 Ready Active Leader 18.05.0-ce
#ne2mz38eyriey3alyva8dnxer myvm2 Ready Active 18.05.0-ce
(3) 配置虛擬機(jī)中docker的倉(cāng)庫(kù)地址
docker-machine ssh myvm1 #ssh連接myvm1
#myvm1執(zhí)行如下指令
sudo touch /etc/docker/daemon.json
sudo chmod 777 /etc/docker/daemon.json
sudo echo '{ "insecure-registries": ["192.168.99.1:5000"] }' > /etc/docker/daemon.json
sudo reboot
docker-machine ssh myvm2 #ssh連接myvm1
#myvm2執(zhí)行如下指令
sudo touch /etc/docker/daemon.json
sudo chmod 777 /etc/docker/daemon.json
sudo echo '{ "insecure-registries": ["192.168.99.1:5000"] }' > /etc/docker/daemon.json
sudo reboot
(4) docker命令綁定到manager節(jié)點(diǎn)
docker-machine env myvm1 #查看mvm1環(huán)境變量
eval $(docker-machine env myvm1) #讓本機(jī)shell的命令發(fā)向manager節(jié)點(diǎn)
docker-machine ls #查看swarm集群列表,myvm1是當(dāng)前激活節(jié)點(diǎn)
#NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
#myvm1 * virtualbox Running tcp://192.168.99.100:2376 v18.05.0-ce
#myvm2 - virtualbox Running tcp://192.168.99.101:2376 v18.05.0-ce
(5) 在swarm集群上運(yùn)行應(yīng)用
docker stack deploy --with-registry-auth -c docker-compose.yml hello-service #myvm1執(zhí)行docker命令,運(yùn)行hello-docker-service
docker service ps hello-service_web #查看service運(yùn)行情況,加_web后綴
#ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
#ot2ulsv5spmk hello-service_web.1 192.168.99.1:5000/hello:v1 myvm2 Running Running 3 seconds ago
#wzpd53kz410a hello-service_web.2 192.168.99.1:5000/hello:v1 myvm1 Running Running 3 seconds ago
#tmdhd3rz4vbn hello-service_web.3 192.168.99.1:5000/hello:v1 myvm1 Running Running 3 seconds ago
#t2z63zyswbsk hello-service_web.4 192.168.99.1:5000/hello:v1 myvm2 Running Running 3 seconds ago
#bmabpujg1x1z hello-service_web.5 192.168.99.1:5000/hello:v1 myvm1 Running Running 3 seconds ago
瀏覽器訪問(wèn)一下任意地址,并多次刷新,觀察hostname變化
http://192.168.99.100:4000
http://192.168.99.101:4000
5.棧(Stack)
棧是一組相互關(guān)聯(lián)的服務(wù),它們共享依賴(lài)關(guān)系,并且可以協(xié)調(diào)和組合在一起。 單個(gè)堆棧能夠定義和協(xié)調(diào)整個(gè)應(yīng)用程序的功能,非常復(fù)雜的應(yīng)用程序可能會(huì)使用多個(gè)堆棧。
(1) 向私有庫(kù)中添加redis鏡像
docker pull redis
docker tag redis 192.168.99.1:5000/redis
docker push 192.168.99.1:5000/redis
(2) 一個(gè)docker-compose.yml就定義了一個(gè)棧,services關(guān)鍵字定義的就是一組相關(guān)的服務(wù),這里添加了redis這一服務(wù),來(lái)提供存儲(chǔ)功能,web網(wǎng)頁(yè)要實(shí)現(xiàn)訪問(wèn)計(jì)數(shù),就要依賴(lài)redis,同時(shí)web和redis使用相同的網(wǎng)絡(luò)webnet
version: "3" #版本號(hào)
services: #服務(wù)
web: #服務(wù)名稱(chēng)
image: 192.168.99.1:5000/hello:v1 #指定鏡像
deploy: #服務(wù)部署
replicas: 5 #容器實(shí)例數(shù)量
resources: #資源情況
limits: #資源限制
cpus: "0.1" #cpu占用不能超過(guò)10%
memory: 50M #內(nèi)存占用不能超過(guò)50M
restart_policy: #重啟策略
condition: on-failure #失敗了就重啟
ports: #外部端口和內(nèi)部端口的映射
- "4000:80"
networks: #指定網(wǎng)絡(luò),容器實(shí)例共享80端口
- webnet
redis:
image: redis
ports:
- "6379:6379"
volumes: #將主機(jī)/home/docker/data掛載到容器的/data目錄
- "/home/docker/data:/data"
deploy:
placement: #只在manager節(jié)點(diǎn)上存儲(chǔ)數(shù)據(jù)
constraints: [node.role == manager]
command: redis-server --appendonly yes
networks:
- webnet
networks: #負(fù)載均衡網(wǎng)絡(luò)定義
webnet:
(3) manager節(jié)點(diǎn)創(chuàng)建data目錄
docker-machine ssh myvm1 "mkdir ./data"
(4) 在swarm集群上運(yùn)行Stack應(yīng)用
docker stack deploy -c docker-compose.yml hello-service #myvm1執(zhí)行docker命令,運(yùn)行hello-service
docker service ls #查看服務(wù)列表
#ID NAME MODE REPLICAS IMAGE PORTS
#v1jdk5as6m9y hello-service_redis replicated 1/1 redis:latest *:6379->6379/tcp
#6m9x1e3jp75x hello-service_web replicated 5/5 192.168.99.1:5000/hello:v1 *:4000->80/tcp
瀏覽器訪問(wèn)一下任意地址,并多次刷新,觀察hostname變化,觀察訪問(wèn)次數(shù)的變化
http://192.168.99.100:4000
http://192.168.99.101:4000
(5) 移除應(yīng)用,重啟swarm集群
docker stack rm hello-service#移除服務(wù)
eval $(docker-machine env -u) #恢復(fù)本機(jī)docker環(huán)境
docker-machine ls #查看本機(jī)的虛擬機(jī)
docker-machine stop myvm1 myvm2 #關(guān)閉虛擬機(jī)
docker-machine start myvm1 myvm2 #啟動(dòng)虛擬機(jī)
6. 總結(jié)
(1) Docker引擎
Docker Engine是一個(gè)C/S架構(gòu)的應(yīng)用程序,包含以下主要組件:
- Docker守護(hù)進(jìn)程——監(jiān)聽(tīng)并響應(yīng)docker API請(qǐng)求和docker管理命令
- REST API——提供程序與守護(hù)進(jìn)程進(jìn)行通信的接口
-
命令行接口客戶(hù)端——docker命令
(2) Docker架構(gòu)
Docker使用C/S架構(gòu)。 Docker客戶(hù)端與Docker守護(hù)進(jìn)程通信,后者負(fù)責(zé)構(gòu)建,運(yùn)行和分發(fā)Docker容器。 Docker客戶(hù)端和守護(hù)程序可以在同一系統(tǒng)上運(yùn)行,也可以將Docker客戶(hù)端連接到遠(yuǎn)程Docker守護(hù)程序。 Docker客戶(hù)端和守護(hù)程序使用REST API,通過(guò)UNIX套接字或網(wǎng)絡(luò)接口進(jìn)行通信。
- Docker守護(hù)進(jìn)程
- Docker客戶(hù)端
- Docker注冊(cè)倉(cāng)庫(kù)
- Docker對(duì)象
- 鏡像(image)
- 容器(container)
- 服務(wù)(service)
(3) Docker實(shí)現(xiàn)技術(shù)
Docker是用Go編寫(xiě)的,利用了Linux內(nèi)核的機(jī)制來(lái)實(shí)現(xiàn)了其功能,主要有以下技術(shù):
命名空間(Namespaces)
Docker使用稱(chēng)為命名空間的技術(shù)來(lái)提供稱(chēng)為容器的隔離工作空間。 當(dāng)您運(yùn)行容器時(shí),Docker會(huì)為該容器創(chuàng)建一組名稱(chēng)空間。這些命名空間提供了一層隔離。 容器的每個(gè)方面都在一個(gè)單獨(dú)的命名空間中運(yùn)行,其訪問(wèn)權(quán)限僅限于該命名空間。
控制組(Control groups)
cgroup將應(yīng)用程序限制為特定的一組資源。 控制組允許Docker Engine將可用的硬件資源共享給容器,并可選擇強(qiáng)制執(zhí)行限制和約束。 例如,您可以限制特定容器的可用內(nèi)存。
UnionFS(Union file systems)
UnionFS是通過(guò)創(chuàng)建圖層來(lái)操作的文件系統(tǒng),使它們非常輕量級(jí)和快速。Docker Engine使用UnionFS為容器提供構(gòu)建塊。 Docker Engine可以使用多種UnionFS變體,包括AUFS,btrfs,vfs和DeviceMapper。
容器格式(container format)
Docker Engine將命名空間,控制組和UnionFS組合到一個(gè)稱(chēng)為容器格式的包裝器中。 默認(rèn)的容器格式是libcontainer。 將來(lái),Docker可以通過(guò)與BSD Jails或Solaris Zones等技術(shù)集成來(lái)支持其他容器格式。