Docker入門(mén)

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ì):

  1. 更高效利用系統(tǒng)資源
  2. 更快啟動(dòng)時(shí)間
  3. 一致的運(yùn)行環(huán)境
  4. 輕松遷移
  5. 容易維護(hù)拓展
  6. 持續(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)。

  1. swarm manager節(jié)點(diǎn):執(zhí)行docker命令,管理swarm集群
  2. 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)用程序,包含以下主要組件:

  1. Docker守護(hù)進(jìn)程——監(jiān)聽(tīng)并響應(yīng)docker API請(qǐng)求和docker管理命令
  2. REST API——提供程序與守護(hù)進(jìn)程進(jìn)行通信的接口
  3. 命令行接口客戶(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)行通信。


image.png
  1. Docker守護(hù)進(jìn)程
  2. Docker客戶(hù)端
  3. Docker注冊(cè)倉(cāng)庫(kù)
  4. Docker對(duì)象
    1. 鏡像(image)
    2. 容器(container)
    3. 服務(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)支持其他容器格式。

(4) Docker進(jìn)階內(nèi)容請(qǐng)參考官方文檔

https://docs.docker.com

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評(píng)論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,238評(píng)論 3 428
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 177,823評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,604評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,339評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,713評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評(píng)論 3 445
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,893評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,448評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,201評(píng)論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,397評(píng)論 1 372
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,631評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,033評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,321評(píng)論 1 293
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,128評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,347評(píng)論 2 377

推薦閱讀更多精彩內(nèi)容

  • Docker入門(mén) Docker命令官方示例 [toc] 1. Docker架構(gòu) 1.1 Docker鏡像與Dock...
    CaiGuangyin閱讀 1,846評(píng)論 2 6
  • 1. 構(gòu)建你的Docker環(huán)境(最復(fù)雜的問(wèn)題要用最簡(jiǎn)單的方式來(lái)解決) Docker是一個(gè)對(duì)于開(kāi)發(fā)者和系統(tǒng)管理員用容...
    MarkShen閱讀 724評(píng)論 0 14
  • 1. 簡(jiǎn)介 Docker整個(gè)體系類(lèi)似于手機(jī)系統(tǒng),應(yīng)用與主機(jī)、應(yīng)用之間都是相互隔離,采用沙盒模式運(yùn)行,一鍵式安裝和卸...
    保持微笑_Ivan閱讀 831評(píng)論 0 0
  • 歡迎探討,如有錯(cuò)誤敬請(qǐng)指正 1、什么是快速排序? 通過(guò)一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)...
    和尚code閱讀 526評(píng)論 0 2
  • 剛看完#了不起的挑戰(zhàn)#,從第一期沒(méi)報(bào)什么期待的心情緩存在手機(jī)里,在公交車(chē)上一晃一晃的看完。看了兩期真心喜歡上了這...
    xxy_exe閱讀 399評(píng)論 0 1