docker理論

主機級虛擬化:html

1,基於物理硬件直接虛擬化 hypervisornode

2,基於操做系統的虛擬化軟件 vmware kvm vmworkstation mysql

 

內核的做用:資源的分配和管理linux

Jail  vserver(chroot)nginx

 

6種名稱空間git

Ipc進程間通訊  信號量 消息隊列 共享內容github

uts主機名和域名 namespace隔離web

mount文件數 掛載點redis

進程樹pid : init:沒有父進程的進程 進程編號sql

User用戶和用戶組:隔離 kernel 3.18+加入

Net網絡設備 網絡棧 端口  隔離

 

Namespace: clone(),setns() 實現

 

容器級虛擬化:

Control groups: cgroups控制組 blkio cpu cpuset devices freezer memory perf-event net_cls

Namespace

chroot

 

LXC:LinuX Container

lxc-create  template

 

鏡像文件: 容器要用到的全部組件編排好打包成一個文件,這個文件就是鏡像文件

 

共享文件 分層掛載  

centos鏡像 容器不可修改à nginx 鏡像 容器不可修改 à 容器的可修改存儲

 

dockers管理容器標準: libcontainer  à runc

 

OCI: open container initiative 開放容器標準

1, 運行時標準

2, 鏡像格式標準

 

OCF: open container Format 開放容器格式  runC

 

Dockers官方鏡像源

https://hub.docker.com/

 

docker架構

client -- -----------sock文件----> docker_host -------------àregistry

docker build                 docker daemon

docker pull                containers -<--images   

docker run  

 

docker-ee 企業版 跟隨moby

docker-ce  社區版

 

registry的組成:repository 單個運用的倉庫 倉庫名:運用名+標籤組成

             登陸registry的帳號驗證

             鏡像表單

 

 

鏡像:靜態 相似於程序文件

容器: 動態,有生命週期 相似於進程

 

Docker對象:

Images

Containers

Networks

Volumes

plugins

 

docker的網絡類型

docker network ls

birdge: 就如同橋接的switch/hub, 使用bridge網絡的container會分配一個當前bridge配置的子網IP, 在經過run建立container時經過 --ip 指定

host: 須要使用 --network=host 參數指定. 使用主機網絡, 此時 container 的網絡會附屬在主機上, 二者是互通的. 例如在container中的服務監聽8080端口, 則主機的8080端口就會自動映射到這個端口

none: 須要使用 --network=none 參數指定不分配局域網的IP

 

須要環境

64 bit cpu

Kernerl 3.10+

Kernelnamespacecgrpups

 

Docker client 就是docker命令

 

 

鏡像:  含有啓動容器所須要的文件系統及其內容,

分層構建: 最底層 bootfs 引導的文件系統 bootloader + kernel 容器啓動完成之後會被卸載以節約資源(從內存中移除)

          其次 rootfs 位於bootfs之上,表現爲容器的根文件系統 rootfs由內核掛載爲只讀模式,然後經過」聯合掛載」技術掛載一個額外的」可寫層」

  

聯合掛載技術:

Aufs 高級多層統一文件系統  advanced multi-layed unification filesystem

Overlay 整合到3.18linux內核 疊加文件系統 目前用在 centos7

Btrfs devicemappercentos7) 和vfs均支持聯合掛載技術

 

registry  repository + index

repositoy: 頂層倉庫 + 用戶倉庫 用戶名/倉庫名

index:維護帳戶 鏡像校驗和公共命名空間 等因而用戶認證的檢索接口

 

sponsor registry

mirror registry

vendor registry

private registry

 

docker registry:鏡像由開發人員製做 然後推送到公共或私有registry上保存

雲原生:傳環境變量來配置容器,用來運行在雲環境上

 

base image:docker提供,可下載docker的官方基礎鏡像

dockerfile --> github 項目 ---> docker hub自動建立鏡像並保存在你用戶名的倉庫下

 

有名的鏡像倉庫:

知名鏡像倉 quay.io

官方鏡像倉庫 docker.io  

