Docker简介

Docker 是 dotcloud 公司开源的一款产品,主要基于 PAAS ( Platfrom as a Service ) 平台为开发者提供服务。

Docker 与传统虚拟化对比各个应用程序共享库资源,节约资源,但安全性不高

Docker 的构成

Docker 仓库

https://hub.docker.com

https://hub-stage.docker.com

Docker自身组件

Docker Client - Docker客户端

DockerService - Docker Daemon的主要组成,接受Docker Client发出的请求,并按照相应的路由规则实现路由分发

Docker 镜像 - Docker镜像运行之后变成容器

Docker 安装

配置国内yum源

http://mirrors.aliyun.com/repo/Centos-7.repo的内容覆盖/etc/yum.repos.d/CentOS-Base.repo文件

wget http://mirrors.aliyun.com/repo/Centos-7.repo -O /etc/yum.repos.d/CentOS-Base.repo

执行

yum clean all yum makecache

安装

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 18.06.3.ce-3.el7这个版本(1. 比较稳定;2. 对一些参数做了初始化而不需要配置)
yum list docker-ce --showduplicates

yum install -y docker-ce-18.06.3.ce-3.el7 -y

配置镜像加速

阿里云容器镜像服务

容器镜像服务

## 创建 /etc/docker 目录
mkdir /etc/docker

cat <<EOF > /etc/docker/daemon.json
{
    "exec-opts": ["native.cgroupdriver=systemd"],
    "registry-mirrors": [
        "https://proxy.1panel.live",
        "https://docker.1panel.top",
        "https://docker.m.daocloud.io",
        "https://docker.1ms.run",
        "https://docker.ketches.cn"
    ]
}
EOF
systemctl daemon-reload
systemctl restart docker && systemctl enable docker

docker version

Docker体验

docker安装wordpress

docker run --name db --env MYSQL_ROOT_PASSWORD=123456 --env MYSQL_DATABASE=wordpress --env MYSQL_USER=wordpress  --env MYSQL_PASSWORD=123456 -d mysql:5.6
docker run --name wordpress --link db:mysql -p 8080:80 -d wordpress

Docker容器管理

Docker重要概念

仓库、镜像、容器

Docker常用命令

基本用法 docker + 命令关键词 + 参数

docker info - 查看守护进程的系统资源设置

docker search - 仓库镜像查询

docker pull - 仓库镜像下载

docker push 192.168.40.102/test/hello-world - 上传镜像到仓库

docker images - 本地docker镜像的查询

docker rmi - 删除本地docker镜像

docker rm - 删除本地的容器( -f 强制删除)

docker rm -f $( docker ps -a -q) - 删除所有容器

docker ps - 查询本地运行的容器(-a 查询所有, -q只查询id)

docker run - 容器的创建和运行

docker start/stop - 容器启动和停止

docker tag REPOSITORY:TAG newREPOSITORY:newTAG - 给环镜像打上标签,以及修改REPOSITORY,会新加改镜像

Docker容器管理命令

每个容器被创建后,都会分配一个 CONTAINER ID 作为容器的唯一标示- id,可通过容器名和id来进行如下操作

docker ps -no-trunc <> - 查看(包括完整128位id)

docker stop/start <> - 停止/开始容器

docker inspect <> - 查看容器或镜像所有基本信息

docker logs <> - 查看容器日志 -f 监听

docker stats <> - 监听查看容器所占用的系统资源 不跟参数查看全部

docker exec <> cmd - 容器执行命令,命令不用加什么引号

docker exec -it <> /bin/bash - 登入容器bash

docker cp src :dst - 将文件或文件夹从主机复制到容器

docker cp :src dst - 将文件或文件夹从容器复制到主机

Run常用参数

--restart=always - 容器跟随docker服务自动启动(否则需要手动start) 和--rm冲突

--rm - 服务停止时自动删除, 使用docker stop自动删除 和--restart冲突

-h x.x.x.x - 设置容器主机名即 hostname

--ip x.x.x.x - 指定容器ip

--dns x.x.x.x - 设置容器dns服务器 即/etc/resolve中的nameserver

--dns-search - 设置容器DNS搜索设置 即/etc/resolv.conf中的search

--add-host hostname:ip 注入hostname ip解析 即/etc/hosts中的解析

-d - 在后台运行容器

