docker数据卷
容器和宿主机之间数据共享---------挂载卷------------容器内的目录和宿主机的目录进行挂载。实现数据文件共享。
容器的生命周期有限,一旦重启所有对容器内部文件数据修改以及保存的数据都会被初始化,为了防止数据的丢失,重要的组件一定会做数据卷。
-v 指定
同步时以宿主机为标准
[root@docker1 ~]# docker run -itd --name test1 -v /opt/test1:/opt/test2 centos:7 /bin/bash 1、前面是宿主机目录,后面是容器内的目录 2、加不加斜杠都是目录,不是文件,如果不存在,宿主机和容器会自动创建 3、以宿主机的目录为标列,同步的是宿主机目录的内容到容器内。 4、挂载之后,容器内的目录的权限默认是读写权限都有。
容器与容器之间进行数据共享
容器之间会需要共享数据,最简单的方法就是使用数据卷容器。可以提供容器内的一个目录,专门用来供其他容器进行挂载。
#容器内部挂载 [root@docker1 opt]# docker run -itd --name test1 -v /opt/test1 -v /opt/test2 centos:7 /bin/bash 9ec44446a1ed2b74d813e689d6280d656501a019a34598b59ff904fd6c6701bf [root@docker1 opt]# docker exec -it test1 bash [root@9ec44446a1ed /]# cd /opt [root@9ec44446a1ed opt]# ls test1 test2
[root@docker1 opt]# docker exec -it test1 bash [root@9ec44446a1ed /]# cd /opt/test1 [root@9ec44446a1ed test1]# echo 123 > 123 [root@9ec44446a1ed test1]# cd .. [root@9ec44446a1ed opt]# cd test2 [root@9ec44446a1ed test2]# echo 456 > 456 [root@9ec44446a1ed test2]# exit exit [root@docker1 opt]# docker run -itd --name test2 --volumes-from test1 centos:7 /bin/bash 9354e54aa7d8866bf74df72664ab130209225d653f60e398c3a06a8da9ba28f5 [root@docker1 opt]# docker exec -it test1 bash [root@9ec44446a1ed /]# cd /opt [root@9ec44446a1ed opt]# ls test1 test2 [root@9ec44446a1ed opt]# cd test1 [root@9ec44446a1ed test1]# cat 123 123 [root@9ec44446a1ed test1]# cd .. [root@9ec44446a1ed opt]# cd test2 [root@9ec44446a1ed test2]# cat 456 456
容器之间互联
容器与容器之间建立一条专门的网络通道,容器之间通过这个通道互相通信。
建立通道之后,容器之间可以通过容器名进行通信,容器之间不需要暴露端口,也不依赖宿主机的ip。
在容器内部可以通过容器名直接访问另一个容器,简化容器之间的连接配置。
老版本:
[root@docker1 opt]# docker run -itd --name n1 nginx:1.22 be4d3484000e3388f7cd05a1f33741b176282f11cbbd6299cf77013637eabc7e [root@docker1 opt]# docker run -itd --name n2 --link n1:n2 nginx:1.22 a9322bfce25c57cef21b54d6127f2b12eab6650e9805640daa2a72b89be7f2d5 [root@docker1 opt]# docker exec -it n1 bash root@be4d3484000e:/# exit exit [root@docker1 opt]# docker exec -it n2 bash root@a9322bfce25c:/# curl n1 <!DOCTYPE html> <html> <head>
新版本:
[root@docker1 ~]# cd /opt #指定网络,我们要先创建自定义网络。 [root@docker1 opt]# docker network create --subnet=192.168.10.0/24 --opt "com.docker.network.bridge.name"="docker2" xy102 6e73db993923323fa9a57bbfe2014594fa8ecea373757ed1582d1f5fa8052758 [root@docker1 opt]# docker run -itd --name n11 --network=xy102 nginx:1.22 3c084f2cbc6bc9f62c5574ae8006606bc926a8d22cb0473867b8da2b70daf1a3 [root@docker1 opt]# docker run -itd --name n22 --network=xy102 nginx:1.22 9bc2819c7ef3989eb149464eda812616d1015f2433f5cbbcc812cc4eb65ee483 #在容器n11里测试能否通n22 [root@docker1 opt]# docker exec -it n11 bash root@3c084f2cbc6b:/# curl n22 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> #在n22里测试能否通n11 [root@docker1 opt]# docker exec -it n22 bash root@9bc2819c7ef3:/# curl n11 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> #查看容器与容器之间的地址映射 root@9bc2819c7ef3:/# 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 192.168.10.3 9bc2819c7ef3
docker资源控制
docker通过cgroup来控制容器的资源配额。包括cpu、内存、磁盘三大方面。
cgroup----control groups
linux内核提供的可以限制,记录,隔离进程所使用的物理资源(cpu、内存、磁盘IO)的机制
1、cpu资源控制
进程占用cpu的时间来进行计算。
[root@docker1 opt]# cd /sys/fs/cgroup/cpu/docker/ [root@docker1 docker]# ls 3c084f2cbc6bc9f62c5574ae8006606bc926a8d22cb0473867b8da2b70daf1a3 9bc2819c7ef3989eb149464eda812616d1015f2433f5cbbcc812cc4eb65ee483 [root@docker1 docker]# cd 3c084f2cbc6bc9f62c5574ae8006606bc926a8d22cb0473867b8da2b70daf1a3 [root@docker1 3c084f2cbc6bc9f62c5574ae8006606bc926a8d22cb0473867b8da2b70daf1a3]# cat cpu.cfs_quota_us -1 #-1表示系统没有对该进程进行cpu限制 [root@docker1 3c084f2cbc6bc9f62c5574ae8006606bc926a8d22cb0473867b8da2b70daf1a3]# cat cpu.cfs_period_us 100000 #10万微妙也就是100毫秒,在每个使用cpu的周期内容器可以用指定的比列使用cpu时间 #50000微妙也就是50毫秒 [root@docker1 ~]# docker run -itd --name test1 --cpu-quota 50000 -v /etc/yum.repos.d/:/etc/yum.repos.d/ centos:7 /bin/bash 300f30b3b9b6d602ccaf76c02e6aeed9d61c2095012afbcca32770e324fbeb1a [root@docker1 ~]# docker exec -it test1 bash [root@300f30b3b9b6 /]# yum -y install epel-release #查看cpu [root@docker1 yum.repos.d]# top Tasks: 218 total, 2 running, 216 sleeping, 0 stopped, 0 zombie %Cpu0 : 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu1 : 45.0 us, 1.8 sy, 0.0 ni, 53.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu2 : 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu3 : 0.0 us, 0.7 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
[root@docker1 ~]# docker top test1 UID PID PPID C STIME TTY TIME CMD #pid:容器内的进程在宿主机上的进程号 #ppid:在容器内部的进程号
2、设置cpu的资源占用比
--cpu-shares 默认值是1024,必须是1024的倍数。
#设置cpu占比 [root@docker1 yum.repos.d]# docker run -itd --name test2 --cpu-shares 512 -v /etc/yum.repos.d/:/etc/yum.repos.d/ centos:7 /bin/bash 6c050b61dd04be67cc30a8a436a82e42cecc2dc2a0e7f94e3884b450791f46e1 [root@8c5bf0b1c7b7 yum.repos.d]# vi cpu.sh #!/bin/bash i=0 while true do let i++ done [root@8c5bf0b1c7b7 yum.repos.d]# chmod 777 cpu.sh #执行脚本 [root@8c5bf0b1c7b7 yum.repos.d]# ./cpu.sh #查看cpu占比 [root@docker1 yum.repos.d]# docker stats CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 8c5bf0b1c7b7 test1 52.75% 1.266MiB / 7.62GiB 0.02% 165kB / 900B 0B / 47.7MB 3 6c050b61dd04 test2 105.63% 1016KiB / 7.62GiB 0.01% 75.9kB / 0B 0B / 5.12kB 3
3、设置容器绑定cpu
--cpuset-cpu0,1
cpu的限制和绑定cpu一般是一起使用的。
[root@docker1 opt]# docker run -itd --name test3 --cpuset-cpus 0,2 centos:7 /bin/bash 0f671b474411d4e31aa6eb5803d111d2c188afc68575b62635d32f33e72089ed [root@docker1 opt]# docker exec -it test3 bash [root@0f671b474411 /]# cd /opt [root@0f671b474411 opt]# vi cpu.sh #!/bin/bash i=0 while true do let i++ done [root@0f671b474411 opt]# chmod 777 cpu.sh [root@0f671b474411 opt]# ./cpu.sh #查看cpu是否在0和2上
4、内存限制
[root@docker1 opt]# docker run -itd --name test4 -m 512m --memory-swap=1g centos:7 /bin/bash 363ace130bc075e2674e961cca3321c6061c6a954d2ca72a757468f3a621f779 [root@docker1 opt]# docker exec -it test4 bash [root@363ace130bc0 /]# yum -y install epel-release [root@363ace130bc0 /]# yum -y install stress
--memory=
-m 512m
-m 1g
单位是小写
也可以限制容器使用交换空间swap
--memory-swap=512m/g
-m 512m --memory-swap=1g #内存限制的大小是1g-512m=512m。 --memory-swap=0或者不加 #容器使用swap交换分区大小是限制内存的两倍。 -m 512m --memory-swap=512m #容器不能使用交换分区。 -m 512m --memory-swap=-1 #内存受限制,512m交换分区不再受限制,宿主机有多少swap空间,容器就咳哟用多少。
5、磁盘限制
磁盘读写速度限制
磁盘读次数限制和写次数限制
[root@docker1 ~]# docker run -itd -name test6 -device-read-bps /dev/sda:1M centos:7 /bin/bash #容器在磁盘上每秒只能读1m [root@docker1 ~]#docker run -itd -name test6 -device-write-bps /dev/sda:1M centos:7 /bin/bash #容器在磁盘上每秒只能写1m
[root@docker1 opt]# docker system prune -a #清理容器的残留,删除停止运行的容器,删除无用的数据卷和网络。
课后练习:
1、设置3个权重 256 768 2048
这三个容器绑定到cpu0
[root@docker1 opt]# docker run -itd --name test1 --cpu-shares 256 --cpuset-cpus 0 centos:7 /bin/bash 3494181b8aae49c757c0583eaccc2855acbbd4840d65b88655b7e9e75a12511f [root@docker1 opt]# docker run -itd --name test2 --cpu-shares 768 --cpuset-cpus 0 centos:7 /bin/bash d77c38c18dbed03113a3eb64fc26b59e1a53911bc3e960757cd1885c757ad376 [root@docker1 opt]# docker run -itd --name test3 --cpu-shares 2048 --cpuset-cpus 0 centos:7 /bin/bash 9268adc7e3e003d83afd440594d43fad91680e0575842214652fcc356468a509 [root@docker1 opt]# docker exec -it test1 bash #分别在容器1、2、3做相同操作 [root@3494181b8aae /]# cd /opt [root@3494181b8aae opt]# vi cpu.sh #!/bin/bash i=0 while true do let i++ done [root@3494181b8aae opt]# chmod 777 cpu.sh [root@3494181b8aae opt]# ./cpu.sh
2、绑定到指定的cpu1,设置占用cpu的比重是25%,同时限制内存使用率512M
[root@docker1 opt]# docker run -itd --name test4 --cpu-quota 25000 --cpuset-cpus 1 -m 512m --memory-swap=1g centos:7 /bin/bash 88663cc5f2d2f193203a59b4cec9865c16fb7876a593e9b01b77f12a764830b4 [root@docker1 opt]# docker exec -it test4 bash [root@88663cc5f2d2 /]# cd /opt [root@88663cc5f2d2 opt]# vi cpu.sh #!/bin/bash i=0 while true do let i++ done [root@88663cc5f2d2 opt]# chmod 777 cpu.sh [root@88663cc5f2d2 opt]# ./cpu.sh
docker stats查看占比