阿里雲鏡像倉 registry.cn-shenzhen.aliyuncs.com

docker pull registry:port/用戶名/鏡像名:tag

 

commit鏡像製做

docker commit -a 「lwb」 -c 「CMD [‘/bin/httpd’,’-f’,’-h’,’data/html’]」 -p b1 maggedu/httpd:v0.2

              做者   修改啓動參數                   先暫停 基於bi容器 製做後鏡像名

 

1.

docker鏡像倉庫

docker login

docker push docker.io/leiwenbin627/倉庫名:版本

 

2.

阿里鏡像倉庫

docker login --username=859826896@qq.com registry.cn-shenzhen.aliyuncs.com

docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/leiwenbin627/[鏡像版本號]

docker push registry.cn-shenzhen.aliyuncs.com/leiwenbin627/[鏡像版本號]     

 

ovs:OpenVSwitch 開源虛擬網關

SDNsoftware define network 軟件定義網絡 軟件驅動網絡

橋接:物理網卡當交換機使用

overlay network(k8s)

 

docker 網絡: 

bridge: nat橋接網絡 經過軟交換docker0---> 容器 veth虛擬網卡  關聯關係用brctl showip link show看網卡鏈接對      yum install bridge-utils  

docker0相似於僅主機橋 容器默認這種網絡  用docker network inspect bridge查看

iptables -t nat -vnL  docker0地址假裝 masquerade

docker inspect 容器名 查看詳細信息

 

容器間共享網絡空間:容器使用物理機的網絡名稱空間 兩個容器共用一個網絡名稱空間 主機名稱空間和IPC進程間通訊空間,  用戶空間 mount掛載文件空間 pid進程樹空間獨立 即聯盟式容器

 

none:容器本身的lo網卡127.0.0.1  non e意味着不給容器適配網絡 容器用於後臺處理任務,掛載存儲卷,處理存儲卷裏面的數據,不與外界通訊,就用none網絡

 

open container:直接使用物理機的網絡名稱空間,直接使用物理網口 即host網絡

 

查詢網絡名稱空間:ip help

                  ip netns help

 

添加網絡名稱空間:ip netns add r1

                  ip netns add r2

                  ip netns add r3

 

查詢網絡名稱空間:ip netns list

在網絡名稱空間中執行命令:ip netns exec r1 ifconfig -a

 

給網絡名稱空間建立網卡對

ip link help

ip link add name veth1.1 type veth peer name veth1.2

               網卡一     類型       網卡2

 

把網卡移到網絡名稱空間中

ip link set dev veth1.2 netns r1

            網卡    網絡名稱空間      

一個設備只能屬於一個網絡名稱空間

ip netns exec r1 ifconfig -a 在網絡名稱空間r1中執行命令 ifconfig -a

 

更名

ip netns exec r1 ip link set dev veth1.2 name eth0 

ip netns exec r1 ifconfig -a

 

測試

ifconfig veth1.1 10.1.0.1/24 up 激活

ip netns exec r1 ifconfig eth0 10.1.0.2/24 up

ip netns exec r1 ifconfig

 

docker help

docker run --name t2 --network bridge -it busybox:latest  busybox默認執行命令 /bin/bash

                   指定網絡

docker run --name t3 --network none -it busybox:latest

主機名是容器ID

docker run --name t5 --network bridge --rm --dns 114.114.114.114  -it busybox:latest

                                    指定dns

docker run --name t5 --network bridge --rm --dns 114.114.114.114  -it  --add-host www.baidu.com:192.168.81.25  busybox:latest

                                                                    注入/etc/hosts文件

docker kill t5 容器t5中止運行

docker start t5 容器t5開始運行

docker run --name web --rm -p 192.168.81.30::80 nginx

                           綁定宿主機IP映射

docker port web

docker run --name web --rm -p 192.168.81.30:90:80 nginx

                          綁定宿主機IP和固定映射端口

 

聯盟式容器:共享同一個網絡空間

docker run --name b1 -it --rm busybox

