『*-1』Linux之虚拟化的Docker容器

4f0d20311f5b@toc

一. Docker 诞生

1、Docker 是 dotcloud 公司开源的一款产品 dotcloud 是 2010 年新成立的一家公司,
主要基于 PAAS ( Platfrom as a Service ) 平台为开发者提供服务
2、2013 年 10 月 dotcloud 公司改名为 Docker 股份有限公司

二. Docker 历程

1、Linux Container
是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程
和资源
2、Docker是PAAS提供商 dotCloud开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于 go 语言并遵从 Apache2.0 协议开源
3、Docker 设想是交付运行环境如同海运,OS 如同一个货轮,每一个在 OS 基础上的软件都如同一个集装箱,用户可以通过标准化手段自由组装运行环境,同时集装箱的内容可以由用户自定义,也可以由专业人员制造

三.Docker 的构成

1、Docker 仓库:https://hub.docker.com
2、Docker 自身组件

Docker Client:

------------Docker 的客户端

Docker Server:

------------Docker daemon 的主要组成部分,接受用户通过 Docker Client
发出的请求,并按照相应的路由规则实现路由分发

Docker 镜像:

------------Docker 镜像运行之后变成容器(docker run)

在这里插入图片描述

在这里插入图片描述

Docker 安装

Install for Linux
Script

Yum
Rpm 用dnf安装下载好的包,这个好用
『2021最新』rhel7.6上的docker安装

Docker 化应用体验

WordPress 运行环境需要如下软件的支持:
➢ PHP 5.6 或更新软件

dnf install php

➢ MySQL 5.6 或 更新版本

dnf install mariadb

➢ Apache 和 mod_rewrite 模块
docker run --name db --env MYSQL_ROOT_PASSWORD=example -d mariadb


[root@node126 yum.repos.d]# docker run --name db --env MYSQL_ROOT_PASSWORD=example -d mariadb
Unable to find image 'mariadb:latest' locally
latest: Pulling from library/mariadb
04a5f4cda3ee: Pull complete 
ff496a88c8ed: Pull complete 
0ce83f459fe7: Pull complete 
ab94f9d248da: Pull complete 
7c89fa1e706d: Pull complete 
f0ebee2ec8e3: Pull complete 
13e37a1941f9: Pull complete 
7ebfba0582c2: Pull complete 
64bf0726d522: Pull complete 
21560da403f6: Pull complete 
17a7527065bd: Pull complete 
15202da6e261: Pull complete 
Digest: sha256:ab7c906b288cbf1bf5da2302492233e0ca0b93a4a88867849dc0513110ca01c1
Status: Downloaded newer image for mariadb:latest
04e66000bc91397c6ed02c2d818f533e24c122382dd6f50a578d36e64d05a632
[root@node126 yum.repos.d]# 

docker run --name MyWordPress --link db:mysql -p 8080:80 -d wordpress

[root@node126 yum.repos.d]# docker run --name MyWordPress --link db:mysql -p 8080:80 -d wordpress
Unable to find image 'wordpress:latest' locally
latest: Pulling from library/wordpress
ac2522cc7269: Pull complete 
5b2eaf06d6cf: Pull complete 
353d7ace7314: Pull complete 
37e4975b15a3: Pull complete 
f54c541ce8ea: Pull complete 
4c5f70c3328b: Pull complete 
7721d733906f: Pull complete 
15a49155542c: Pull complete 
a365bc9f6bef: Pull complete 
60a4e47167a5: Pull complete 
24b65d3ed44f: Pull complete 
0c1e61773eb8: Pull complete 
c29159fb4bcc: Pull complete 
26fb7e4f01ad: Pull complete 
9c202d0c403c: Pull complete 
0c3ce41d4ac1: Pull complete 
9c5aa7a09350: Pull complete 
474825f9ea74: Pull complete 
94703b17fe04: Pull complete 
73c68a1f3a28: Pull complete 
5c2036f3fca4: Pull complete 
Digest: sha256:a78e00e214e7422e80602bc8e217b7ec3c56392b23cfcf308caf1db82f8de76f
Status: Downloaded newer image for wordpress:latest
1a07a008d745b11d05daf7edb4868645a37a00bee4ec192831204c62c2c39305
[root@node126 yum.repos.d]# 