-p host_port:port - 发布容器端口到主机端口

-it 有交互的运行,docker run -it --rm --name jt jdk_tomcat可做调试观察前台进程是否运行正常 与-d 最好不要一起

-link containerName - 添加和其他容器的连接,容器的/etc/hosts中添加解析如172.17.0.2 containerName 367321c189c4

-link containerName:别名 - 添加和其他容器的连接,容器的/etc/hosts中添加解析如 172.17.0.2 别名 367321c189c4 containerName

Docker-Compose

容器编排工具,允许用户在一个模板(YAML格式)中定义一组相关联的容器,会根据--link等参数,对启动的优先级进行排序。

安装

curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod o+x /usr/local/bin/docker-compose
docker-compose --version

用法

-f 指定使用的yaml文件(文件不是docker-compose.yml或docker-compose.yaml,需要指定文件名称,要放在最前面)

config -q 验证yaml配置文件是否正确

up -d 启动容器项目

ps 显示所有容器信息

pause 暂停所有容器,不是停止,容器未进入exit

restart 重新启动容器,相当与停止后启动

unpause 恢复暂停

logs 查看日志信息

rm 删除整个容器项目

stop 停止容器

start 启动容器

rm -sf 停止并删除容器,s停止容器,f强制删除,不加f,会有提示选择y/N

代码

version: '2'

services:
   db:
     image: mysql:5.6
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: 123456
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: 123456

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     restart: always
     ports:
       - "8000:80"
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: 123456

depends_on相当于--link参数

restart相当于--restart参数

相当与

docker run --name db --env MYSQL_ROOT_PASSWORD=123456 --env MYSQL_DATABASE=wordpress --env MYSQL_USER=wordpress --env MYSQL_PASSWORD=123456 --restart=always -d mysql:5.6    

docker run --name wordpress --link db  --env WORDPRESS_DB_HOST=db:3306 --env WORDPRESS_DB_USER=wordpress --env WORDPRESS_DB_PASSWORD=123456 --restart=always -p 8000:80 -d wordpress

Docker镜像管理

容器转换为镜像

docker commit mysql mysql:5.1

要求转换的容器中工作在前台的守护进程至少一个,不然这样的容器一运行就会退出(exit)

官网的centos镜像容器启动运行命令是bash,不是前台守护进程,所以一运行就会退出

网易的public centos镜像hub.c.163.com/public/centos:6.7-tools容器启动运行命令不是bash,而是/usr/bin/supervisord,且是前台守护进程,所以可以一直运行

 docker pull hub.c.163.com/public/centos:6.7-tools

这样生成的镜像不能设置启动是运行的命令, 比如手动安装了其他软件,变为镜像又变为容器后,手动安装启动的是不会启动的(比如tomcat)

Dockerfile

Dockerfile 是一种被 Docker 程序解释的脚本,Docker 程序读取 Dockerfile,根据指令生成定制的 image

构建镜像

docker build -t jdk-tomcat:1.0 . 要求目录下有文件名为Dockerfile .表示以当前目录作为构建上下文
docker build -t jdk-tomcat:1.0 . -f Dockerfile
Dockerfile中的每一条命令都为分一个层,且最多分层128

常用语法

From (指定基础 image,且在其他指令前面)
    FROM centos:7.2
    FROM centos

MAINTAINER (用来指定镜像创建者信息)
    MAINTAINER  chy "chy.98@foxmail.com"

RUN(安装软件用,可以运行任何被基础image支持的命令)
    RUN cd /tmp && curl -L 'http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.8/bin/apache-tomcat-7.0.8.tar.gz' | tar -xz 
    RUN ["/bin/bash", "-c", "echo hello"]

CMD(设置container启动时执行的操作, 只能在文件中存在一次,如果有多个,则只执行最后一条)
    CMD echo "Hello, World!"

ENTRYPOINT(设置container启动时执行的操作,可以多次设置,但是只有最后一个有效)
    独自使用时,CMD指令和ENTRYPOINT会互相覆盖只有最后一个CMD或者ENTRYPOINT有效
        ENTRYPOINT ls -l 
    和CMD指令配合使用来指定ENTRYPOINT的默认参数,CMD指令是参数部分,ENTRYPOINT不能指定参数    
        CMD ["-l"]  
        ENTRYPOINT ["/usr/bin/ls"] 