docker run --name b2 --network container:b1 -it --rm busybox  ifconfig查看

                   共享容器b1的網絡名稱空間 即共用容器b1的網絡

 

docker run --name b2 --network host  -it --rm busybox ifconfig查看

docker run --name b1 --network host  -it --rm busybox

                         共享宿主機的網絡名稱空間 即共用物理機的網絡

/ # echo "ffffffffffffff" > /tmp/index.html

/ # httpd -f -h /tmp  

 

 

修改docker0網段

vim /etc/docker/daemon.json

{

  "registry-mirrors": ["https://lvb4p7mn.mirror.aliyuncs.com"],

   "bip": "10.0.0.1/16"  指定dockerIP和網段

}

 

docker守護進程的c/s,其默認監聽unix socket格式的地址,/var/run/docker.sock,即客戶端經過 sock控制docker-daemon

{

  "registry-mirrors": ["https://lvb4p7mn.mirror.aliyuncs.com"],

   "bip": "10.0.0.1/16",

   "hosts": ["tcp://0.0.0.0:2375","unix:///var/run/docker.sock"]  容許外部經過本機2375端口在經過本機的 sock套接字連本機的docker-daemon

}

去另外一臺測試

docker -H 192.168.81.30:2375 ps -a (命令去除docker開頭)

      指定控制的主機  端口 運行的命令

 

 

docker網橋的建立 也即docker網絡的建立

docker network create --help

docker network create -d bridge --subnet "172.26.0.0/16" --gateway "172.26.0.1" mybr0

                  docker網絡類型 子網          網橋的默認網關  網橋名/網絡名

docker network ls 查看

docker run --name t6 -it --network mybr0 busybox

                     使用mybr0網絡

 

 

存儲:

有狀態運用:當前此次鏈接的處理必定與此前的處理有關聯關係 例如mysql redis tomcat

無狀態運用:先後處理沒有關聯關係 例如nginx反向代理

任何有狀態的運用都要持久存儲數據

若是存儲在容器內:刪除容器,數據所有丟失,存儲在聯合文件系統中,不易於宿主機訪問,容器間數據不共享。

存儲卷:是容器上一個或多個目錄,此類目錄可繞過聯合文件系統與宿主機上的某目錄綁定

 

有兩種存儲卷:

1,綁定掛載卷 容器目錄和宿主機目錄都指明

docker run -it --name b5  --rm -v /opt:/data  busybox

                          宿主機路徑:容器路徑

2,docker管理的卷 用於存儲臨時文件 容器內指定目錄路徑,docker在宿主機找一個或建立一個目錄掛載

docker run -it --name b3 -v /data busybox

 

查看json格式數據

docker inspect b5

docker inspect -f {{.Mounts}} b5 查看Mounts -f 過濾

docker inspect -f {{.NetworkSettings.Networks.bridge}} b5

 

NMT: nginx + mariadb + tomcat

docker run --name infracon -it -v /data/infracon/volume:/data/web/html busybox  做爲基礎支撐容器

docker run --name nginx --network container:infracon --volumes-from infracon -it busybox

                              使用infracon容器的網絡  複製infracon容器的存儲

 

 

自制鏡像:

dockerfile:構建鏡像的源碼

.dockerignore 忽略的文件寫裏面

mkdir img1 & cd img1

vim Dockerfile

# base image

FROM busybox:latest

MAINTAINER "lwb"

COPY index.html  /data/web/html/

COPY yum.repos.d /etc/yum.repos.d/

 #下載並保存到指定目錄 向目標路徑打包文件

ADD http://nginx.org/download/nginx-1.16.1.tar.gz /usr/local/src/

 

docker build -t tinyhttpd:v0.1-3 .

驗證

docker run --name tinyweb1 --rm tinyhttpd:v0.1-3  ls /usr/local/src/

 

例子二:

wget  http://nginx.org/download/nginx-1.16.1.tar.gz

# base image

FROM busybox:latest

MAINTAINER "lwb"

COPY index.html  /data/web/html

