docker
(一)docker的基本管理和概念
1、docker:是开源的应用容器引擎,基于go语言开发的,运行在Linux系统当中的开源的、轻量级的“虚拟机”
2、docker的容器技术可以在一台主机上、轻松的为任何应用创建一个轻量级的、可移植的,自给自足的容器
3、docker的宿主机是Linux系统,集装箱可以理解为互相隔离的容器(组件、应用程序APP),每个容器都是一个独立的应用程序
4、docker的设计宗旨:build、ship and run any app, anywhere
(1)build:封装好的程序,只要部署即可使用,一次封装
(2)ship and run any app:一次封装完成之后的程序,可以在任何环境运行
(3)anywhere:任意宿主机
(4)build、ship and run any app, anywhere:一次封装、到处运行
(5)流程:封装、发布、部署、运行、维护、运行、销毁(可以以一整套的方式管理运用程序的生命周期)
(二)docker的特点
1、灵活,再复杂的应用也可以实现容器化
2、轻量级,小型的、不完整的,最小化封装的程序,与宿主机共享内核
3、可互换,可以随时的升级、更新
4、便携式,本地可以构建,在云平台也可以实现部署,在任何地方运行
5、可扩展,自动分发容器副本
6、可堆叠,在一个宿主机上可以创建不同版本的同一容器,也可以是多个相同版本的同一容器
(1)基于Linux的命名空间:namespace,是一种内核特性,允许将一组系统的资源隔离,在一个命名空间中的进程在系统中可以拥有独立的资源
(2)重点:namespace的六项隔离措施
基于这个六个隔离项,实现了容器和容器之间,以及容器和宿主机之间的资源隔离
命名空间 | 系统调用参数 | 隔离内容 |
UTS | CLONE_NEWUTS | 隔离主机和域名 在UTS这个命名空间创建进程,进程可以看到自己的主机名和域名,与其他进程分隔开 |
IPC | CLONE_NEWIPC | 隔离信号量、消息队列、共享内存 在IPC这个命名空间之中,进程可以拥有独立的进程间通信资源 |
PID | CLONE_NEWPID | 每个进程都有自己独立的进程号空间 |
network | CLONE_NEWNET | 隔离网络设备、网络栈、端口 每个进程都有一个自己独立的网络资源(端口号) |
mount | CLONE_NEWNS | 隔离挂载点 在mount这个命名空间之中,每个进程或者设备都有自己的文件系统挂载点,相互之间互不干扰 |
user | CLONE_NEWUSER | 隔离不同的用户和用户组 |
(三)docker的核心组件
1、镜像:是docker的基础,最小单位,类似于虚拟机的ISO文件。
(1)一个镜像就是一个可执行的包,包里面包含了运行这个程序的所有内容(代码、配置文件、环境变量)
(2)docker镜像也是一个压缩包,不是一个解压的文件,是一个环境部署的脚本,基本包含了完整的操作系统
2、容器:docker的容器就是基于镜像运行起来的实例,可以启动,停止,删除,每个容器的都是相互隔离的,互不可见
3、仓库:保存镜像,所有的镜像都是从仓库当中拉去的,镜像也保存在仓库之中
(1)可以有共有仓库、私有仓库
(2)下载到了本地:镜像、容器、日志都默认存储在/var/lib/docker(宿主机)
(四)docker与虚拟机之间的区别(重点)
特性 | docker | 虚拟机 |
启动速度 | 秒级 | 分钟级 |
计算能力损耗(占CPU) | 几乎无 | 损耗50% |
性能 | 接近于原生系统 | 弱于原生系统 |
系统支持量 | 上千个 | 硬件系统来看(几十个) |
隔离性 | 资源隔离 | 完全隔离 |
安全性 | 安全性差 | 安全性高 |
mysql、redis等不会用docker和k8s(核心数据不会上云、还是部署在本地)
(五)部署docker(2核4G,硬盘300G)
1、安装相关依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-utils:提供一个yum-config-manager工具,可以远程自定义获取yum源
device-mapper-persistent-data lvm2
device-mapper:进行逻辑卷管理的通用设备的映射机制、lvm
2、设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3、安装组件
yum install -y docker-ce docker-ce-cli containerd.io
docker-ce | docker的社区办,免费,面向开发者,小型团队和个人使用 |
docker-ce-cli | 提供docker的命令行工具 |
contarnerd.io | 负责管理容器的生命周期(创建、运行、停止、运行、销毁) |
systemctl start docker.service
systemctl enable docker.service
3、docker的相关命令
(1)docker version:查看docker的版本(docker24版本)
docker只能支持64位系统
(2)docker info:查看docker的所有信息
docker安装完毕之后,客户端和服务端都在一起,都运行在一台机器上
overlay2:docker使用的文件系统驱动 | |
overlayFS | overlay file system:联合文件系统,用于适配宿主机的文件系统,可以自动适配 |
lowerDir | 底层目录,docker的底层文件系统,是一个或者多个镜像文件的根文件系统 |
UpperDir | 可写目录,可以在容器运行时,在容器内进行写操作,实现容器的可写性 |
MergeDir | 合并目录,合并lowerDir和UpperDir,就是容器的文件系统,用户看到的也就是这个合并的视图 |
WorkDir | 工作目录,处理文件系统变更,当在容器内进行写操作时,overlayFS使用WorkDir来跟踪文件系统的变更 |
(六)对docker的镜像和容器的增删改查
docker的增删改查 | |||
查看docker的版本 | docker version | ||
查看docker的所有信息 | docker info | ||
停止容器 | docker stop 容器名/ID | ||
重启容器 | docker restart 容器名/ID | ||
搜索镜像 | docker search 镜像名称 | ||
获取镜像(镜像拉取) | docker pull 镜像名称 docker pull centos docker pull centos:7 | ||
查看下载的镜像 | docker images | ||
查看镜像的详细信息 | docker inspect 镜像名称/镜像ID docker inspect centos:7(镜像名) docker inspect 5d0da3dc9764(镜像ID) | ||
给镜像打上不同的标签 | docker tag?centos:latest centos:new (标签—硬链接、复制了源镜像) | ||
删除镜像 | docker rmi 镜像名称/镜像ID docker rmi centos:new docker rmi -f 5d0da3dc9764(强制删除) | ||
把镜像保存为本地文件 (镜像导出) | docker save -o /opt/xx.tar 镜像名称/镜像ID docker save -o /opt/centos.tar centos:7 docker save -o /opt/centos1.tar 5d0da3dc9764 | ||
将镜像文件导入到镜像库中(镜像导入) | docker load -i centos.tar | ||
上传镜像(先添加标签、再上传镜像) | docker tag centos:latest hydedidi/centos:hyde docker login(登录公用仓库) docker push hydedidi/centos:hyde(上传镜像) | ||
基于镜像创建容器 | docker create?-it centos:7 /bin/bash | ||
查看容器 | 查看正在运行的容器 | docker ps | |
查看所有的容器 | docker ps -a | ||
启动容器 | docker start 容器名称/ID docker start friendly_bardeen docker start 0d9aef184f4a | ||
进入正在运行的容器 | docker exec -it 容器名称/ID bash docker exec -it 0d9aef184f4a bash docker exec -it friendly_bardeen bash | ||
同时创建和运行容器(且未创建镜像) | docker run -itd?--name hyde1 nginx /bin/bash | ||
把文件从容器中复制到主机 | docker cp hyde1:/etc/nginx/nginx.conf?/opt/ | ||
把主机的文件复制回容器 | docker cp /opt/nginx.conf?hyde1:/etc/nginx/ | ||
容器导出为快照文件(xx.tar格式的文件名) | docker export -o nginx.tar hyde1 docker export hyde1 > nginx1.tar (不指定目录,默认是当前目录) docker export -o /opt/data/nginx.tar hyde1 docker export hyde1 > ?/opt/data/nginx.tar | ||
容器导入(导入为镜像) | docker import nginx.tar -- nginx:hyde2(镜像名称:标签名) 标签名不能重复,否则会出现none | ||
删除容器 | 删除未在运行的容器 | docker rm test1(容器名/ID) | |
删除正在运行的容器 | docker rm -f?test1 | ||
先停止:docker?stop test1 | |||
再删除:docker rm test1 | |||
批量操作 | 批量停止容器: docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash | ||
批量删除后台停止的容器: docker rm $(docker ps -a -q) | |||
批量删除所有容器(先停再删、慎用): docker ps -a | awk 'NR>=2{print $1}'| xargs docker rm | |||
批量删除none镜像(推荐): docker images | grep "none" | awk '{print $3}' | xargs docker rmi -f | |||
docker的网络模式 | bridge模式,默认桥接模式,在创建docker时不需要指定网络类型 | ||
host模式,容器将不会虚拟出自己的网卡、IP地址,全部使用宿主机的IP地址和端口 | |||
container模式,容器和容器之间共用一个ip和端口,不能同时起 | |||
none模式:没有网卡、ip、路由,只有本地lo回环网络(127.0.0.1),容器不可以联网 | |||
自定义网络:自定义网络在创建容器时,可以给容器指定ip地址(可以给docker创建一个自己定义的网段) | |||
随机分配端口 | docker run -itd --name hyde1?-P?nginx /bin/bash | ||
指定分配端口 | docker run -itd --name hyde4?-p 4300:80?nginx:1.22.0 /bin/bash | ||
查看日志 | docker run -itd --name hyde3 -P nginx(创建容器时不加/bin/bash) | ||
查看日志 | docker logs hyde3(容器名/ID) | ||
动态查看 | docker logs -f hyde3 | ||
从尾部查看10条 | docker logs --tail=10 hyde3 | ||
动态从尾部查看10条 | docker logs --tail=10 -f hyde3 | ||
创建host模式 (使用宿主机的ip和端口) | docker run -itd --name hyde4 --network host(网络模式) nginx /bin/bash | ||
创建container模式 (容器和容器之间共用一个ip和端口) | docker run -itd --name hyde5 --network=container:hyde1?nginx /bin/bash | ||
创建none模式 | docker run -itd --name hyde6 --network=none?nginx /bin/bash | ||
查看docker的网络 | docker network ls | ||
删除docker网络 | docker network rm 网络名称 | ||
创建自定义网段 | 先创建自定义网络: docker network create?--subnet=172.18.0.0/16?--opt "com.docker.network.bridge.name"="docker1"?mynetwork | ||
再在创建容器时指定IP地址: docker run -itd --name hyde3 --network mynetwork --ip 172.18.0.10?nginx /bin/bash | |||
宿主机和容器实现数据共享 | 创建容器+数据卷(-v): docker run -itd --name hyde1 -v /opt/test1:/opt/test?centos:7 /bin/bash | ||
设置容器的挂载目录为只读模式: docker run -itd --name hyde2 -v /opt/test2:/opt/test1:ro?centos:7 /bin/bash | |||
容器和容器之间实现数据共享 | docker run -itd --name hyde3 -v /opt/data1 -v /opt/data2?centos:7 /bin/bash | ||
创建交互: docker run -itd --volumes-from hyde3?--name hyde4 centos:7 /bin/bash | |||
容器互联 (两个容器之间实现网络通信,network模式不需要做映射) | docker run -itd -P?--name test11 --network=mynetwork?centos:7 /bin/bash docker run -itd -P --name test22 --network=mynetwork centos:7 /bin/bash | ||
指定端口创建数据库容器 | docker run -itd --name mysql1?-p 33066:3306?-v /log/mysql_log:/var/log/mysql?-e MYSQL_ROOT_PASSWORD=123456?mysql:5.7.20 | ||
cat cpu.cfs_period_us | 100000 | ||
cat cpu.cfs_quota_us | -1 | ||
CPU的资源控制: | |||
创建容器时限制占用CPU的时间 | docker run -itd --name test2 --cpu-quota 40000?centos:7 /bin/bash | ||
设置容器占用cpu的权重比 (多个容器才能生效) | docker run -itd --name test3 --cpu-shares 512?centos:7 /bin/bash docker run -itd --name test4 --cpu-shares 1024?centos:7 /bin/bash | ||
设置容器绑定cpu | docker run -itd --name test5 --cpuset-cpus 0,2?centos:7 /bin/bash | ||
内存的资源控制: | |||
创建容器时限制内存 | docker run -itd --name test6 -m 512m?centos:7 /bin/bash | ||
--(了解): | |||
docker run -itd --name test7 -m 512m --memory-swap=1g?centos:7 /bin/bash | |||
磁盘I/O的资源限制(了解): | |||
限制容器在磁盘上的读速度 | docker run -itd --name test8 --device-read-bps /dev/sda:1M?centos:7 /bin/bash | ||
限制容器在磁盘上的写速度 | docker run -itd --name test9 --device-write-bps /dev/sda:1mb?centos:7 /bin/bash | ||
限制容器读取的次数 | docker run -itd --name test1?--device-read-iops /dev/sda:100?centos:7 /bin/bash(每秒读100次) | ||
限制容器写入的次数 | docker run -itd --name test2 --device-write-iops /dev/sda:50?centos:7 /bin/bash(每秒写50次) | ||
清理docker占用的磁盘空间 | docker system prune -a | ||
占用CPU的时间10000,占用CPU的权重256,占用内存1G,只能使用CPU1 CPU1docker run -itd --name centos1 --cpu-quota 10000?--cpu-shares 256?-m 1g --cpuset-cpus 1?centos:7 /bin/bash |
1、搜索镜像:docker search 镜像名称
name | 表示镜像名称 |
DESCRIPTION | 描述信息 |
stars | 好评数量 |
OFFICIAL | 表示官方镜像 |
AUTOMATED | 是否是自动化构建 |
3、获取镜像(镜像拉取):docker pull 镜像名称
什么都不加,默认是centos的最近版本
(1)指定版本下载:docker pull centos:7
4、查看下载的镜像:docker images
REPOSITORY | 镜像所属的仓库 |
TAG | 标签,可以理解为版本,标记一个仓库的不同镜像 |
IMAGE ID | 镜像的唯一标识,不会重复 |
CREATED | 镜像的创建时间 |
SIZE | 镜像的大小 |
5、查看镜像的详细信息:docker inspect 镜像名称/镜像ID
6、给镜像打上不同的标签:docker tag centos:latest centos:new
标签的作用:相当于硬链接(复制了源镜像)
7、删除镜像:docker rmi?镜像名称/镜像ID
docker rmi?-f 5d0da3dc9764(强制删除)
(1)一个镜像如果有多个标签,删除的只是标签。如果只剩最后一个,删除的就是镜像本身
(2)如果镜像已经被容器使用,要先停容器,再删除容器,最后再删除镜像
(3)删除了在运行的容器的镜像,对容器会有影响吗
8、把镜像保存为本地文件:docker save -o /opt/xx.tar 镜像名称/镜像ID(镜像导出)
9、将镜像文件导入到镜像库中(镜像导入):docker load -i centos.tar
10、上传镜像(先添加标签、再上传镜像)
11、基于镜像创建容器:docker create -it centos:7 /bin/bash
-i | 表示让容器开启标准输入,用于接受用户的输入命名 |
-t | 给这个容器分配一个终端,这是一个虚拟的伪终端 |
-it | 形成一个宿主机和容器之间的一个可以交互的shell命令行 |
12、查看容器
(1)docker ps:查看正在运行的容器
(2)docker ps -a :查看所有的容器(运行的和未运行的)
CONTAINER ID | 容器的ID号 |
IMAGE ? | 加载的镜像 |
COMMAND ? | 运行的程序 |
CREATED | 创建时间 |
STATUS | 当前的状态 |
PORTS | 端口映射 |
NAMES | 名称 |
13、启动容器:docker start 容器名称/ID
14、进入正在运行的容器:docker exec -it 容器名称/ID bash
15、同时创建和运行容器:docker run -itd --name hyde1?nginx /bin/bash
基于nginx安装的最小化的带有nginx功能的程序
只要run,无论对错,都会创建
-d | 可以让创建的容器以守护进程在后台运行,容器所运行的程序不会结束 |
(2)运行的程序是 /bin/bash,和-d结合,给容器一个持续运行的命令,若后台没有指令,容器没有可运行的程序,将会直接退出 | |
-it | 形成交互式会话 |
-d | 后台运行 /bin/bash |
--name | 给容器命名 |
nginx:1.22.0 | 镜像名称和标签,如果本地没有,可以自动下载(不指定,默认最新版本) |
16、把文件从容器中复制到主机:docker cp hyde1:/etc/nginx/nginx.conf /opt/
17、把主机的文件复制回容器:docker cp /opt/nginx.conf hyde1:/etc/nginx/
18、容器导出和导入(docker export/import)
(1)用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export 命令将已经创建好的容器导出为容器快照文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。
①导出的容器还是一个镜像,必须run 或create才能成为容器
②已经配置好的导出的容器镜像,可以直接创建、运行使用(在工作,我们使用的都是开发已经设置、配置好的容器镜像)
③docker的特性:即使在创建过程中报错,容器还是会被创建,但是这个容器不可用
④导入镜像或者导入容器镜像,如果标签和已有标签重复,导入的镜像或者容器镜像,tag这一项就会变成none
(2)容器导出为快照文件:docker export -o nginx.tar(xx.tar格式的文件名) hyde1
(3)容器导入(导入为镜像):docker import nginx.tar -- nginx:hyde2(镜像名称:标签名)标签名不能重复
19、删除容器:
20、批量操作
(1)批量停止容器(不要使用):docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash
(2)批量删除后台停止的容器:docker rm $(docker ps -a -q)
(3)批量删除所有容器(先停再删、慎用):docker ps -a | awk 'NR>=2{print $1}'| xargs docker rm
(4)批量删除none镜像(推荐):docker images | grep "none" | awk '{print $3}' | xargs docker rmi -f
(七)docker网络(重点)
1、docker的网络模式(重点)
(1)bridge模式,默认桥接模式,在创建docker时不需要指定网络类型,默认就是bridge
(2)host模式,容器将不会虚拟出自己的网卡,也没有自己的ip地址,全部使用宿主机的IP地址和端口
①特点:公用模式,如果是单个容器运行,可以使用host模式
(3)container模式,容器和容器之间共用一个ip和端口,但是这两个不能同时起
hyde1:使用的是宿主机的20.0.0.10:80(宿主机的80端口) |
hyde2:使用的也是宿主机的20.0.0.10:80(宿主机的80端口) |
(4)none模式:docker容器有自己的network-space,但是这个容器没有任何网络设置,这个容器没有网卡、ip、路由,只有本地lo回环网络(127.0.0.1),容器不可以联网(类似于飞行模式),一般用于容器功能测试
(5)自定义网络,创建容器时,默认使用docker0网桥是无法给容器定义ip地址的,只能自动分配,自定义网络在创建容器时,可以给容器指定ip地址(可以给docker创建一个自己定义的网段)
2、桥接模式:用于连接两个不同网络段的设备,共享通信的一种方式
(1)桥接设备:工作在OSI模型的第二层(数据链路层),根据Mac地址转发数据帧
(2)类似于交换机,只能转发同一网段,通过泛洪广播来找目标设备的Mac地址
3、docker的网络就是基于桥接模式实现的
4、docker网络的工作模式
(1)虚拟网络桥:安装开启docker之后,docker进程就会自动创建一个虚拟网络桥(docker0),是一个虚拟的网络设备,类似于物理网络设备的交换机
(2)分配唯一的ip地址,每次运行一个容器,docker进程都会分配唯一的且未被其他容器占用的ip地址给容器,这个ip地址是在桥接模式网络的子网中
(3)容器和主机通信:通过桥接模式,容器可以与主机直接通信,容器可以访问主机上的运行服务,主机可以通过桥接网络docker0来访问容器内部的进程(iptables的nat地址转换,在主机上做了地址转换)
①问题:docker的网桥是宿主机虚拟出来的,并不是一个真正存在的网络设备,外部网络无法寻址找到,外部网络无法直接访问docker0分配给容器的ip地址
②解决:可以给容器做一个端口映射(-P)
5、docker在宿主机和容器之间做iptables的NAT地址转换(端口映射)
(1)随机分配端口:docker run -itd --name hyde1?-P?nginx /bin/bash
随机分配端口:docker run -itd --name hyde1?-P?nginx /bin/bash 指定分配端口:docker run -itd --name hyde4?-p 4300:80?nginx:1.22.0 /bin/bash | |
-P:在创建容器时,在宿主机和容器之间做一个端口映射,-P随机分配一个端口给宿主机,容器的端口是不变的 -p:指定端口,人为设置固定的端口映射(指定端口映射,宿主机的端口一定不能被占用 ) | |
-P 32768开始 | |
实际上,docker是在宿主机和容器之间做一个iptables的NAT地址转换 |
①修改nginx的访问页面、进入容器开启一下nginx服务
②访问32769就是访问容器nginx的80端口
(2)指定分配端口:docker run -itd --name hyde2?-p 4200:80?nginx /bin/bash
(3)查看容器内部运行的日志
/bin/bash | 为了让容器后台有一个运行程序,保证容器不会退出 |
-d | 后台守护运行,但时间一长容器可能会自动退出 |
/bin/bash就是容器的标准输出,docker logs捕获的是cmd和entrypoint的标准输出,/bin/bash和捕获日志会冲突 |
①创建容器:docker run -itd --name hyde3 -P nginx
②查看日志
查看日志 | docker logs hyde3(容器名/ID) |
动态查看 | docker logs -f hyde3 |
从尾部查看10条 | docker logs --tail=10 hyde3 |
动态从尾部查看10条 | docker logs --tail=10 -f hyde3 |
6、创建host模式:使用宿主机的ip和端口
(1)创建容器时指定网络模式:docker run -itd --name hyde4 --network host(网络模式) nginx /bin/bash
(2)使用的本机的ip地址和端口
7、创建container模式:容器和容器之间共用一个ip和端口
(1)创建容器:docker run -itd --name hyde5 --network=container:hyde1 nginx /bin/bash
(2)解决:关闭hyde1的端口
8、创建none模式:没有网卡、ip、路由,只有本地lo回环网络(127.0.0.1)
只能在自己的容器中访问测试
(1)创建容器:docker run -itd --name hyde6 --network=none nginx /bin/bash
9、创建自定义网段:基于bridge模式,可以给docker创建一个自己定义的网段
(1)查看docker的网络:docker network ls
NETWORK ID | 是docker网络唯一的网络id |
NAME | docker网络的名称 |
DRIVER | docker网络的驱动程序 |
SCOPE | 表示网络的作用范围 |
(2)创建容器时指定IP地址
在使用默认docker0网桥时,创建容器是不能指定IP地址的,只能由docker网桥自动分配,除非用户自定义的网络才可以给容易自定义ip地址
①先创建自定义网络:创建docker1的虚拟网卡
docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
--opt “com.docker.network.bridge.name”=”docker1” 可以不加,但是网卡名称会比较难以识别 | |
--subnet=172.0.0.0/16 | 声明网段 |
mynetwork | 自定义网络的名称 |
②再在创建容器时指定IP地址:docker run -itd --name hyde3 --network mynetwork --ip 172.18.0.10 nginx /bin/bash
③浏览器无法访问,虚拟机内可以访问
(八)数据卷
1、数据卷:容器如何与宿主之间进行数据共享
2、数据卷是一个供容器使用的特殊目录,在容器中,和宿主机的目录进行映射,主机和宿主机之间都可以对目录中的文件进行修改,双方同步生效,对镜像也没有影响,宿主机到容器实现数据迁移
3、宿主机的目录和容器中的目录进行挂载(映射关系)
(1)创建容器+数据卷(-v):docker run -itd --name hyde1 -v /opt/test1:/opt/test centos:7 /bin/bash
(2)测试同步
(3)设置容器的挂载目录为只读模式(只可以在宿主机修改,容器内只能看)
①创建容器:docker run -itd --name hyde2 -v /opt/test2:/opt/test1:ro?centos:7 /bin/bash
②测试
4、容器和容器之间实现数据共享(数据卷容器)
(1)容器1和容器2之间可以有1个或者多个映射目录,实现数据互传,数据同步
(2)数据卷容器:只提供挂载点,让另一方收集数据
(3)实验过程
①创建容器:docker run -itd --name hyde3 -v /opt/data1 -v /opt/data2?centos:7 /bin/bash
②创建交互:docker run -itd --volumes-from hyde3?--name hyde4 centos:7 /bin/bash
③测试
6、容器互联:两个容器之间实现网络通信
(1)新版本(network自定义网络实现网段互ping)
①创建容器
docker run -itd -P --name test11 --network=mynetwork centos:7 /bin/bash docker run -itd -P --name test22 --network=mynetwork centos:7 /bin/bash |
②测试:network模式不需要做映射
访问主机名——访问IP地址
(十)docker之资源控制
1、docker的资源控制:对容器使用宿主机的资源进行控制(CPU、内存、磁盘I/O)
2、docker使用Linux自带的功能cgroup
3、cgroup(control group),是Linux内核系统提供的一种可以限制、记录、隔离进程组所使用的物理资源的机制,docker借助这个机制,来实现资源的控制
4、cgroup本身是提供将进程进行分组化管理的功能和接口的基础结构,分配控制的机制来实现资源控制
(1)host:容器和宿主机共用一个网络命名空间
(2)container:容器和容器之间共用一个网络命名空间
(3)cgroup:其他资源依然是隔离的
4、CPU的资源控制(重点)
(1)Linux通过CFS(completely fair scheduler,完全公平调度器),来调度各个进程对CPU的使用,CFS的调度100ms,也可以自定义容器的调度周期,以及在这个周期时间之内各个容器能够使用CPU的调度时间
--cpu-period | 设置容器调度CPU的周期 | |
--cpu-quota | 设置在每个周期内,容器可以使用CPU的时间 | |
*以上两个可以配合使用 *CFS周期的有效范围:1ms-1s,--cpu-period(1000-1000000) *容器使用CPU的配额时间必须大于1ms,--cpu-quota的值必须是>=1000 | ||
docker stats 容器名/ID | 查看容器的运行、占用宿主机资源的情况 | |
docker top 容器名/ID | 可以查看容器内PID和宿主机PID的映射关系 |
(2)查看CFS调度
cat cpu.cfs_period_us | |
100000 | * 100毫秒,CFS调度周期的长度(微妙),在每一周期内,容器可以使用指定比例的CPU时间,默认情况都是100毫秒 * 每100毫秒调度一次容器请求CPU的资源,然后内核把CPU资源分配给容器 |
cat cpu.cfs_quota_us | |
-1 | * 表示容器使用宿主机CPU的时间没有任何限制 * 调度请求之后,请求配额,内核分配给容器使用cpu的时间 |
(3)容器占用CPU时间的资源限制
①修改配置文件
50000(50毫秒),只能占用一半
②创建容器时限制占用CPU时间:docker run -itd --name test2 --cpu-quota 40000?centos:7 /bin/bash
(4)设置容器占用cpu的权重比:多个容器才能生效
--cpu-shares | 指定容器占用cpu的份额,模式权重1024,设置的值只能是1024的倍数 |
--cpu-shares是给每个容器使用cpu设置了相对的权重,权重高的,可以使用cpu的资源更多,但是,如果只有一个容器在运行,即便设置了权重,但是没有其他更高的权重的容器来占用资源,权重低的容器依然不受限 |
①创建容器:
docker run -itd --name test3 --cpu-shares 512?centos:7 /bin/bash
docker run -itd --name test4 --cpu-shares 1024?centos:7 /bin/bash
②分别进入容器,进行压力测试
yum install -y epel-release
yum install -y stress(stress模拟系统负载的工具)
(5)设置容器绑定cpu(容器只能使用指定的cpu内核)
①创建容器:docker run -itd --name test5 --cpuset-cpus 0,2 centos:7 /bin/bash
②压力测试
yum install -y epel-release
yum install -y stress
5、内存的资源控制
(1)创建容器时限制内存使用
①限制内存创建容器:docker run -itd --name test6 -m 512m centos:7 /bin/bash
6、限制使用swap(了解)
docker run -itd --name test7 -m 512m --memory-swap=1g?centos:7 /bin/bash
要限制容器使用swap,必须和限制内存一起使用 | |
-m 512m --memory-swap=1g | 容器实际上能够使用的swap空间是1G-512m=512m |
-m 512m(不限制swap空间) | 器实际上能够使用的swap空间是容器内存限制的2倍,512m*2=1G |
-m 512m --memory-swap=512m | 容器不能使用swap空间 |
-m 512m --memory-swap=-1 | 内存受限还是512m,但是容器使用swap空间不再限制 |
7、磁盘I/O的资源限制(对读、写进行限制)
(1)限制容器在磁盘上的读速度
docker run -itd --name test8 --device-read-bps /dev/sda:1M?centos:7 /bin/bash
限制每秒1M
(2)限制容器在磁盘上的写速度
docker run -itd --name test9 --device-write-bps /dev/sda:1mb?centos:7 /bin/bash
①为什么还是2.1GB/s
在使用dd获取空字符集是直接从文件系统的缓存当中输入,速度是比较快的
②oflag=direct,禁用文件系统缓存,直接把数据写入磁盘,可以更真实的测试设备的性能,模拟直接写入物理设备的情况
(3)限制容器读取的次数
docker run -itd --name test1?--device-read-iops /dev/sda:100?centos:7 /bin/bash
限制读取的操作,每秒读100次
(4)限制容器写入的次数
docker run -itd --name test2 --device-write-iops /dev/sda:50?centos:7 /bin/bash
限制写入的操作,每秒写50次
8、清理docker占用的磁盘空间
docker system prune -a
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!