青春网站建设工作室wordpress调出媒体库
news/
2025/9/22 23:12:26/
文章来源:
青春网站建设工作室,wordpress调出媒体库,优化方案2021版语文答案,杭州网站建设网站文章目录 一.docker容器概述1.什么是容器2. docker与虚拟机的区别2.1 docker虚拟化产品有哪些及其对比2.2 Docker与虚拟机的区别 3.Docker容器的使用场景4.Docker容器的优点5.Docker 的底层运行原理6.namespace的六项隔离7.Docker核心概念 二.Docker安装 及管理1.安装 Docker1.… 文章目录 一.docker容器概述1.什么是容器2. docker与虚拟机的区别2.1 docker虚拟化产品有哪些及其对比2.2 Docker与虚拟机的区别 3.Docker容器的使用场景4.Docker容器的优点5.Docker 的底层运行原理6.namespace的六项隔离7.Docker核心概念 二.Docker安装 及管理1.安装 Docker1.1 卸载docker 2.查看docker信息3. 配置docker加速器4.docker镜像相关基础命令4.1 搜索镜像4.2 获取镜像4.3 查看镜像信息4.3.1 镜像下载后存放在 **/var/lib/docker** 。4.3.2 查看下载的镜像文件信息4.3.3 查看下载到本地的所有镜像4.3.4 根据镜像的唯一标识 ID 号获取镜像详细信息4.3.5 本地的镜像添加新的标签 4.4 删除docker镜像4.5 容器导出镜像存储4.6 导入镜像4.7 上传镜像到官方公共仓库 5.Docker 容器相关基础命令5.1 查看docker容器进程、运行状态5.2 创建docker容器5.3 管理docker容器5.4 docker run的运行过程5.4.1 docker 容器7个的生命周期 5.5 容器的进入5.6 怎么把宿主机的文件传入到容器内部5.6.1 linux 怎么复制 5.7 容器的导出与导入5.8 删除容器5.9 批量操作5.9.1 批量停止容器5.9.2 批量删除所有容器5.9.3 批量删除镜像5.9.4 删除none镜像5.9.5批量清理后台停止的容器 三.Docker 网络1.Docker 网络实现原理2.Docker 的网络模式2.1 Host2.1.1 概念2.1.2 安装Docker时它会自动创建三个网络bridge创建容器默认连接到此网络、 none 、host2.1.3 使用docker run创建Docker容器时可以用 --net 或 --network 选项指定容器的网络模式 2.2 Container2.2.1 概念2.2.2 创建指定名称2.2.3 查看容器进程号2.2.4 查看容器的进程、网络、文件系统等命名空间编号 2.3 none2.4 Bridge2.5 自定义网络2.5.1 创建自定义网络 四、docker的资源控制1.CPU 资源控制1.1 概念1.2 cgroups有四大功能1.3 设置CPU使用率上限1.4进行CPU压力测试1.5 设置50%的比例分配CPU使用时间上限1.6 设置CPU资源占用比设置多个容器时才有效1.6.1 两个容器测试cpu1.6.2 设置容器绑定指定的CPU 2.对内存使用的限制3.对磁盘IO配额控制blkio的限制3.1 创建容器并限制写速度3.2 生产扩展 一.docker容器概述
1.什么是容器
1Docker是在Linux容器里运行应用的开源工具是一种轻量级的“虚拟机”。
2是一个开源的应用容器引擎基于go语言开发并遵循了apache2.0协议开源。 3Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。
2. docker与虚拟机的区别
2.1 docker虚拟化产品有哪些及其对比
虚拟化架构分为两种
1寄居架构
寄居架构概念虚拟寄居架构指的是在真实的操作系统之上来安装虚拟化软件的虚拟化软件再去安装然后再在虚拟机上安装虚拟化操作系统它的稳定性不是很高当真实机器宕机之后虚拟操作系统都会宕机个人搭建较多。
Vmware、workstation个人在windows安装虚拟的VmFUSion个人机器MAC安装虚拟机Xen必须安装是基于HyperVision需要cpu、硬盘、内存安装安装内核软件kernel-xenKVMrehl 6自带的KVM全国5%~6%是开源的虚拟化产品称为完全虚拟化、装在linux操作系统之上Microsoft Hyper-V是微软自带的server2012、2016、2019都有docker即通过对应用组件的封装、发布、部署、运行等生命周期的管理达到应用组件级别的“一次封装到处运行”的目的。这里的组件既可以是一个应用也可以是一套服务甚至是一个完整的操作系统。
2原生架构
原生架构概念虚拟化原生架构在虚拟化直接安装到硬件上的不会依赖于操作系统这种架构一般应用在企业中因为相较于很安全
EXSIVmware、vsphere全虚拟化直接使用物理硬件性能高
2.2 Docker与虚拟机的区别
特性Docker容器虚拟机启动速度秒级分钟级计算能力损耗几乎无损耗 50%左右性能接近原生弱于系统支持量单机上千个几十个隔离性资源隔离/限制完全隔离
3.Docker容器的使用场景
1打包应用程序简化部署
2可脱离底层硬件任意迁移
4.Docker容器的优点
●灵活即使是最复杂的应用也可以集装箱化。 ●轻量级容器利用并共享主机内核。 ●可互换可以即时部署更新和升级。 ●便携式可以在本地构建部署到云并在任何地方运行。 ●可扩展可以增加并自动分发容器副本。 ●可堆叠可以垂直和即时堆叠服务。
5.Docker 的底层运行原理
1Linux 内核的容器化支持Docker 利用了 Linux 内核的一些特性如 cgroups (控制组)、namespace (命名空间)、以及文件系统的特殊挂载等技术实现了容器的隔离和资源控制。
2Docker 基于客户端(容器)-————服务端 (docker 引擎) 结构 的系统
3客户端 (容器) 通过socketIP端口向docker引擎发送相应的指令 docker服务器就会执行相应的命令
6.namespace的六项隔离
namespace系统调用参数隔离内容UTSCLONE_NEWUTS主机名与域名IPCCLONE_NEWWIPC信号量、消息队列和共享内存PIDCLONE_NEWPID进程编号NETWORKCLONE_NEWNET网络设备、网络栈、端口等MOUNTCLONE_NEWNS挂载点文件系统USERCLONE_NEWUSER用户和用户组3.8以后的内核才支持〉
7.Docker核心概念
1镜像
容器运行的基础包含运行应用的程序的所有内容资源、配置文件等
2容器
是从镜像创建的运行实例
3仓库
集中保存镜像的地方公有docker hub私有仓库docker
Docker 的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker
二.Docker安装 及管理
1.安装 Docker
目前 Docker 只能支持 64 位系统。
#关闭防火墙
systemctl stop firewalld.service
setenforce 0#安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2 注解
yum-utils提供了 yum-config-manager 工具。 device mapper 是Linux内核中支持逻辑卷管理的通用设备映射机制它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
#设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #安装 Docker-CE并设置为开机自动启动
yum install -y docker-ce docker-ce-cli containerd.io安装docker(ce表示社区版若需安装指定版本则–后跟版本)
yum install -y docker-ce-20.10.18 docker-ce-cli
systemctl start docker.service
systemctl enable docker.service 安装好的Docker系统有两个程序Docker服务端和Docker客户端。其中Docker服务端是一个服务进程负责管理所有容器。 Docker客户端则扮演着Docker服务端的远程控制器可以用来控制Docker的服务端进程。大部分情况下Docker服务端和客户端运行在一台机器上。
1.1 卸载docker
1卸载 Docker 客户端 (docker-ce-cli)
yum remove docker-ce-cli2卸载 Docker 引擎 (docker-ce) 以及其所依赖的存储库
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /etc/docker
rm -rf /var/lib/docker注以上命令会卸载 Docker 引擎以及删除相关配置和镜像包括所有容器和镜像请在卸载前备份需要保留的数据。
3如果想彻底删除所有 Docker 安装过程中产生的文件使用以下命令
rm -rf /var/lib/docker4卸载完毕后可以使用以下命令确认 Docker 是否已经不再运行
service docker status2.查看docker信息
#查看 docker 版本信息
docker version#docker 信息查看
docker info 注释
Client: Docker Engine - CommunityVersion: 24.0.5Context: defaultDebug Mode: falsePlugins:buildx: Docker Buildx (Docker Inc.)Version: v0.11.2Path: /usr/libexec/docker/cli-plugins/docker-buildxcompose: Docker Compose (Docker Inc.)Version: v2.20.2Path: /usr/libexec/docker/cli-plugins/docker-composeServer:Containers: 0 # 容器数量Running: 0Paused: 0Stopped: 0Images: 0 # 镜像数量Server Version: 24.0.5 # server 版本Storage Driver: overlay2 # docker 使用的是 overlay2 文件驱动Backing Filesystem: xfs # 宿主机上的底层文件系统Supports d_type: trueNative Overlay Diff: trueLogging Driver: json-fileCgroup Driver: cgroupfs # Cgroups 驱动Cgroup Version: 1Plugins:Volume: localNetwork: bridge host ipvlan macvlan null overlayLog: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslogSwarm: inactiveRuntimes: io.containerd.runtime.v1.linux runc io.containerd.runc.v2Default Runtime: runcInit Binary: docker-initcontainerd version: 269548fa27e0089a8b8278fc4fc781d7f65a939brunc version: ff819c7e9184c13b7c2607fe6c30ae19403a7affinit version: de40ad0Security Options:seccompProfile: defaultKernel Version: 3.10.0-693.el7.x86_64 # 宿主机的相关信息Operating System: CentOS Linux 7 (Core)OSType: linuxArchitecture: x86_64CPUs: 1Total Memory: 976.3MiBName: localhost.localdomainID: Y4ES:FTH2:ZJL7:MRVE:RJVB:WJIB:S7BV:C5IZ:LMBR:E4G5:QWSM:SNDTDocker Root Dir: /var/lib/docker # docker 数据存储目录Debug Mode: falseRegistry: https://index.docker.io/v1/ # registry 地址Labels:Experimental: falseInsecure Registries:127.0.0.0/8Registry Mirrors: # 加速站点https://6ijb8ubo.mirror.aliyuncs.com/Live Restore Enabled: false注如查看信息时末尾出现了以下
这些警告是 Docker 在启动时检测到 Linux 内核参数 bridge-nf-call-iptables 和 bridge-nf-call-ip6tables 被禁用了。这些内核参数用于在 Docker 容器与宿主机之间配置网络桥接。
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled解决方案 编辑 /etc/sysctl.conf 文件 sudo vi /etc/sysctl.conf将以下两个内核参数的值设置为 1 net.bridge.bridge-nf-call-ip6tables 1
net.bridge.bridge-nf-call-iptables 1保存并关闭文件。 使更改生效 sudo sysctl -p再次使用查看就没有了
docker info 3. 配置docker加速器
1打开阿里云官网登录
2点击左侧菜单栏搜索框输入容器镜像服务
3选择镜像工具镜像加速器复制命令配置即可配置完毕重新加载daemon然后重启docker。 mkdir -p /etc/dockertee /etc/docker/daemon.json -EOF
{registry-mirrors: [https://90b8orj3.mirror.aliyuncs.com]
}
EOFsystemctl daemon-reload
systemctl restart docker4.docker镜像相关基础命令
4.1 搜索镜像
搜索关键字的相关镜像内容
格式docker search 关键字
例如docker search nginx4.2 获取镜像
如果下载镜像时不指定标签则默认会下载仓库中最新版本的镜像即选择标签为 latest 标签。
格式docker pull 镜像名[:版本号]
例如docker pull nginx4.3 查看镜像信息
4.3.1 镜像下载后存放在 /var/lib/docker 。
Docker 相关的本地资源存放在 /var/lib/docker/ 目录下其中 containers 目录存放容器信息
image 目录存放镜像信息
overlay2 目录下存放具体的镜像底层文件。 4.3.2 查看下载的镜像文件信息
cat /var/lib/docker/image/overlay2/repositories.json4.3.3 查看下载到本地的所有镜像
[roottest7 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 19 months ago 141MB注解
REPOSITORY镜像属于的仓库 TAG镜像的标签信息标记同一个仓库中的不同镜像 IMAGE ID镜像的唯一ID 号唯一标识一个镜像 CREATED镜像创建时间
VIRTUAL SIZE镜像大小
4.3.4 根据镜像的唯一标识 ID 号获取镜像详细信息
格式docker inspect 镜像ID号
例如docker inspect 605c77e624dd4.3.5 本地的镜像添加新的标签
格式docker tag 名称:[标签] 新名称:[新标签]
例如docker tag nginx:latest nginx:web#查看新添加的标签
docker images
docker images | grep nginx4.4 删除docker镜像
格式
1docker rmi 仓库名称:标签 #当一个镜像有多个标签时只是删除其中指定的标签
2docker rmi 镜像ID号 #会彻底删除该镜像
注如果该镜像已经被容器使用正确的做法是先删除依赖该镜像的所有容器再去删除镜像。
例如
#仓库标签删除
docker rmi nginx:web
#ID号删除
docker rmi 605c77e624dd4.5 容器导出镜像存储
将镜像保存成为本地文件
格式docker save -o 保存目录 导出的镜像
#存出镜像命名为nginx存在当前目录下
docker save -o nginx nginx:latest ls -lh#指定保存目录
docker save -o /opt/nginx nginx:latest 4.6 导入镜像
将镜像文件导入到镜像库中
格式 1docker load 本地存储的镜像名称 2docker load -i 本地存储的镜像名称
例如
#镜像在当前目录
docker load nginx
#不在当前目录需添加目录
docker load -i /opt/nginx4.7 上传镜像到官方公共仓库
默认上传到 docker Hub 官方公共仓库需要注册使用公共仓库的账号。https://hub.docker.com 可以使用 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。 在上传镜像之前还需要先对本地镜像添加新的标签然后再使用 docker push 命令进行上传。
docker tag nginx:latest soscscs/nginx:web #添加新的标签时必须在前面加上自己的dockerhub的username docker login #登录公共仓库 Usernamesoscscs passwordabc123456 docker push soscscs/nginx:web #上传镜像
5.Docker 容器相关基础命令
5.1 查看docker容器进程、运行状态
显示up的进程加-a表示显示所有状态容器
格式docker ps [选项]
常用选项
-a显示所有状态容器 5.2 创建docker容器
就是将镜像加载到容器的过程。
新创建的容器默认处于停止状态不运行任何程序需要在其中发起一个进程来启动容器。
格式docker create [选项] 镜像 常用选项 -i让容器开启标准输入 -t让 Docker 分配一个伪终端 tty -it :合起来实现和容器交互的作用运行一个交互式会话 shell
docker create -it nginx:latest5.3 管理docker容器
开启或关闭docker容器
格式docker start/stop 容器唯一id/容器名称
docker start e785459638d9
docker stop e785459638d9
docker ps -a5.4 docker run的运行过程
创建并启动docker容器 1格式docker run [选项] 镜像名/镜像唯一id /bin/bash
常用选项
-d 选项让 Docker 容器以守护形式在后台运行并且容器所运行的程序不能结束
-it :合起来实现和容器交互的作用运行一个交互式会话 shell
–name指定创建的容器的名称
相当于先执行 docker create 命令再执行 docker start 命令。 注意容器是一个与其中运行的 shell 命令共存亡的终端命令运行容器运行 命令结束容器退出。
docker create -it nginx:latest /bin/bash2运行过程
检查本地是否存在指定的镜像。当镜像不存在时会从公有仓库下载利用镜像创建并启动一个容器分配一个文件系统给容器在只读的镜像层外面挂载一层可读写层从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中分配一个地址池中的 IP 地址给容器执行用户指定的应用程序执行完毕后容器被终止运行。
docker run centos:7 /usr/bin/bash -c ls /
#会发现创建了一个新容器并启动执行一条 shell 命令之后就停止了
docker ps -a 3在后台持续运行 docker run 创建的容器 需要在 docker run 命令之后添加 -d 选项让 Docker 容器以守护形式在后台运行。并且容器所运行的程序不能结束。
docker run -d centos:7 /usr/bin/bash -c while true;do echo hello;done#可以看出容器始终处于 UP运行状态
docker ps -a #创建容器并持续运行容器
docker run -itd --name test1 centos:7 /bin/bash 5.4.1 docker 容器7个的生命周期
1create已创建还未运行的容器
2running正在运行中的容器
3restarting容器正在重启中
4removing容器正在迁移中
5paused容器已暂停的状态
6exited停止容器运行
7dead死亡主要是操作系统出现异常或断点导致
8暂停和停止状态的区别 paused 命令挂起指定的容器中的所有进程为暂停 stop表示杀掉正在运行的docker容器进程默认是10s后
5.5 容器的进入
需要进入容器进行命令操作时可以使用 docker exec 命令进入运行着的容器。
格式docker exec -it 容器ID/名称 /bin/bash
常用选项
-i 选项表示让容器的输入保持打开 -t 选项表示让 Docker 分配一个伪终端。
#进入容器前确保容器正在运行
docker start e785459638d9
docker exec -it e785459638d9 /bin/bash
ls
#退出容器后容器仍在运行
exit
docker ps -a#不加 -d 选项会创建容器后直接进入容器但是退出容器容器也会停止
docker run -it centos:7 bash 5.6 怎么把宿主机的文件传入到容器内部
5.6.1 linux 怎么复制
格式cp 原文件路径目标文件路径 docker cp l opt / abc容器id: /opt/abc
1复制到容器中
[roottest7 opt]# echo abc123 test.txt[roottest7 opt]# cat test.txt
abc123[roottest7 opt]# docker cp test.txt e785459638d9:/home/
Successfully copied 2.05kB to e785459638d9:/home/查看复制是否成功
[roottest7 opt]# docker exec -it e785459638d9 /bin/bash
roote785459638d9:/# ls
bin docker-entrypoint.d home media proc sbin tmp
boot docker-entrypoint.sh lib mnt root srv usr
dev etc lib64 opt run sys var
roote785459638d9:/# cd /home/
roote785459638d9:/home# ls
test.txt
roote785459638d9:/home# cat test.txt
abc1232从容器复制文件到主机
roote785459638d9:/opt# echo qwerty test1.txt
roote785459638d9:/opt# cat test1.txt
qwerty
roote785459638d9:/opt# exit
exit
[roottest7 opt]# docker cp e785459638d9:/opt/test1.txt /opt/
Successfully copied 2.05kB to /opt/
[roottest7 opt]# ls
containerd nginx rh test1.txt test.txt
[roottest7 opt]# cat test1.txt
qwerty5.7 容器的导出与导入
用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中可以使用docker export 命令将已经创建好的容器导出为文件无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器通过相应的导入命令实现容器的迁移。
1导出格式docker export 容器ID/名称 文件名
docker export 11b7fd33c415 centos7.tar2导入格式cat 文件名 | docker import – 镜像名称:标签
#run一个新的nginx
[roottest7 opt]# docker run -itd nginx /bin/bash
c588fc4b47059331fe56605067dee867290b482df18491ac7123d8dfa1851003
[roottest7 opt]# docker ps -a[roottest7 opt]# ls
centos7.2023.8.15tar centos7.tar containerd nginx rh test1.txt test.txt
#导入后会生成镜像但不会创建容器
[roottest7 opt]# cat centos7.2023.8.15tar | docker import - centos7:test
sha256:c5e4c3a170cdd7f8aa34559ff293a59858b7918912a74dbf1b8261e19a4c209d[roottest7 opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7 test c5e4c3a170cd 25 seconds ago 140MB 5.8 删除容器
格式docker rm [-f] 容器ID/名称
docker stop c588fc4b4705
docker rm c588fc4b4705 #删除已经终止状态的容器
docker rm -f c588fc4b4705 #强制删除正在运行的容器5.9 批量操作
5.9.1 批量停止容器
docker ps -a | awk NR2{print docker stop $1} | bash
docker ps -a | awk NR2{print $1}| xargs docker stop5.9.2 批量删除所有容器
docker ps -a | awk NR2{print docker rm $1} | bash
docker ps -a | awk NR2{print $1}| xargs docker rm5.9.3 批量删除镜像
docker images | awk NR2{print docker rmi $3} | bash 5.9.4 删除none镜像
docker images | grep none | awk {print $3} | xargs docker rmi 5.9.5批量清理后台停止的容器
docker rm $(docker ps -a -q) 三.Docker 网络
1.Docker 网络实现原理
Docker使用Linux桥接在宿主机虚拟一个Docker容器网桥(docker0)Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址称为Container-IP同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥这样容器之间就能够通过容器的 Container-IP 直接通信。
Docker网桥是宿主机虚拟出来的并不是真实存在的网络设备外部网络是无法寻址到的这也意味着外部网络无法直接通过 Container-IP 访问到容器。如果容器希望外部访问能够访问到可以通过映射容器端口到宿主主机端口映射即 docker run 创建容器时候通过 -p 或 -P 参数来启用访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。
docker run -d --name test1 -P nginx #随机映射端口从49153开始
docker ps -a#指定映射端口
docker run -d --name test3 -p 50001:80 nginx
docker ps -a浏览器访问http://192.168.198.17:50001 、http://192.168.198.17:49153 #查看容器的输出和日志信息
格式docker logs 容器的ID/名称
docker logs f45ac0f9a1222.Docker 的网络模式
2.1 Host
2.1.1 概念
1容器将不会虚拟出自己的网卡配置自己的IP等而是使用宿主机的IP和端口。
2相当于Vmware中的桥接模式与宿主机在同一个网络中但没有独立IP地址。 3Docker使用了Linux的Namespaces技术来进行资源隔离如PID Namespace隔离进程Mount Namespace隔离文件系统Network Namespace隔离网络等。 4一个Network Namespace提供了一份独立的网络环境包括网卡、路由、iptable规则等都与其他的Network Namespace隔离。 一个Docker容器一般会分配一个独立的Network Namespace。 但如果启动容器的时候使用host模式那么这个容器将不会获得一个独立的Network Namespace 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡、配置自己的IP等而是使用宿主机的IP和端口。
2.1.2 安装Docker时它会自动创建三个网络bridge创建容器默认连接到此网络、 none 、host
#查看docker网络列表
docker network ls 或 docker network list 2.1.3 使用docker run创建Docker容器时可以用 --net 或 --network 选项指定容器的网络模式
●host模式使用 --nethost 指定。 ●none模式使用 --netnone 指定。 ●container模式使用 --netcontainer:NAME_or_ID 指定。 ●bridge模式使用 --netbridge 指定默认设置可省略。
2.2 Container
2.2.1 概念
1创建的容器不会创建自己的网卡配置自己的IP而是和一个指定的容器共享IP、端口范围。
2这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace而不是和宿主机共享。新创建的容器不会创建自己的网卡配置自己的IP而是和一个指定的容器共享IP、端口范围等。同样两个容器除了网络方面其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
2.2.2 创建指定名称
#--name 选项可以给容器创建一个自定义名称
docker run -itd --name test1 centos:7 /bin/bash
docker ps -a 2.2.3 查看容器进程号
#查看容器进程号
docker inspect -f {{.State.Pid}} 3ed82355f811 2.2.4 查看容器的进程、网络、文件系统等命名空间编号
#查看容器的进程、网络、文件系统等命名空间编号
ls -l /proc/89198/ns docker run -itd --name test2 --netcontainer:1a29ed506da4 centos:7 /bin/bash
docker ps -a docker inspect -f {{.State.Pid}} 20dc47e95e6a
91161
#查看可以发现两个容器的 net namespace 编号相同
ls -l /proc/91161/ns 2.3 none
1该模式关闭了容器的网络功能。
2使用none模式Docker容器拥有自己的Network Namespace但是并不为Docker容器进行任何网络配置。 也就是说这个Docker容器没有网卡、IP、路由等信息。这种网络模式下容器只有lo回环网络没有其他网卡。这种类型的网络没有办法联网封闭的网络能很好的保证容器的安全性。
2.4 Bridge
1默认为该模式此模式会为每一个容器分配、设置IP等并将容器连接到一个docker0虚拟网桥通过docker0网桥以及iptables nat 表配置与宿主机通信。
2相当于Vmware中的 nat 模式容器使用独立network Namespace并连接到docker0虚拟网卡。通过docker0网桥以及iptables nat表配置与宿主机通信此模式会为每一个容器分配Network Namespace、设置IP等并将一个主机上的 Docker 容器连接到一个虚拟网桥上。
2.5 自定义网络
#直接使用bridge模式是无法支持指定IP运行docker的例如执行以下命令就会报错
docker run -itd --name test3 --network bridge --ip 172.17.0.10 centos:7 /bin/bash
2.5.1 创建自定义网络
#可以先自定义网络再使用指定IP运行docker
docker network create --subnet172.18.0.0/16 --opt com.docker.network.bridge.namedocker1 mynetwork
注解
docker1 为执行 ifconfig -a 命令时显示的网卡名如果不使用 --opt 参数指定此名称那在使用 ifconfig -a 命令查看网络信息时看到的是类似 br-110eb56a0b22 这样的名字这显然不怎么好记。 mynetwork 为执行 docker network list 命令时显示的bridge网络模式名称。
#运行
docker run -itd --name test4 --net mynetwork --ip 172.18.0.10 centos:7 /bin/bash 四、docker的资源控制
1.CPU 资源控制
1.1 概念
cgroups是一个非常强大的linux内核工具他不仅可以限制被 namespace 隔离起来的资源 还可以为资源设置权重、计算使用量、操控进程启停等等。 所以 cgroupsControl groups实现了对资源的配额和度量。
1.2 cgroups有四大功能
●资源限制可以对任务使用的资源总额进行限制 ●优先级分配通过分配的cpu时间片数量以及磁盘IO带宽大小实际上相当于控制了任务运行优先级 ●资源统计可以统计系统的资源使用量如cpu时长内存用量等 ●任务控制cgroup可以对任务执行挂起、恢复等操作
1.3 设置CPU使用率上限
Linux通过CFSCompletely Fair Scheduler完全公平调度器来调度各个进程对CPU的使用。CFS默认的调度周期是100ms。 我们可以设置每个容器进程的调度周期以及在这个周期内各个容器最多能使用多少 CPU 时间。
使用 --cpu-period 即可设置调度周期使用 --cpu-quota 即可设置在每个周期内容器能使用的CPU时间。两者可以配合使用。 CFS 周期的有效范围是 1ms~1s对应的 --cpu-period 的数值范围是 1000~1000000。 周期100毫秒 而容器的 CPU 配额必须不小于 1ms即 --cpu-quota 的值必须 1000。
docker run -itd --name test5 centos:7 /bin/bash
cd /sys/fs/cgroup/cpu/docker/
ls
cd 04cebd503002e7725beb25d4424e0eaa0aaa7a8019b9050d9911607c535da896
cat cpu.cfs_quota_us cat cpu.cfs_period_us 注解
cpu.cfs_period_uscpu分配的周期(微秒所以文件名中用 us 表示默认为100000。 cpu.cfs_quota_us表示该cgroups限制占用的时间微秒默认为-1表示不限制。 如果设为50000表示占用50000/10000050%的CPU。
1.4进行CPU压力测试
docker exec -it 1a29ed506da4 /bin/bash
vi /cpu.sh
#!/bin/bash
i0
while true
do
let i
done
chmod x /cpu.sh
./cpu.sh
#可以看到这个脚本占了很多的cpu资源
top 1.5 设置50%的比例分配CPU使用时间上限
#可以重新创建一个容器并设置限额
docker run -itd --name test6 --cpu-quota 50000 centos:7 /bin/bash
#或者进入修改
cd /sys/fs/cgroup/cpu/docker/1a29ed506da4dc4c41179b38e2175a3a5d8a02f55c833f5992536d850dc404a4/
echo 50000 cpu.cfs_quota_us
docker exec -it 1a29ed506da4 /bin/bash
./cpu.sh #可以看到cpu占用率接近50%cgroups对cpu的控制起了效果
top 1.6 设置CPU资源占用比设置多个容器时才有效
Docker 通过 --cpu-shares 指定 CPU 份额默认值为1024值为1024的倍数。
1.6.1 两个容器测试cpu
1创建两个容器为 c1 和 c2若只有这两个容器设置容器的权重使得c1和c2的CPU资源占比为1/3和2/3。
docker run -itd --name c1 --cpu-shares 512 centos:7
docker run -itd --name c2 --cpu-shares 1024 centos:7
2分别进入容器进行压力测试 c1:
docker exec -it eb2c65e90789 /bin/bash
vi /cpu.sh
#!/bin/bash
i0
while true
do
let i
done
chmod x /cpu.sh
./cpu.sh
另开终端
c2:
docker exec -it d32f1cdfafe2 /bin/bash
vi /cpu.sh
#!/bin/bash
i0
while true
do
let i
done
chmod x /cpu.sh
./cpu.sh
另开终端
yum install -y epel-release
yum install -y stress
#产生四个进程每个进程都反复不停的计算随机数的平方根
stress -c 4
3另开终端查看容器运行状态动态更新
docker stats 1.6.2 设置容器绑定指定的CPU
1先分配虚拟机4个CPU核数
docker run -itd --name test7 --cpuset-cpus 1,3 centos:7 /bin/bash
2进入容器进行压力测试
yum install -y epel-release
yum install stress -y
stress -c 4
docker exec -it d32f1cdfafe2 /bin/bash
vi /cpu.sh
#!/bin/bash
i0
while true
do
let i
done
chmod x /cpu.sh
./cpu.sh
另开终端 3退出容器执行 top 命令再按 1 查看CPU使用情况。
2.对内存使用的限制
1-m(–memory) 选项用于限制容器可以使用的最大内存
docker run -itd --name test8 -m 512m centos:7 /bin/bash
docker stats 2限制可用的 swap 大小 --memory-swap 强调一下–memory-swap 是必须要与 --memory 一起使用的。
正常情况下–memory-swap 的值包含容器可用内存和可用 swap。 所以 -m 300m --memory-swap1g 的含义为容器可以使用 300M 的物理内存并且可以使用 700M1G - 300的 swap。
如果 --memory-swap 设置为 0 或者 不设置则容器可以使用的 swap 大小为 -m 值的两倍。 如果 --memory-swap 的值和 -m 值相同则容器不能使用 swap。 如果 --memory-swap 值为 -1它表示容器程序使用的内存受限而可以使用的 swap 空间使用不受限制宿主机有多少 swap 容器就可以使用多少。
3.对磁盘IO配额控制blkio的限制
–device-read-bps限制某个设备上的读速度bps数据量单位可以是kb、mb(M)或者gb。 例
docker run -itd --name test9 --device-read-bps /dev/sda:1M centos:7 /bin/bash
dd if/dev/zero oftest.out bs1M count10 oflagdirect
–device-write-bps 限制某个设备上的写速度bps数据量单位可以是kb、mb(M)或者gb。 例
docker run -itd --name test11 --device-write-bps /dev/sda:1mb centos:7 /bin/bash
dd if/dev/zero oftest.out bs1M count10 oflagdirect
–device-read-iops 限制读某个设备的iops次数
–device-write-iops 限制写入某个设备的iops次数
3.1 创建容器并限制写速度
docker run -it --name test10 --device-write-bps /dev/sda:1MB centos:7 /bin/bash
#通过dd来验证写速度
#添加oflag参数以规避掉文件系统cache
dd if/dev/zero oftest.out bs1M count10 oflagdirect 100 records in
100 records out
10485760 bytes (10 MB) copied, 10.0025 s, 1.0 MB/s
#清理docker占用的磁盘空间
docker system prune -a #可以用于清理磁盘删除关闭的容器、无用的数据卷和网络 停止的容器已被清理
3.2 生产扩展
故障由于docker容器故障导致大量日志集满会造成磁盘空间满 解决方案 1、清除日志
#!/bin/bash
logs$ (find /var/lib/docker/containers/ -name *-json.log*)
for log in $logs
do
cat /dev/null $log
done
2、当日志占满之后如何处理 ###设置docker日志文件数量及每个日志大小 vim /etc/docker/daemon.json
{
registry-mirrors: [http://f613ce8f.m.daocloud.io]
log-driver: json-file, #我的一日志格式
log-opts: { max-size : 500m, max-file : 3} #日志的参数最大500M 我最大容器中有三个日志文件 每个日志文件大小是500M
}
#修改完需要重新加载 systemctl daemon-reload
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/910702.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!