COPY yum.repos.d /etc/yum.repos.d

#下載並保存到指定目錄  ADD http://nginx.org/download/nginx-1.16.1.tar.gz /usr/local/src/

WORKDIR /usr/local/src/   #指定工做目錄

ADD nginx-1.16.1.tar.gz ./  #放在當前工做目錄下

#容器創建存儲卷 /data/mysql/與宿主機創建關聯關係

VOLUME /data/mysql/

 

 

docker build -t tinyhttpd:v0.1-4 .

             鏡像名:tag  .表示當前目錄

驗證

docker run --name tinyweb1 --rm tinyhttpd:v0.1-4  ls  /usr/local/src/

 

例子三

# base image

FROM busybox:latest

MAINTAINER "lwb"

#傳入環境變量

ENV DOC_ROOT=/data/web/html/ \

    WEB_SERVER_PACKAGE="nginx-1.16.1.tar.gz"

#DOC_ROOT環境變量前面沒有定義就用-後面的

COPY index.html  ${DOC_ROOT:-/data/web/html/}

COPY yum.repos.d /etc/yum.repos.d

#下載到指定目錄  

ADD http://nginx.org/download/${WEB_SERVER_PACKAGE} /usr/local/src/

#工做目錄

WORKDIR /usr/local/src/

#ADD ${WEB_SERVER_PACKAGE} ./

#容器創建存儲卷 /data/mysql/與宿主機創建關聯關係

VOLUME /data/mysql/

#待暴露端口

EXPOSE 80/tcp

#RUN 定義docker build 定義製做鏡像的容器運行的命令

RUN cd /usr/local/src && \

    tar -xf ${WEB_SERVER_PACKAGE} && \

 

docker run --name tinyweb1 --rm -e WEB_SERVER_PACKAGE="nginx-1.16.0" tinyhttpd:v0.1-5  printenv

                             -e 啓動容器傳入或修改環境變量      printenv打印容器環境變量      

 

 

init進程:內核啓動的進程 進程號爲1

  nohup command & 剝離於shell父進程,是init子進程

 

exec command 開啓shell子進程,並替換當前進程成爲主進程,並且在容器中進程號爲1

 

殭屍進程:子進程比父進程先結束,而父進程又沒有收回子進程,釋放子進程佔用的資源,此時子進程將成爲一個殭屍進程,若是父進程先退出,子進程被init接管,子進程退出後會回收其佔用的相關資源

 

孤兒進程:父進程退出,子進程還在運行,那麼子進程就會變成孤兒進程,孤兒進程將會被init進程收養,並由init進程對他們完成狀態收集工做

 

CMD命令定義:

CMD <command> 進程號不爲1  RUN

CMD [「<executable>」,」<param1>」,」<param2>」] 進程號爲1,即相似init進程 可與docker sock通訊 同RUN

CMD [「<param1>」,」<param2>」 ] 用於爲ENTRYPOINT提供默認參數

 

cmd例一

mkdir img2 & cd img2

FROM busybox

LABEL maintainer="<34697826@qq.com>" app="httpd"

 

ENV WEB_DOC_ROOT="/data/web/html/"

 

RUN mkdir -p  $WEB_DOC_ROOT && \

    echo "<h1>Busybox httpds server</h1>" > ${WEB_DOC_ROOT}/index.html

 

#定義容器啓動時運行的命令

CMD /bin/httpd -f -h ${WEB_DOC_ROOT}

 

docker build -t tinyhttpd:v0.2-1 ./

docker run --name tinyweb2 -it --rm tinyhttpd:v0.2-1

 

 

cmd例二

FROM busybox

LABEL maintainer="<34697826@qq.com>" app="httpd"

 

ENV WEB_DOC_ROOT="/data/web/html/"

 

RUN mkdir -p  $WEB_DOC_ROOT && \

    echo "<h1>Busybox httpds server</h1>" > ${WEB_DOC_ROOT}/index.html

 

#不以shell子進程來解析 「/bin/sh」,」-c」 手動開啓shell子進程