Docker 基础概念及命令

Docker 三个重要概念:

仓库 (Repository)、
镜像 (image)
容器 (Container)

docker run --name MyWordPress --link db:mysql -p 8080:80 -d wordpress

Docker 指令的基本用法:

docker + 命令关键字(COMMAND) + 一系列的参数Docker 基础命令

Docker 基础命令

docker info 守护进程的系统资源设置
在这里插入图片描述

docker search Docker 仓库的查询
在这里插入图片描述

在这里插入图片描述

docker pull Docker 仓库的下载
在这里插入图片描述

docker images Docker 已安装的镜像的查询
在这里插入图片描述

docker rmi Docker 镜像的删除
在这里插入图片描述

docker ps 容器的查询
在这里插入图片描述

docker run 容器的创建启动
docker start/stop CONTAINERID 容器启动停止
在这里插入图片描述

在这里插入图片描述

Docker 指令除了单条使用外,还支持赋值、解析变量、嵌套

使用单一容器管理

单一容器管理
每个容器被创建后,都会分配一个 CONTAINER ID ,
作为容器的唯一标示,
后续对容器的启动、停止、修改、删除等所有操作,
都是通过 CONTAINER ID 来完成,偏向于数据库概念中的主键

docker ps --no-trunc 查看
      --no-trunc        Don't truncate output
      						  #缩短

在这里插入图片描述

docker stop/start CONTAINERID 停止

在这里插入图片描述

docker start/stop MywordPress 通过容器别名启动/停止

在这里插入图片描述

docker inspect MywordPress 查看容器所有基本信息

在这里插入图片描述

docker logs MywordPress 查看容器日志

在这里插入图片描述

docker stats MywordPress 查看容器所占用的系统资源

在这里插入图片描述

docker exec 容器名 容器内执行的命令 容器执行命令

在这里插入图片描述

docker exec -it 容器名 /bin/bash 登入容器的bash

在这里插入图片描述

run 延伸
--restart=always 容器的自动启动

在这里插入图片描述

-h x.xx.xx 设置容器主机名
--dns xx.xx.xx.xx 设置容器使用的 DNS 服务器
--dns-search DNS 搜索设置
--add-host hostname:IP 注入 hostname <> IP 解析

在这里插入图片描述

--rm 服务停止时自动删除

在这里插入图片描述

Docker-Compose多容器管理

多容器管理
Docker 提倡理念是“一个容器一个进程”,假设一个服务需要由多个进程组成,就需要多个容器组成
一个系统,相互分工和配合对外提供完整服务
比如:博客系统
组件1:mariadb
组件2:WordPress 的 apache web
在启动容器时,同一台主机下如果两个容器之间需要由数据交流,使用 --link 选项建立两个容器之间的互联,前提是建立时 mariadb 已经开启
docker start db
docker start MywordPress
停止:

docker stop db MywordPress

docker stop MywordPress再docker stop db

Docker-compose install