USER(设置启动容器的用户)
    USER daemon

EXPOSE(指定容器需要映射到宿主机器的端口)
    映射一个端口(docker run -p host_port1:Port1 image)
        EXPOSE 22
    映射多个端口(    docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image)  
        EXPOSE port1 port2 port3  

ENV(用于images设置环境变量,可通过docker inspect查看,docker run --env key=value时设置或修改环境变量)
    ENV JAVA_HOME /path/jdk

ADD(从src复制文件到容器的dest路径,默认解压,src可为远程地址,src是相对于构建上下文的路径)
    ADD <src> <dest>

COPY (从src复制文件到容器的dest路径,不能解压,src不可为远程地址)
    COPY <src> <dest>

VOLUME(指定挂载点,使容器中的一个目录具有持久化存储数据的功能,当容器关闭后,数据也还在)
    VOLUME ["/tmp/data"] 

WORKDIR(切换目录,不存在会创建目录,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效)
    WORKDIR /p1 
    WORKDIR p2 
    RUN vim a.txt

ONBUILD(在子镜像中执行,ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行)
    ONBUILD ADD . /app/src
    ONBUILD RUN /usr/local/bin/python-build --dir /app/src

测试

jdk+tomcat, 主机有jdk和tomcat压缩包实现容器tomcat部署

临时变量

export JAVA_HOME=/usr/local/jdk1.8.0_144 export PATH=$JAVA_HOME/bin:$PATH

catalina.sh run 是一个前台进程,运行后容器不退出,如果使用startup.sh后台的就会退出

FROM centos:6.7
MAINTAINER  chy "chy.98@foxmail.com"
ADD apache-tomcat-8.5.47.tar.gz /tmp
ADD jdk-8u144-linux-x64.tar.gz /usr/local

ENV JAVA_HOME /usr/local/jdk1.8.0_144
ENV PATH $JAVA_HOME/bin:$PATH
CMD /tmp/apache-tomcat-8.5.47/bin/catalina.sh run

EXPOSE 8080

镜像的导出以及导入

导出:docker save -o xx.xx.xx.tar xx.xx.xx

导入:docker load -i xx.xx.xx.tar

镜像仓库构建

官方仓库构建

harbor构建(1.2.0)

前提

python 2.7版本及以上

docker1.10版本及以上

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 18.06.3.ce-3.el7这个版本(1. 比较稳定;2. 对一些参数做了初始化而不需要配置)
yum list docker-ce --showduplicates

yum install -y docker-ce-18.06.3.ce-3.el7 -y

docker compose为1.6版本及以上

curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod o+x /usr/local/bin/docker-compose
docker-compose version

安装

下载软件包

https://github.com/vmware/harbor/releases/download/v1.2.0/harbor-offline-installer-v1.2.0.tgz

解压

tar -zxvf harbor-offline-installer-v1.2.0.tgz

创建https证书

mkdir -p /data/cert

cd /data/cert

openssl genrsa -des3 -out server.key 2048
openssl req -new -key server.key -out server.csr
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.cr

chmod -R 777 /data/cert

配置harbor.cfg

hostname = 192.168.40.102 目标主机名或者完全限定域名
ui_url_protocol = https http或https
db_password = root123 # 用于db_auth的mysql数据库根密码
max_job_workers = 3  #Maximum number of job workers in job service  

customize_crt = on # 当此属性打开时,prepare脚本将为注册表的令牌的生成/验证创建私钥和根证书

secretkey_path = /data # The path of secretkey storage

ssl_cert = /data/cert/server.crt #  ssl证书路径 
ssl_cert_key = /data/cert/server.key # ssl秘钥路径

脚本安装

./install.sh

访问测试

https://192.168.40.102
默认账号
admin/Harbor12345

上传测试镜像

前提-指定仓库地址