CMD [「/bin/sh」,」-c」,"/bin/httpd","-f","-h /data/web/html/"]

 

docker build -t tinyhttpd:v0.2-2 ./

docker run --name tinyweb2 -it --rm tinyhttpd:v0.2-2

 

ENTRYPOINT例子三

docker run運行容器時在指定命令和參數,改變容器啓動默認運行的命令

FROM busybox

LABEL maintainer="<34697826@qq.com>" app="httpd"

 

ENV WEB_DOC_ROOT="/data/web/html/"

 

RUN mkdir -p  $WEB_DOC_ROOT && \

    echo "<h1>Busybox httpds server</h1>" > ${WEB_DOC_ROOT}/index.html

 

#定義容器啓動時運行的命令不會被docker run後面接的參數而改變,而是當成參數傳給容器默認啓動執行命令

ENTRYPOINT  /bin/httpd -f -h ${WEB_DOC_ROOT}

 

docker build -t tinyhttpd:v0.2-5 ./

docker run --name tinyweb2 -it --rm tinyhttpd:v0.2-5 ls /data/web/html

                                          定義了默認執行ENTRYPOINT類命令,當成參數傳給ENTRYPOINT命令

 

若是要覆蓋,就要用docker run  --entrypoint 來覆蓋Dockerfile定義的ENTRYPOINT

 

 

ENTRYPOINTCMD組合 例子四

FROM busybox

LABEL maintainer="<34697826@qq.com>" app="httpd"

 

ENV WEB_DOC_ROOT="/data/web/html/"

 

RUN mkdir -p  $WEB_DOC_ROOT && \

    echo "<h1>Busybox httpds server</h1>" > ${WEB_DOC_ROOT}/index.html

 

#CMD的命令當成參數傳給ENTRYPOINT

CMD ["/bin/httpd","-f","-h ${WEB_DOC_ROOT}"]

ENTRYPOINT ["/bin/sh","-c"]

 

docker build -t tinyhttpd:v0.2-7 ./

docker image inspect tinyhttpd:v0.2-7  查看默認啓動命令

docker run --name tinyweb3 -it --rm tinyhttpd:v0.2-7

 

docker run --name tinyweb5 -it --rm tinyhttpd:v0.2-7 ls /

                                       覆蓋Dockerfile定義的CMD傳給ENTRYPOINT  

 

 

容器接受配置經過環境變量是最好的方式

nginx更靈活配置

mkdir img3 && cd img3

vim Dockerfile

FROM nginx:1.14-alpine

LABEL maintainer="346978526@qq.com"

ENV NGX_DOC_ROOT='/data/web/html/'

ADD index.html ${NGX_DOC_ROOT}

ADD entrypoint.sh /bin/

CMD [「/usr/sbin/nginx」,」-g」,」daemon off;」]

ENTRYPOINT [「/bin/entrypoint.sh」]

 

vim entrypoint.sh

#!/bin/sh

cat > /etc/nginx/conf.d/www.conf <<EOF

server  {

    server_name $HOSTNAME;

    listen ${IP:-0.0.0.0}:${PORT:-80};

    root ${NGX_DOC_ROOT:-/usr/share/nginx/html};

}

EOF

# $@爲腳本的全部參數,即DockerfileCMD傳過來的全部參數 exec /usr/sbin/nginx -g daemon off;

exec "$@"

chmod +x entrypoint.sh

 

docker build -t myweb:v0.3-1 ./

docker run --name myweb1 --rm -P -it  myweb:v0.3-1

docker exec -it  myweb1  /bin/sh

docker run --name myweb1 --rm -P -it -e "PORT=8080" myweb:v0.3-1

                              -e 還能在docker run定義環境變量傳進去

docker exec -it myweb1 /bin/sh 驗證

 

 

helthcheck健康探測

 

FROM nginx:1.14-alpine

LABEL maintainer="346978526@qq.com"

 

ENV NGX_DOC_ROOT='/data/web/html/'

 