容器编排工具,允许用户在一个模板( 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

docker version
在这里插入图片描述

Docker

-compose 命令用法
在这里插入图片描述

-f 指定使用的 yaml 文件位置 up
-d 启动容器项目
ps 显示所有容器信息
pause 暂停容器
在这里插入图片描述

restart 重新启动容器
在这里插入图片描述

unpause 恢复暂停
在这里插入图片描述

logs 查看日志信息
rm 删除容器
config -q 验证 yaml 配置文件是否正确
stop 停止容器
start 启动容器

Docker 镜像管理镜像特性

镜像的特性

➢容器创建时需要指定镜像,

每个镜像都由唯一的标示 Image ID ,
和容器的 Container ID 一样,
默认 128 位,可以使用前 16 为缩略形式,
也可以使用镜像名与版本号两部分组合唯一标示,如果省略版本号,默认使用最新版本标签( latesr )
镜像的分层:Docker 的镜像通过联合文件系统 ( union filesystem ) 将各层文件系统叠加在一起

> bootfs:用于系统引导的文件系统,包括 bootloader 和 kernel,容器启动完成后会被卸载以节省内存资源
> roofs:位于 bootfs 之上,表现为 Docker 容器的根文件系统
>> 传统模式中,系统启动时,内核挂载 rootfs 时会首先将其挂载为“只读”模式,完整性自检完成后将其挂载为读写模式
>> Docker 中,rootfs 由内核挂载为“只读”模式,而后通过 UFS 技术挂载一个“可写” 层镜像
➢已有的分层只能读不能修改
➢上层镜像优先级大于底层镜像

DockerFile镜像的诞生

1、容器 > 镜像 :docker commit CID xx.xx.xx

工作在前台的守护进程至少一个

docker pull hub.c.163.com/public/centos:6.7-tools
docker commit mysql mysql:5.1
2、Dockerfile

Dockerfile 是一种被 Docker 程序解释的脚本,
Dockerfile 由一条一条的指令组成,
每条指令对应 Linux 下面的一条命令。
Docker 程序将这些 Dockerfile 指令翻译真正的 Linux 命令。

Dockerfile 有自己书写格式和支持的命令,
Docker 程序解决这些命令间的依赖关系,类似于 Makefile。
Docker 程序将读取 Dockerfile,根据指令生成定制的 image
生成命令:docker
打开 DockerFile 说明
build -t wangyang/jdk-tomcat

镜像的导出以及导入

导出:docker save -o xx.xx.xx xx.xx.xx.tar
导入:docker load -i xx.xx.xx.tar3

Docker 仓库构建

1、官方仓库构建

2、Harbor 构建

Docker 网络通讯

在这里插入图片描述
(1) 容器访问外部网络
iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -o docker0 -j MASQUERADE
(2) 外部网络访问容器
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 网络模式修改

Docker 进程网络修改
-b, --bridge=””

指定 Docker 使用的网桥设备,默认情况下 Docker 会自动创建和使用 docker0 网桥设备,通过此参数可以使用已经存在的设备

--bip 指定 Docker0 的 IP 和掩码,使用标准的 CIDR 形式,如 10.10.10.10/24
--dns 配置容器的 DNS,在启动 Docker 进程是添加,所有容器全部生效Docker 容器网络修改
Docker 容器网络修改
--dns 用于指定启动的容器的 DNS
--net 用于指定容器的网络通讯方式,有以下四个值
➢bridge:Docker 默认方式,网桥模式
➢none:容器没有网络栈  	##有些容器,比如用于计算,不需要网络
➢container:使用其它容器的网络栈,Docker容器会加入其它容器的 network namespace
➢host:表示容器使用 Host 的网络,没有自己独立的网络栈。容器可以完全访问 Host 的网络,不安全暴露端口


在这里插入图片描述

在这里插入图片描述

访问的是容器中的tomcat
在这里插入图片描述

暴露端口

-p / P 选项的使用格式

> -p :<ContainerPort> 将制定的容器端口映射至主机所有地址的一个动态端口
> -p <HostPort>:<ContainerPort>:映射至指定的主机端口

docker run --name ricky -d nextcloud -p 7777:80

> -p <IP>::<ContainerPort>:映射至指定的主机的 IP 的动态端口
> -p
<IP>:<HostPort>:<ContainerPort>:映射至指定的主机 IP 的主机端口
> -P(大):暴露所需要的所有端口
* docker port ContainerName 可以查看容器当前的映射关系自定义 

docker port nginx


443/tcp -> 0.0.0.0:443
4443/tcp -> 0.0.0.0:4443
80/tcp -> 0.0.0.0:80
[root@server1 harbor]# 
Docker0 网桥的网络地址

自定义 Docker0 桥的网络地址
修改 /etc/docker/daemon.json 文件

{
"bip": "192.168.1.5/24",
"fixed-cidr": "10.20.0.0/16",
"fixed-cidr-v6": "2001:db8::/64",
"mtu": "1500",
"default-gateway": "10.20.1.1",
"default-gateway-v6": "2001:db8:abcd::89",
"dns": ["10.20.1.2","10.20.1.3"]
}

常见隔离方式

基础命令说明
netfilter 规则
docker network ls查看当前可用的网络类型
在这里插入图片描述

docker network create -d 类型 网络空间名称
类型分为:
overlay network
bridge network不同网络空间进行隔离

docker network create -d bridge --subnet "172.26.0.0/16" --gateway "172.26.0.1" my-bridge-network
在这里插入图片描述

docker run --name tomcat11 --network=my-bridge-network -d tomcat
在这里插入图片描述

docker run --name tomcat111 --network=my-bridge-network -d tomcat
在这里插入图片描述
在这里插入图片描述

docker network create -d bridge --subnet 172.27.0.0/16 --gateway 172.27.0.1 my27
在这里插入图片描述
实现了容器间的隔离

宿主机搭建网桥,实现容器与宿主机同一网段。

[root@localhost network-scripts]# vi ifcfg-eth0
DEVICE=eth0
HWADDR=00:0C:29:06:A2:35
TYPE=Ethernet
UUID=34b706cc-aa46-4be3-91fc-d1f48c301f23
ONBOOT=yes
BRIDGE=br0
NM_CONTROLLED=yes
BOOTPROTO=static
[root@localhost network-scripts]# vi ifcfg-br0
//改成这样
DEVICE=br0
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.216.131
NETMASK=255.255.255.0
GATEWAY=192.168.216.2
DNS=8.8.8.8
[root@localhost network-scripts]# yum install -y git
[root@localhost network-scripts]# git clone https://github.com/jpetazzo/pipework
[root@localhost network-scripts]# cp pipework/pipework /usr/local/bin/
[root@localhost network-scripts]# docker run --name tomcat --net=none -d tomcat
[root@localhost network-scripts]# pipework br0 tomcat 172.25.6.221/24

在这里插入图片描述tomcat容器里默认发布404,做以下更改

root@023f42c7c8b9:/usr/local/tomcat# rm webapps -rf
root@023f42c7c8b9:/usr/local/tomcat# mv webapps.dist/ webapps

在这里插入图片描述

数据存储

数据卷特性 Why Data Volumes?

> Docker 镜像由多个只读层叠加而成,启动容器时,Docker 会加载只读镜像层并在镜像栈顶部添加一个读写层
> 如果运行中的容器修改了现有的一个已经存在的文件,那么该文件将会从读写层下面的的只读层复制到读写层,
该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,此即“写时复制”机制

在这里插入图片描述

数据卷意义 Why Data Volumes?

> 关闭并重启容器,其数据不受影响;但删除 Docker 容器,则其改变将会全部丢失
>存在的问题
>> 存在于联合文件系统中,不易于宿主机访问
>> 容器间数据共享不便
>> 删除容器其数据会丢失
> 解决方案:“卷”
>> “卷”是容器上的一个或多个“目录”,此类目录可绕过联合文件系统,与宿主机上的某目录“绑定”,
容器删除的时候,宿主机中的数据不删除

在这里插入图片描述

数据卷意义 Why Data Volumes?

> Volume 可以在运行容器时即完成创建与绑定操作。当然,前提需要拥有对应的申明
> Volume 的初衷就是数据持久化

在这里插入图片描述

数据卷类型 Volume types

> Bind mount volume					    ###绑定卷,人为操作。宿主机中任何可用目录
> Docker-managed volume2		### docker管理卷,人为设置,设置后docker自动管理
															docker管理卷一般在/var/lib/docker目录下

在这里插入图片描述

容器中的数据卷

docker rm -f  `docker ps -a -q`   ##删除所有正在运行的容器

下载centos6.7容器

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

vim Dockerfile

FROM hub.c.163.com/public/centos:6.7-tools
RUN touch /tmp/1.txt
RUN mkdir  /data
CMD tail -f /tmp/1.txt

在这里插入图片描述docker build -t test:v1.0 .
在这里插入图片描述

在这里插入图片描述

Docker-managed Volume 容器自动管理

/var/lib/docker/volumes 宿主机容器数据默认目录
在这里插入图片描述
在这里插入图片描述
开启volume卷自动管理
vim Dockerfile

FROM hub.c.163.com/public/centos:6.7-tools
RUN touch /tmp/1.txt
RUN mkdir /data
VOLUME /data   ##在这里指定默认同步目录
CMD tail -f /tmp/1.txt

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

docker inspect test2.0
在这里插入图片描述

在这里插入图片描述

Bind-mount Volume 手动绑定

docker run -it --name roc -v HOSTDIR:VOLUMEDIR roc/lamp:v1.0

docker run --name test3 -v /data3:/data3 -d test:v1.0

在这里插入图片描述

Union Volume 联合卷

不通过宿主机目录,直接绑定两个容器
docker run -it --name roc --volumes-from ContainerName roc/lamp:v1.03

docker run --name test2 -d test:v2.0
docker run --name test3 --volumes-from test2 -d test:v2.0

在这里插入图片描述

存储驱动

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

1、device mapper ( DM ):性能和稳定性存在问题,不推荐生产环境使用
		## 内核3.18之前的主流版本

2、btrfs:社区实现了 btrfs driver,稳定性和性能存在问题
3、overlayfs:内核 3.18 overlayfs 进入主线,性能和稳定性优异,第一选择
3、overlayfs:内核 3.18 overlayfs 进入主线,性能和稳定性优异,第一选择

在这里插入图片描述

Docker overlayfs driver

在这里插入图片描述

mount -t overlay overlay -olowerdir=./low,upperdir=./upper,workdir=./work ./merged
修改为 overlayfs 存储驱动

[root@server2 overlay]# ls  ##overlay下创建4个目录
low  merged  upper  work
[root@server2 overlay]# mount -t overlay overlay -olowerdir=./low,upperdir=./upper,workdir=./work ./merged

## 实现目录的分层挂载

[root@server2 overlay]# cd low 
[root@server2 low]# vim 1.txt 

## low目录创建1.txt

[root@server2 low]# cd ../upper
[root@server2 upper]# vim 2.txt

##upper目录创建2.txt

[root@server2 upper]# cd ../merged/
[root@server2 merged]# ls
1.txt  2.txt

## merged目录自动显示1.txt 2.txt

[root@server2 merged]# cat 1.txt 
low 1.txt
[root@server2 merged]# cat 2.txt 
upper 1.txt 
[root@server2 upper]# cd ../merged/
[root@server2 merged]# ls
1.txt  2.txt
[root@server2 merged]# vim 1.txt 
[root@server2 merged]# cat 1.txt 
merged 1.txt

##修改merged目录中1.txt内容为merged

[root@server2 merged]# ls
1.txt  2.txt
[root@server2 merged]# cd ../low/
[root@server2 low]# ls
1.txt
[root@server2 low]# cat 1.txt 
low 1.txt

## low目录下的1.txt内容仍然为low

[root@server2 low]# cd ../merged/
[root@server2 merged]# ls
1.txt  2.txt
[root@server2 merged]# cat 1.txt 
merged 1.txt

		## merged下的文件1.txt内容为 merged

[root@server2 merged]# rm 1.txt 
rm: remove regular file ‘1.txt’? y

		##删除merged下的1.txt

[root@server2 merged]# ls
2.txt

		## merged中的1.txt没了

[root@server2 merged]# cd ../upper/
[root@server2 upper]# ls
1.txt  2.txt
[root@server2 upper]# cat 1.txt 
cat: 1.txt: No such device or address
[root@server2 upper]# ll
total 4
c--------- 1 root root 0, 0 Apr  6 01:25 1.txt
-rw-r--r-- 1 root root   13 Apr  6 01:21 2.txt

		##upper中的1.txt变成c开头的

[root@server2 upper]# rm 1.txt 
rm: remove character special file ‘1.txt’? y

## 删除upeer中的1.txt

[root@server2 upper]# ls
2.txt
[root@server2 upper]# cd ../merged/
[root@server2 merged]# ls
1.txt  2.txt
[root@server2 merged]# cat 1.txt 
low 1.txt

## merged中的1.txt恢复为low

change overlayfs driver 改存储驱动为overlay

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

资源限制

内存资源限制

> CGroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组 (process groups) 所使用的物力资源 (如 cpu memory i/o 等等) 的机制。
> 2007 年进入 Linux 2.6.24 内核,CGroups 不是全新创造的,它将进程管理从 cpuset 中剥离出来,作者是 Google 的 Paul Menage
> 默认情况下,如果不对容器做任何限制,容器能够占用当前系统能给容器提供的所有资源
> Docker 限制可以从 Memory、CPU、Block I/O 三个方面
> OOME:Out Of Memory Exception
>> 一旦发生 OOME,任何进程都有可能被杀死,包括 docker daemon 在内
>> 为此,Docker 调整了 docker daemon 的 OOM 优先级,以免被内核关闭
> 为应用做内存压力测试,理解正常业务需求下使用的内存情况,然后才能进入生产环境使用
> 一定要限制容器的内存使用上限
> 尽量保证主机的资源充足,一旦通过监控发现资源不足,就进行扩容或者对容器进行迁移
> 如果可以(内存资源充足的情况),尽量不要使用 swap,swap 的使用会导致内存计算复杂,对调度器非常不友好设置方式
在 docker 启动参数中,和内存限制有关的包括(参数的值一般是内存大小,也就是一个正数,后面跟着内存单位 b、k、m、g,分别对应 bytes、KB、MB、和 GB):

-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 的时候杀死容器。只有设置了 -m,才可以把这个选项设置为 false,否则容器会耗尽主机内存,而且导致主机应用被杀死设置解释
在这里插入图片描述

CPU 资源限制

CPU 限制说明
Docker 提供的 CPU 资源限制选项可以在多核系统上限制容器能利用哪些 vCPU。
而对容器最多能使用的 CPU 时间
有两种限制方式:
• 一是有多个 CPU 密集型的容器竞争 CPU 时,设置各个容器能使用的 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,单位微秒
Example
docker run -it --cpu-period=50000 --cpu-quota=25000 ubuntu:16.04 /bin/bash
docker run -it --cpu-period=10000 --cpu-quota=20000 ubuntu:16.04 /bin/bash

docker run --name stress -it --rm --cpu-period=10000 --cpu-quota=20000 lorel/docker-stress-ng:latest stress --cpu 12
docker stats stress

在这里插入图片描述

--cpus

能够限制容器可以使用的主机 CPU 个数,并且还可以指定如 1.5 之类的小数NUMA

NUMA
非统一内存访问(NUMA)是一种用于多处理器的电脑记忆体设计,内存访问时间取决于处理器的内存位置。 在NUMA下,处理器访问它自己的本地存储器的速度比非本地存储器(存储器的地方到另一个处理器之间共享的处理器或存储器)快一些3

限制实验

> docker run --name stress -it --rm -m 256m lorel/docker-stress-ng:latest stress -vm 2
									##256M内存					     			##2进程	
docker stats stress

在这里插入图片描述

> docker run --name stress -it --rm --cpus 2 lorel/docker-stress-ng:latest stress --cpu 8
 									## 2个cpu										## 8线程
docker stats stress

在这里插入图片描述

> docker run --name stress -it --rm --cpuset-cpus 0 lorel/docker-stress-ng:latest stress --cpu 8
										##0号cpu
docker stats stress

在这里插入图片描述

总结

远程访问

修改 /etc/docker/daemon.json 文件
"hosts": ["tcp://0.0.0.0:2375","unix://var/run/docker.sock"]
example:
docker -H Ip:Port Command

OCI

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 来实际运行容器
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值