/etc/docker/daemon.json
添加
"insecure-registries":[“https://192.168.40.102"],

重启
systemctl daemon-reload
systemctl restart docker

进行

登录验证
    docker login 192.168.40.102
在项目中标记镜像
    docker tag hello-world 192.168.40.102/test/hello-world:1.0  # test为项目
    docker tag hello-world 192.168.40.102/test/hello-world
推送镜像到当前项目
    docker push 192.168.40.102/test/hello-world:1.0
    docker push 192.168.40.102/test/hello-world

下载测试镜像

前提-指定仓库地址

/etc/docker/daemon.json
添加
"insecure-registries":[“https://192.168.40.102"],

重启
systemctl daemon-reload
systemctl restart docker

进行

docker pull 192.168.40.102/test/hello-world:1.0
docker pull 192.168.40.102/test/hello-world

Docker网络

网络通讯示意

docker network ls 查看当前docker的网络
默认有一个bridge网络
cc7514897f5a        bridge              bridge              local

docker network inspect bridge 查看详细 其实代表docker0网桥网络

如果还有其他的网桥网络,那么就会有有br-开头的网桥网卡
而vethX开头的网卡则是为每一个容器的默认bridge网络创建的网卡

img

Docker 中的防火墙规则

docker通过防火墙规则实现通讯

容器访问容器

直接通过docker0网桥做交换

容器访问外部网络

iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -o docker0 -j MASQUERADE

外部网络访问容器

docker run -d -p 80:80 apache
iptables -t nat -A  PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j  DNAT --to-destination 172.17.0.2:80

Docker 容器网络修改

--dns 用于指定启动的容器的 DNS
--net 用于指定容器的网络通讯方式,有以下四个值
    bridge:Docker 默认方式,网桥模式,会创建vethX网卡
    none:容器没有网络栈,宿主机不会创建vethX网卡
    container:使用其它容器的网络栈,Docker容器会加入其它容器的 network namespace
    host:表示容器使用 Host 的网络Host有的网络容器全有,没有自己独立的网络栈。容器可以完全访问 Host 的网络,不安全
-p 端口暴露方式     
    <ContainerPort> 将制定的容器端口映射至主机所有地址的一个动态端口
    <HostPort>:<ContainerPort> 映射至指定的主机端口
    <IP>::<ContainerPort> 映射至指定的主机的 IP 的动态端口
    <IP>:<HostPort>:<ContainerPort> 映射至指定的主机 IP 的主机端口
-P(大):暴露所需要的所有端口

docker run后跟
docker port ContainerName 查看容器当前的端口映射关系

自定义Docker0网桥的网络地址

配置

配置默认桥接网络即docker0的方式。 更改/etc/docker/daemon.json的内容

{
  "bip": "192.168.1.1/24", # 指定 docker0 网桥的 IP 地址和子网掩码
  "fixed-cidr": "192.168.1.0/24", # 指定 docker0 网桥的子网范围
  "default-gateway": "192.168.1.2",
  "mtu": 1500,
  "dns": ["8.8.8.8", "8.8.4.4"],
  "dns-search": ["example.com"]
}

systemctl daemon-reload
systemctl restart docker

改网桥下的容器重新启动后就会更改网络地址

还原

/etc/docker/daemon.json的内容进行删除
systemctl stop docker
rm -rf /var/lib/docker/network
ip link delete docker0
systemctl start docker

网络隔离

配置

docker network ls     查看当前可用的网络类型

docker network inspect 网络空间名称 查看详细

docker network create -d 类型 网络空间名称 --subnet "" --gateway
    docker network create -d bridge b1
类型分为:
    overlay network
    bridge network
创建br-开头的网桥网卡

测试

docker network create -d bridge b1 --subnet "172.27.0.0/16" --gateway "172.27.0.1"

docker run -d --network=b1 --name test1  hub.c.163.com/public/centos:6.7-tools
docker run -d --name test2  hub.c.163.com/public/centos:6.7-tools

test1 ip属于 b1网段
test2 ip属于docker0网段
彼此不通

容器配置上独立IP进行通讯

配置真实网桥

配置真实网桥
cp ifcfg-ens33 ifcfg-br0
vi ifcfg-ens33  # 真实网卡
        TYPE=Ethernet
        PROXY_METHOD=none
        BROWSER_ONLY=no
        BOOTPROTO=none
        DEFROUTE=yes
        IPV4_FAILURE_FATAL=no
        IPV6INIT=yes
        IPV6_AUTOCONF=yes
        IPV6_DEFROUTE=yes
        IPV6_FAILURE_FATAL=no
        IPV6_ADDR_GEN_MODE=stable-privacy
        NAME=ens33
        DEVICE=ens33
        ONBOOT=yes
        BRIDGE=br0
vi ifcfg-br0
        TYPE=Bridge
        PROXY_METHOD=none
        BROWSER_ONLY=no
        BOOTPROTO=static
        IPADDR=192.168.40.101
        GATEWAY=192.168.40.2
        NETMASK=255.255.255.0
        DEFROUTE=yes
        IPV4_FAILURE_FATAL=no
        IPV6INIT=yes
        IPV6_AUTOCONF=yes
        IPV6_DEFROUTE=yes
        IPV6_FAILURE_FATAL=no
        IPV6_ADDR_GEN_MODE=stable-privacy
        NAME=br0
        DEVICE=br0
        ONBOOT=yes

重启网络

systemctl restart network

使用工具分配地址

即可以让容器拥有跟宿主机一个网段的ip

yum install -y git
git clone https://github.com/jpetazzo/pipework
cp pipework/pipework /usr/local/bin/

docker run --name jt --net none -d jdk_tomcat

pipework br0 jt 192.168.40.103/24 # 不是永久生效

Docker数据存储

数据卷特性

Docker 镜像由多个只读层叠加而成,启动容器时,Docker 会加载只读镜像层并在镜像栈顶部添加一个读写层

如果运行中的容器修改了现有的一个已经存在的文件,那么该文件将会从读写层下面的的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,次即“写时复制”机制

数据卷的意义

Volume 可以在运行容器时即完成创建与绑定操作。

Volume 使得数据持久化

数据卷的类型

Bind mount volume

绑定挂载卷

绑定宿主机上的目录映射到容器中的目录

Docker-managed volume

docker自管理卷

绑定宿主机上的/var/lib/docker/volumes/下的随机目录映射到容器中的目录

Union Volume

联合使用卷

绑定宿主机上的/var/lib/docker/volumes/下的随机目录映射到多个容器中的目录

使用数据卷

Bind mount volume

docker run --name jt -v /data:/data -d jdk_tomcat
/data-/data
 docker inspect显示
 "Mounts": [
            {
                "Type": "bind",
                "Source": "/data",
                "Destination": "/data",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

Docker-managed volume

docker run --name jt -v /data -d jdk_tomcat
/var/lib/docker/volumes/{} - /data
docker inspect显示
"Mounts": [
            {
                "Type": "volume",
                "Name": "d3112c4b828d43cf2520ec582e227b79b705b39aa136766564f7faf9f79fd170",
                "Source": "/var/lib/docker/volumes/d3112c4b828d43cf2520ec582e227b79b705b39aa136766564f7faf9f79fd170/_data",
                "Destination": "/data",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],            
删除容器时删除docker自管理卷 -v
docker rm -f -v jt

Union Volume

docker run --name jt -v /data -d jdk_tomcat
docker run --name jt1 --volumes-from jt -d jdk_tomcat

存储驱动

Docker 存储驱动 ( storage driver ) 是 Docker 的核心组件,它是 Docker 实现分成镜像的基础

device mapper ( DM ):性能和稳定性存在问题,不推荐生产环境使用 btrfs:社区实现了 btrfs driver,稳定性和性能存在问题 overlayfs:内核 3.18 overlayfs 进入主线,性能和稳定性优异,第一选择

查看存储驱动

docker info
显示
Storage Driver: overlay2

修改为 overlayfs 存储驱动

echo "overlay" > /etc/modules-load.d/overlay.conf
cat /proc/modules|grep overlay
reboot  
vim /etc/systemd/system/docker.service 
    --storage-driver=overlay \

overlayfs存储测试

img

mkdir overlay
cd overlay
mkdir low
mkdir upper
mkdir work
mkdir merged
mount -t overlay overlay -olowerdir=./low,upperdir=./upper,workdir=./work ./merged

mount 显示
overlay on /root/overlay/merged type overlay (rw,relatime,seclabel,lowerdir=./low,upperdir=./upper,workdir=./work)

Docker资源限制

默认情况下,如果不对容器做任何限制,容器能够占用当前系统能给容器提供的所有资源

Docker 调整了 docker daemon 的 OOM 优先级,以免在Out Of Memory Exception(oome)下被内核关闭

Docker 限制可以从 Memory、CPU、Block I/O 三个方面

Memory

为应用做内存压力测试,理解正常业务需求下使用的内存情况,然后才能进入生产环境使用

一定要限制容器的内存使用上限

尽量保证主机的资源充足,监控发现资源不足,就进行扩容或者对容器进行迁移

如果可以(内存资源充足的情况),尽量不要使用 swap,swap 的使用会导致内存计算复杂,对调度器非常不友好

限制

img

-m --memory:容器能使用的最大内存大小,最小值为 4m
--memory-swap:容器能够使用的 swap 大小
--memory-swappiness:默认情况下,主机可以把容器使用的匿名页(anonymous page)swap 出来,你可以设置一个 0-100 之间的值,代表允许 swap 出来的比例
--memory-reservation:设置一个内存使用的 soft limit,设置值小于 –m 设置
--kernel-memory:容器能够使用的 kernel memory 大小,最小值为 4m。
--oom-kill-disable:启用 --oom-kill-disable 后,即使容器内存超限,OOM Killer 也不会终止容器。默认情况下,如果容器使用的内存超过其限制,OOM Killer 会终止容器进程,只有设置了 -m,可以设置该选项。

测试

docker run --name stress -it --rm -m 256m lorel/docker-stress-ng:latest stress -vm 2 
输出
stress-ng: debug: [7] stress-ng-vm: child died: 9 (instance 1)
stress-ng: debug: [7] stress-ng-vm: assuming killed by OOM killer, restarting again (instance 1)

docker run --name stress -it --rm -m 256m --oom-kill-disable lorel/docker-stress-ng:latest stress -vm 2
输出
stress-ng: debug: [6] : can't set oom_score_adj failed, errno=13 (Permission denied)
stress-ng: debug: [6] stress-ng-vm: started [6] (instance 0)

docker stats 进行观察

CPU

限制容器能利用哪些CPU,以及容器最多能使用的 CPU 时间

限制

--cpuset-cpus="" 允许使用的 CPU 集,值可以为 0-3,0,1
-c,--cpu-shares=0 CPU 共享权值(相对权重),默认值 1024
--cpuset-mems="" 允许在上执行的内存节点(MEMs)
--cpu-period=0 即可设置调度周期,CFS 周期的有效范围是 1ms~1s,对应的--cpu-period的数值范围是 1000~1000000
--cpu-quota=0 设置在每个周期内容器能使用的 CPU 时间,容器的 CPU 配额必须不小于 1ms,即 --cpu-quota的值必须 >= 1000,单位微秒
--cpus 能够限制容器可以使用的主机 CPU 个数,并且还可以指定如 1.5 之类的小数

测试

docker run --name stress -it --rm --cpu-period=50000 --cpu-quota=25000 lorel/docker-stress-ng:latest stress --cpu 8 
docker run --name stress -it --rm --cpu-period=10000 --cpu-quota=20000 lorel/docker-stress-ng:latest stress --cpu 8 
docker run --name stress -it --rm --cpus 2 lorel/docker-stress-ng:latest stress --cpu 8  
docker run --name stress -it --rm --cpuset-cpus 0 lorel/docker-stress-ng:latest stress --cpu 8 
docker stats 进行观察

补充

Docker 远程访问

cat <<EOF > /etc/docker/daemon.json
{
    "hosts": ["tcp://0.0.0.0:2375","unix://var/run/docker.sock"]
}
EOF
systemctl daemon-reload
systemctl restart docker

远程访问

docker -H ip:port CMD

容器标准化结构

Open Container Initiative

由 Linux 基金会主导于 2015 年 6 月创立

旨在围绕容器格式和运行时定制一个开放的工业化标准

Contains two specifications

the Runtime Specification ( runtime-spec )

the Image Specification ( runtime-spec )

RUNC ?

是对于 OCI 标准的一个参考实现,是一个可以用于创建和运行容器的 CLI ( command-line interface )工具。runC 直接与容器所依赖的 cgroup/linux kernel 等进行交互,负责为容器配置 cgroup/namespace 等启动容器所需的环境,创建启动容器的相关进程。

为了兼容 OCI 标准,Docker 也做了架构调整。将容器运行时相关的程序从 Docker daemon 剥离出来,形成了 Containerd。Containerd 向 Docker 提供运行容器的 API,二者通过 grpc 进行交互。Containerd 最后会通过 Runc 来实际运行容器

RUNC 架构

                Docker Engine
                containerd
containerd-shim     containerd-shim     ...
runC                 runC                 ...

img

results matching ""

    No results matching ""