ADD index.html ${NGX_DOC_ROOT}

ADD entrypoint.sh /bin/

 

EXPOSE 80/tcp

 

HEALTHCHECK --start-period=3s CMD wget -O - -q http://${IP:-0.0.0.0}:${PORT:-80}/

                容器啓動後3秒開始   wget -q靜默模式     

 

CMD ["/usr/sbin/nginx","-g","daemon off;"]

ENTRYPOINT ["/bin/entrypoint.sh"]

                                    

 

ARG的使用 用於docker build時傳參數和替換參數

FROM nginx:1.14-alpine

ARG author="lwb 346978526@qq.com"

LABEL maintainer="${author}"

ENV NGX_DOC_ROOT='/data/web/html/'

ADD index.html ${NGX_DOC_ROOT}

ADD entrypoint.sh /bin/

EXPOSE 80/tcp

HEALTHCHECK --start-period=3s CMD wget -O - -q http://${IP:-0.0.0.0}:${PORT:-80}

CMD ["/usr/sbin/nginx","-g","daemon off;"]

ENTRYPOINT ["/bin/entrypoint.sh"]

 

docker build -t myweb:v0.3-10 ./

docker image inspect myweb:v0.3-10 驗證

docker build --build-arg author="pony pony@qq.com" -t  myweb:v0.3-11 ./

docker image inspect myweb:v0.3-11 驗證

 

 

ONBUIld  觸發器。當作成的鏡像被別的Dockerfile用來作基礎鏡像時觸發  通常是接RUN指令

FROM nginx:1.14-alpine

 

ARG author="lwb 346978526@qq.com"

LABEL maintainer="${author}"

 

ENV NGX_DOC_ROOT='/data/web/html/'

 

ADD index.html ${NGX_DOC_ROOT}

ADD entrypoint.sh /bin/

 

EXPOSE 80/tcp

 

ONBUILD ADD http://mirrors.163.com/elastic/6.x/apt/dists/stable/Release /etc/yum.repos.d/

 

CMD ["/usr/sbin/nginx","-g","daemon off;"]

ENTRYPOINT ["/bin/entrypoint.sh"]

 

docker build --build-arg author="pony pony@qq.com" -t  myweb:v0.3-12 ./

mkdir img4 && cd img4

vim Dockerfile

FROM myweb:v0.3-12

RUN mkdir /tmp/test

docker run --name test1 --rm test:v0.1-1 ls /etc/yum.repos.d/  驗證

 

 

私有倉建立

docker-distribution項目

rpm -ql docker-distribution

registry倉庫

yum install docker-registry -y 安裝的包是docker-distribution

鏡像保存目錄:/var/lib/registry

配置文件:/etc/docker-distribution/registry/config.yml

systemctl start docker-distribution

vim /etc/docker/daemon.json

{

  "registry-mirrors": ["https://lvb4p7mn.mirror.aliyuncs.com"],

  "insecure-registries": ["node1:5000"]  #接受不安全服務器

}

systemctl restart docker

docker tag myweb:v0.3-11 node1:5000/myweb:v0.3-11

docker push node1:5000/myweb:v0.3-11

 

下載節點要這樣設置

vim /etc/docker/daemon.json

{

  "registry-mirrors": ["https://lvb4p7mn.mirror.aliyuncs.com"],

  "insecure-registries": ["node1:5000"]  #接受不安全服務器

}

systemctl restart docker

測試下載

docker pull node1:5000/myweb:v0.3-11

鏡像層在/var/lib/registry/docker/registry/v2/repositories/myweb/_layers/sha256

 

 

vmware harbor企業鏡像倉

1,多租戶

2,安全及風險掃描

3,日誌審計

4,標識集成和基於角色訪問控制策略

5,主備倉鏡像同步

6,擴展的API和圖形用戶界面

7,支持中文

安裝手冊 https://github.com/goharbor/harbor/blob/master/docs/installation_guide.md

https://github.com/goharbor/harbor

https://github.com/goharbor/harbor/releases/tag/v1.5.2

 

