一、docker数据卷
容器和宿主机之间数据共享-----------挂载卷------------容器内的目录和宿主机的目录进行挂载。实现数据文件共享。
容器的生命周期是有限的,一旦重启所有对容器内部文件数据的修改以及保存的数据会被初始化,所以为了防止数据丢失,重要的组件一定会做数据卷。
-v:volume 指定目录
1、宿主机与容器共享挂载
[root@docker1 ~]# docker run -itd --name test1 -v /opt/test1:/opt/test2 centos:7 /bin/bash
[root@docker1 test1]# docker run -itd --name nginx1 -v /opt/test2:/etc/nginx nginx:1.22
5fdeb88d9644825e9b0ab34e285d0ca0fcf4aeaaeed74dc9275fb31b90dbbe9b
##宿主机与容器目录挂载,以宿主机挂载目录为根
[root@docker1 opt]# docker run -itd --name nginx1 -v /opt/test2:/etc/nginx nginx:1.22 /bin/bash
afb30ade9346a0f7911fdab8951d4e5eac22546fc34ec836e7ac6cacdcd0d594
[root@docker1 opt]# docker exec -it nginx1 bash
root@afb30ade9346:/# cd /etc/nginx/
root@afb30ade9346:/etc/nginx# ls
挂载卷
[root@docker1 opt]# docker run -itd --name test2 -v /etc/yum.repos.d/:/etc/yum.repos.d centos:7 /bin/bash
f8eb0fc7dcedb0c1c6561c0b1aab694480c07c171c12209f8c0ca93c3b3a17c2
[root@docker1 opt]# docker exec -it test2 bash
[root@f8eb0fc7dced /]# cd /etc/yum.repos.d/
[root@f8eb0fc7dced yum.repos.d]# ls
文件同步以宿主机为主
挂载目录解释
[root@docker1 test1]# docker run -itd --name nginx1 -v /opt/test2:/etc/nginx nginx:1.22
5fdeb88d9644825e9b0ab34e285d0ca0fcf4aeaaeed74dc9275fb31b90dbbe9b
-v /opt/test2:/etc/nginx
第一点:前面是宿主机目录,后面是容器内的目录
第二点:加不加斜杠,都是目录,不是文件,如果不存在,宿主机和容器自动创建
第三点:以宿主机的目录为标的,同步的是宿主机目录的内容到容器内。
第四点:挂载之后,容器内的目录的默认权限是读写权限都有。
2、容器和容器之间进行数据共享:
容器之间会需要共享数据,最简单的方法就是使用数据卷容器,可以提供容器的 一盒目录,专门来用来供其他容器进行挂载。
##容器创建共享目录/test1 /test2
##容器test1内创建共享目录/test1 /test2
[root@docker1 test1]# docker run -itd --name test1 -v /opt/test1 -v /opt/test2 centos:7 /bin/bash
4f384934b91865a879e79e032680710611c6419035605051486e99ee62d9f8d7
[root@docker1 test1]# docker exec -it test1 bash
[root@4f384934b918 /]# cd /opt/
[root@4f384934b918 opt]# ls
test1 test2
##进入test1容器内,写文件
[root@docker1 opt]# docker exec -it test1 bash
[root@4f384934b918 /]# ls
anaconda-post.log dev home lib64 mnt proc run srv tmp var
bin etc lib media opt root sbin sys usr
[root@4f384934b918 /]# cd /opt/
[root@4f384934b918 opt]# cd test1
[root@4f384934b918 test1]# echo "123" > 123
[root@4f384934b918 test1]# echo "456" > 456
[root@4f384934b918 test1]# cd /opt/test2
[root@4f384934b918 test2]# echo "789" > 789
##创建容器test2,共享目录来自于容器test1提供的共享目录
##创建容器test2,共享目录来自于容器test1提供的共享目录
[root@docker1 opt]# docker run -itd --name test2 --volumes-from test1 centos:7 /bin/bash
3d071983b330ca29f5b7f12f67b836a1556cf84af610f49b839f7214c9ab9c0f
##进入test2容器查看共享文件
[root@docker1 opt]# docker exec -it test2 bash
[root@3d071983b330 /]# cd /opt/
[root@3d071983b330 opt]# ls
test1 test2
[root@3d071983b330 opt]# cat test2
cat: test2: Is a directory
[root@3d071983b330 opt]# cd test2
[root@3d071983b330 test2]# ls
789
[root@3d071983b330 test2]# cat 789
789
二、容器互联
2.1、容器互联:
-
容器与容器之间建立一条专门的网络通道,容器与容器之间通过这个通道互相通信。
-
建立通道之后,容器之间可以通过容器名进行通信,容器之间不需要暴露端口,也不依赖宿主机的ip。
-
在容器内部可以通过容器名直接访问另一个容器,简化容器之间的配置
1、老版本
##容器n2可以curl n1,n1不可以curl n2
[root@docker1 opt]# docker run -itd --name n1 nginx:1.22
72a26a8d8d6b4a24e4efc78dcc3636e445e9ea8ef675ce130ff2e0a721b44bc8
[root@docker1 opt]# docker run -itd --name n2 --link n1:n2 nginx:1.22
0254ac6815d49acca5690df36941e9f65a6a0b86aea386cc7e94c17d2b48bb8c
[root@docker1 opt]# docker exec -it n1 bash
root@72a26a8d8d6b:/# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.4 72a26a8d8d6b
root@72a26a8d8d6b:/# curl n2
curl: (6) Could not resolve host: n2
[root@docker1 opt]# docker exec -it n2 bash
root@2a7fd3483188:/# curl n1
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
新版本
2、指定网段,我们先创建自定义网络。
##创建自定义网络
[root@docker1 opt]# docker network create --subnet=192.168.10.0/24 --opt "com.docker.network.brige.name"="docker2" xy102
55fd0734db67c8f5cb9a429e11b0c8361e893c051ed082b078d389bb4069930f
[root@docker1 opt]# docker network ls
NETWORK ID NAME DRIVER SCOPE
3ed862dda9dc bridge bridge local
2f233d494983 host host local
978fd8c202ba mynetwork1 bridge local
c87eba1e8cc7 mynetwork2 bridge local
20b905123c24 none null local
55fd0734db67 xy102 bridge local
##创建容器,网络为自定义网络
[root@docker1 opt]# docker run -itd --name n11 --network=xy102 nginx:1.22
6053f96fb04f32ce6da569080591bce025ecc43d0783e2560f97926019b243e0
[root@docker1 opt]# docker run -itd --name n22 --network=xy102 nginx:1.22
b108541d8f47f17fa30e803ee7ef816960042f1a091589adcf111b1ef569961e
##进入容器,测试容器互联
[root@docker1 opt]# docker exec -it n22 bash
root@b108541d8f47:/# curl n11 ##容器2测试容器1
[root@docker1 opt]# docker exec -it n11 bash
root@6053f96fb04f:/# curl n22 ##容器1测试容器2
三、docker容器的资源控制:
docker通过cgroup来控制容器的资源配额。包括cpu,内存,磁盘三大方面。
cgroup
control groups
linux内核提供的可以限制,记录,隔离进程所有使用的物理资源(cpu,内存,磁盘io)的机制。
1、cpu资源控制:
进程占用cpu的时间来计算。
查看cpu资源限制
[root@docker1 opt]# cd /sys/fs/cgroup/devices/
[root@docker1 devices]# ls
cgroup.clone_children devices.allow machine.slice tasks
cgroup.event_control devices.deny notify_on_release user.slice
cgroup.procs devices.list release_agent
cgroup.sane_behavior docker system.slice
[root@docker1 devices]# cd /sys/fs/cgroup/cpu
[root@docker1 cpu]# ls
cgroup.clone_children cpuacct.usage cpu.rt_runtime_us notify_on_release
cgroup.event_control cpuacct.usage_percpu cpu.shares release_agent
cgroup.procs cpu.cfs_period_us cpu.stat system.slice
cgroup.sane_behavior cpu.cfs_quota_us docker tasks
cpuacct.stat cpu.rt_period_us machine.slice user.slice
[root@docker1 cpu]# cd /sys/fs/cgroup/cpu/docker/
[root@docker1 docker]# ls
afb30ade9346a0f7911fdab8951d4e5eac22546fc34ec836e7ac6cacdcd0d594
cgroup.clone_children
cgroup.event_control
cgroup.procs
cpuacct.stat
cpuacct.usage
cpuacct.usage_percpu
cpu.cfs_period_us
cpu.cfs_quota_us
cpu.rt_period_us
cpu.rt_runtime_us
cpu.shares
cpu.stat
f8eb0fc7dcedb0c1c6561c0b1aab694480c07c171c12209f8c0ca93c3b3a17c2
notify_on_release
tasks
[root@docker1 docker]# cd afb30ade9346a0f7911fdab8951d4e5eac22546fc34ec836e7ac6cacdcd0d594
[root@docker1 afb30ade9346a0f7911fdab8951d4e5eac22546fc34ec836e7ac6cacdcd0d594]# ls
cgroup.clone_children cpuacct.usage cpu.rt_period_us notify_on_release
cgroup.event_control cpuacct.usage_percpu cpu.rt_runtime_us tasks
cgroup.procs cpu.cfs_period_us cpu.shares
cpuacct.stat cpu.cfs_quota_us cpu.stat
[root@docker1 afb30ade9346a0f7911fdab8951d4e5eac22546fc34ec836e7ac6cacdcd0d594]# cat cpu.cfs_quota_us
-1
[root@docker1 afb30ade9346a0f7911fdab8951d4e5eac22546fc34ec836e7ac6cacdcd0d594]# cat cpu.cfs_period_us
100000
cat cpu.cfs_quota_us -1
表示系统没有对该进程进行cpu限制。
cat cpu.cfs_period_us
100000微秒 100毫秒
在每个使用cpu的周期内,容器可以用指定的比列使用cpu时间
100000微秒 100毫秒 0.1秒
##利用宿主机与容器挂载共享卷,yum源进行共享
[root@docker1 yum.repos.d]# docker run -itd --name test1 -v /etc/yum.repos.d/:/etc/yum.repos.d/ centos:7 /bin/bash
[root@docker1 yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
--2024-08-14 11:54:02-- http://mirrors.aliyun.com/repo/Centos-7.repo
正在解析主机 mirrors.aliyun.com (mirrors.aliyun.com)... 117.27.148.83, 117.27.148.79, 117.27.148.86, ...
正在连接 mirrors.aliyun.com (mirrors.aliyun.com)|117.27.148.83|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:2523 (2.5K) [application/octet-stream]
正在保存至: “/etc/yum.repos.d/CentOS-Base.repo”
100%[========================================>] 2,523 --.-K/s 用时 0.001s
2024-08-14 11:54:02 (1.94 MB/s) - 已保存 “/etc/yum.repos.d/CentOS-Base.repo” [2523/2523])
[root@docker1 yum.repos.d]# docker exec -it test1 bash
[root@1303262df61d /]# cd /etc/yum.repos.d/
[root@1303262df61d yum.repos.d]# yum -y install epel-release
[root@1303262df61d yum.repos.d]# stress -c 4
bash: stress: command not found
[root@1303262df61d yum.repos.d]# yum -y install stress
[root@1303262df61d yum.repos.d]# stress -c 4 ##cpu开启四核,stress是模拟占用cpu的工具
查看docker—cpu运行情况
docker stats
##设置cpu限制为50000微秒
[root@docker1 yum.repos.d]# docker run -itd --name test2 --cpu-quota 50000 -v /etc/yum.repos.d/:/etc/yum.repos.d/ centos:7 /bin/bash ##设置cpu限制为50000微秒
##查看宿主机和容器内部的进程号
[root@docker1 yum.repos.d]# docker top test1
UID PID PPID C STIME TTY TIME CMD
root 17332 17311 0 11:38 pts/0 00:00:00 /bin/bash
root 17614 17311 0 11:54 pts/1 00:00:00 bash
root 17732 17614 0 11:59 pts/1 00:00:00 stress -c 4
root 17733 17732 3 11:59 pts/1 00:01:13 stress -c 4
##pid容器在宿主机上的进程号,ppid:在容器内部的进程号
##设置cpu的资源占用比:
–cpu-share默认值是1024,必须是1024的倍数
[root@docker1 yum.repos.d]# docker run -itd --name test3 --cpu-shares 512 -v /etc/yum.repos.d/:/etc/yum.repos.d/ centos:7 /bin/bash
e8a0a5ed1f53c6d1fb67a83184bc0e3a445286b9a17f34c22f5c25a4aa8fce0
[root@docker1 yum.repos.d]# docker exec -it test3 bash
[root@e8a0a5ed1f53 /]# stress -c 4
bash: stress: command not found
[root@e8a0a5ed1f53 /]# yum -y install epel-release
[root@e8a0a5ed1f53 /]# yum -y install stress
[root@e8a0a5ed1f53 /]# stress -c 4
不用stress工具,写一个死循环也可以模拟
[root@e8a0a5ed1f53 /]vi cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done
##脚本赋权执行
[root@e8a0a5ed1f53 yum.repos.d]# cd /opt/
[root@e8a0a5ed1f53 opt]# vi cpu.sh
[root@e8a0a5ed1f53 opt]# chmod +x cpu.sh
[root@e8a0a5ed1f53 opt]# ./cpu.sh
[root@docker1 yum.repos.d]# docker stats
##开启cpu资源限制
[root@docker1 opt]# docker run -itd --name test4 --cpu-shares 1024 -v /etc/yum.repos.d/:/etc/yum.repos.d/ centos:7 /bin/bash
dae127ff48a516cb3afb456b2b125d3690836b7de37f07bb062556e8ffdb822d
[root@docker1 opt]# docker exec -it test4 bash
[root@dae127ff48a5 /]# cd /etc/yum.repos.d/
[root@dae127ff48a5 yum.repos.d]# yum -y install epel-release
GPG key retrieval failed: [Errno 14] curl#37 - "Couldn't open file /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7"
[root@dae127ff48a5 yum.repos.d]# ls
CentOS-Base.repo epel-testing.repo epel.repo
[root@dae127ff48a5 yum.repos.d]# rm -rf epel-testing.repo
[root@dae127ff48a5 yum.repos.d]# yum -y install epel-release
[root@dae127ff48a5 yum.repos.d]# yum -y install stress
[root@dae127ff48a5 yum.repos.d]# stress -c 4
绑定cpu
docker run -itd --name test4 --cpuset-cpus 0,2 centos:7 /bin/bash
cpu限制和绑定cpu一般是一起使用的。既限制也绑定
2、内存限制:
-memory=
-m 512m
-m 1g
单位是小写
也可以限制容器使用交换空间swap
--memory-swap=512M/1g
-m 512m
--memory-swap=lg ##内存限制是512M,交换空间限制的大小是1g-512m=512m
##内存限制是512M,交换分区也是512m
yum,repos,dl# docker run -itd --name test5 -m 512m
--memory-swap=lg centos:7/bin/bash
--memory-swap=0
或者不加-------------容器使用swap交换分区的大小为限制的内存值的两倍。
-m ##m --memory-swap=##m
容器不能使用swap交换分区,意思交换分区为##-##=0
-m 512m --memory-swap=-1
内存还是受限制512m,使用交换分区不再受限,宿主机有多少swap空间,容器swap交换分区就有多少
演示占用内存
stress --vm 2 --vm-bytes 512M --vm-hang 0
3、磁盘限制
磁盘读写速度的限制和写次数限制
docker run -itd --name test6 --device-read-bps /dev/sda:1M centos:7 /bin/bash ##容器在磁盘上每秒只能读1M。
kb K
mb M
gb G
磁盘的写入速度限制
[root@docker1 opt]# docker run -itd --name test6 --device-write-bps /dev/sda:1M centos:7 /bin/bash
aed8e183c0cb479201ed86841f972350dd7757ce9b4c266d3d5c0029ce95a0a8
[root@docker1 opt]# docker exec -it test6 bash
[root@aed8e183c0cb /]# dd if=/dev/zero of=test1.txt bs=1M count=10 oflag=direct
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 10.0039 s, 1.0 MB/s ##模拟测试写入速度
读写次数限制100次
docker run -itd --name test6 --device-read-iops /dev/sda:100 Centos:7 /bin/bash
docker run -itd --name test6 --device-write-iops /dev/sda:100 Centos:7 /bin/bash
清理容器的残留,删除停止运行的容器,删除无用的数据卷和网络。
docker system prune -a
课后练习:
1、设置3个权重 256 768 2048
3个容器设置绑定到cpu 0
设置容器绑定cpu:
–cpuset-cpus 0
[root@docker1 opt]# docker run -itd --name test1 --cpu-shares 256 --cpuset-cpus 0 centos:7 /bin/bash
[root@docker1 opt]# docker run -itd --name test2 --cpu-shares 768 --cpuset-cpus 0 centos:7 /bin/bash
[root@docker1 opt]# docker run -itd --name test3 --cpu-shares 2048 --cpuset-cpus 0 centos:7 /bin/bash
[root@docker1 yum.repos.d]# docker exec -it test1 bash
[root@f55e93844377 /]# cd /opt/
[root@f55e93844377 opt]# vi cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done
[root@f55e93844377 opt]# chmod 777 cpu.sh
[root@f55e93844377 opt]# ll
total 4
-rwxrwxrwx. 1 root root 44 Aug 14 08:45 cpu.sh
[root@f55e93844377 opt]# ./cpu.sh
docker stats
2、绑定到指定的cpu 1 设置占用的cpu的比重是25%,同时限制内存使用率512m。
[root@docker1 opt]# docker run -itd --name test4 --cpu-quota 25000 --cpuset-cpus 1 -m 512m centos:7 /bin/bash
[root@docker1 opt]# docker exec -it test4 bash
[root@5a9828022a4d /]# cd /opt/
[root@5a9828022a4d opt]# vi cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done
[root@5a9828022a4d opt]# chmod 777 cpu.sh
[root@5a9828022a4d opt]# ./cpu.sh