docker理论

主机级虚拟化:

1,基于物理硬件直接虚拟化 hypervisor

2,基于操作系统的虚拟化软件 vmware kvm vmworkstation

 

内核的作用:资源的分配和管理

Jail  vserver(chroot)

 

6种名称空间

Ipc进程间通信  信号量 消息队列 共享内容

uts主机名和域名 namespace隔离

mount文件数 挂载点

进程树pid : init:没有父进程的进程 进程编号

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是最小单位

posted on 2019-09-02 11:07  SZ_文彬  阅读(308)  评论(0编辑  收藏  举报