下載https://storage.googleapis.com/harbor-releases/harbor-offline-installer-v1.5.2.tgz

tar xf harbor-offline-installer-v1.5.2.tgz -C /usr/local/

/usr/local/harbor

vim harbor.cfg

hostname = node1.com

max_job_workers = 3

harbor_admin_password = 123456

db_password = 123456

 

yum install docker-compose -y

./install.sh  工做端口 80 443 4443

測試

http://192.168.81.20

admin/123456

使用

用戶管理 -->建立用戶 lwb/She5216600

倉庫管理 -->新建目標 目標名:myproject 目標url;http://node1/myproject 用戶名:lwb 密碼:同上 不驗證遠程證書

複製規則 -->

用普通用戶登錄 --> 項目 -->新建項目 devel 公開 -->點擊推送鏡像

docker tag SOURCE_IMAGE[:TAG] node1/devel/IMAGE[:TAG]  / docker push node1/devel/IMAGE[:TAG]

測試: node2 上測試

vim /etc/docker/daemon.json

{

  "registry-mirrors": ["https://lvb4p7mn.mirror.aliyuncs.com"],

  "insecure-registries": ["node1.com"]

}

systemctl restart docker

docker login node1.com

docker tag myweb:v0.3-10 node1.com/devel/myweb:v0.3-10

docker tag myweb:v0.3-11 node1.com/devel/myweb:v0.3-11

docker tag myweb:v0.3-12 node1.com/devel/myweb:v0.3-12

docker push node1.com/devel/myweb myweb倉庫的全部鏡像都推上去

                   項目名  倉庫名           

中止harbor服務

cd /usr/local/harbor

docker-compose pause 暫停

docker-compose unpause 取消暫停

 

docker-compose 單機編排工具

yum info docker-compose

 

 

資源限制

OOM_ADJ: out of memory的權重 權重越高評分就越高

OOM_SCORE: out of memory 評分

 

memory-swap   memory

正數s          正數m    經常使用可用總空間爲s,其中ramm, swap(s-m),s=m,則無可用 swap資源

0              正數m   至關於未設置swapunset

unset           正數m    若主機(docker host)啓用了 swap,則容器的可用swap2*m

-1              正數m     若主機(docker host)啓用了swap,則容器可以使用最大至主機上的全部swap空間的swap資源

 

-m --memory 最大使用內存

--memory-swappiness 使用swap傾向性 值0-100  0表示能不用 swap就儘可能不用,100表示到了能用 swap就用swap

--oom-kill-disable=true 不會被oom kill

--memeory-reservation 能預留的內存空間

--cpu-period 每次使用cpu的時間

 

CFS scheduler:同時運行的進程小於等於CPU核心數,因此其餘進程須要CFS scheduler來調度運行

--cpu-shares=<values> 按比例切分可用CPU

--cpus=<values> 定義最多使用幾核CPU

--cpuset-cpus 限制在哪一個CPU核心上運行

 

lscpu 查看cpu信息

docker run --help

壓測鏡像  docker pull lorel/docker-stress-ng

驗證memory

docker run --name stress -it --rm -m 256m  lorel/docker-stress-ng stress --help

docker run --name stress -it --rm -m 256m  lorel/docker-stress-ng stress --vm 2

                          限制memory 256m                  ---vm 開啓兩個進程(每一個進程用256m內存)

docker top stress 查看 stress容器資源佔用

docker stats  查看容器資源變更

 

驗證 CPU

docker run --name stress -it --rm --cpus=2 lorel/docker-stress-ng stress --cpu 8

                        限制使用2CPU             開啓8個測試cpu進程

docker stats 查看

docker run --name stress -it --rm  --cpuset-cpus 0,2 lorel/docker-stress-ng stress --cpu 8

                             選定在哪顆cpu

docker run --name stress2 -it --rm  --cpu-shares 512  lorel/docker-stress-ng stress --cpu 8

                            按比例分cpu 512是最小單位

相關文章
相關標籤/搜索