Cpu、mem、disk:·
1、 内存限制
物理内存:
Swap:在硬盘上(存放的是内存格式)
-m –memory 设置内存的限额
--memeoty-swap 限制内存+swap额度 如果设置-1与物理内存等大
docker run -it -m 200M --memory-swap=300m progrium/stress --vm 1 --vm-bytes 280M
2、 cpu:默认平等使用cpu
-c –-cpu-shares 权重值 默认值:1024 | 命令
理解为:那个容器的优先级更高
3、 disk限制:
Block IO :带宽优先级
--blkio-weight xx(默认值500)
1、bps:每秒钟的读写数据量
--device-read-bps:读
--device-write-bps:写
2、iosp:每秒钟的读写次数
--device-read-iops : 读
--device-write-iops:写
关于docker的网络构成:
独立容器间的网络: none : 只有local lookpback 用于生成东西然后cp到其他地方
Host : 物理机完全一样 (把物理机的协议栈放置到容器里)优点:可以实现与物理机高速连接,且不占用带宽
容器间的网络:bridge:
跨主机的容器间的网络:macvlan
Overlay 原生网络
第三方的网络: flannel weave caclic
容器间的通讯
容器如何与外部通讯
DOCKER四种网络!!
1. host模式 :docker run 使用 --net=host指定 docker使用的网络实际上和宿主机一样
2. container模式: 使用 --net=container:container_id/container_name
多个容器使用共同的网络,看到的ip是一样的。
3. none 模式 : 使用 --net=none指定
这种模式下,不会配置任何网络。
4. bridge模式 使用 --net=bridge指定
默认模式,不会指定
此模式会为每个容器分配一个独立的network namespace
Yum provides ip //查看ip属于那个安装包
Brctl show
Docker network ls //查看有多少网卡
Docker network inspect /my_net //查看调节卡
Docker run -itd –-network my——net busybox
IP a
docker network create --driver bridge my_net ——创建网卡
brctl show ——查看网卡分别连接谁
docker network ls ——查看docker里有多少网卡
docker network inspect /my_net ——查看调节卡
docker run -itd --network my_net busybox ——开启一个容器将网络连接到my_net网卡上
ip a
docker network create --driver bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 my_net2 ——自建网卡和网段
docker network inspect my_net2 //查看网卡的配置信息
docker run -itd --network my_net2 --ip 172.22.16.8 centos //手动配置静态ip
docker network remove gao_net ——删除gao_net 这块网卡
docker network
docker network connect 容器id //给容器增加一块网卡 可以让不同网卡间的容器通信
docker run -itd --name web1 httpd //(创建web1容器)
docker run -it --network container:web1 busybox //(创建joined容器)container:后加容器
joined容器:容器间共享协议栈
监控某一服务/容器流量(需要写脚本)
host:物理机和容器共享协议栈
自定义网络有dns(ping容器名)其他没有
1、容器访问外部世界 使用nat
tcpdump -i ens33 -n icmp ——抓包抓取ens33网卡的ping包
tcpdump -i docker0 -n icmp ——抓取docker0网卡的ping包
外部世界访问容器:端口映射
出数据通过nat
回数据通过docker-proxy
2、外部世界访问容器:端口映射
Docker可以将容器对外提供的端口映射到主机的某个端口,访问主机映射的端口访问的直接是容器
docker run -d -p 80 httpd //容器中的httpd的80端口映射到主机80端口
docker run -d -p 8080:80 httpd //将主机的8080映射到容器中
ps -ef | grep docker-proxy 查看映射的端口号
docker热数据处理/两类存储资源:
1、 镜像层-冷和容器层
镜像分层底层协议 docker strorage driver:(使用厂商)
Redhat7:overlay
SUSE:Btrfs
Ubuntu:AUFS
2、 Data Volume(翻译:数据量)-热 //datahosts文件和目录。能够通过mount形式挂载到容器里去
- 是目录或者是文件。不能是没有格式化的磁盘(块设备不行)
- 容器可以读写volume中的数据
- Volume的数据可以永久的保存,即使使用它的容器销毁了。
大小取决于容器的剩余空间(目前为止没有办法限制磁盘限额也不行,docker以root用户运行,磁盘无效)。
Docker voulune分成两种类型:
- bind mount(主机已存在的文件挂载到容器中):
例句: docker run -d -p 80:80 -v ~/htdocs:/usr/local/apache2/htdocs:ro httpd //ro代表只读(也可以不加权限),也可以以文件形式挂载
- docker managed mount :无需指定mount源,指明mount point就行
例句:docker run -d -p 80:80 -v /usr/local/apache2/htdocs httpd
通过:docker inspect +容器id //查看挂载详情(mounts某块 source源地址,destination目的地址) 用ls查看下原地址的东西就知道挂的啥了
如何共享数据(共享是volune的特性):
- 容器与host共享数据:
Data volume
Docker cp
- 容器之间共享数据
- 用bind mount 挂在方式将同一个目录或文件挂载到多个容器
- 卷容器volume container(专门为容器提供卷可以提供docker voulune两种挂在方式)(作用只是提供数据,本身不处于运行状态,不讨让他处于运行状态)
例句:docker create –name vc_data (要挂载的目录或文件)-v (挂载到容器的路径) busybox //创建卷容器
让容器使用卷容器:docker run –name web20 -d -p 80 –volumes-from vcdata httpd
用 docker inspect vc_data查看
创建卷容器的dockerfile
将热数据放到容器中与其他容器共享 data packed volume container
创建dockerfile
FROM busybox:latest
ADD htdocs /usr/local/apache/htdocs
VOLUME /usr/local/apache2/htdocs
Docker build //生成
创建卷容器
挂载到容器
Libbetwork && CNM
1、 Sandbox
容器协议栈,interface 路由表 DNS……..namespace
2、 Endpoint
将sandbox介入到network上。典型案例:veth pair 一个endpoint之能属于一个network,也只能属于一个sandbox
3、 network
包含一组endpoint,相同的network中的endpoint可以通讯
Overlay driver
基于vxlan的网络
Vxlan可将二层数据封装成udp传输
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap //创建consul创建完以后可以直接网页访问
另一台虚拟机
Vim /usr/lib/system/system
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --cluster-store=consul://192.168.43.165:8500 --cluster-advertise=ens32:2376 //在配置文件中指定consoul地址 ,改好以后去网页找是否有这个虚拟机的ip地址
docker network create -d overlay ov_net1 //创建完以后所有在consoul上的都会同步
macvlan:直接用bridge,需要手动配置ip
LINUX创建子接口
ip link set ens32 promisc on 打开混杂模式 两台机器都开启 不开启不成功
ip link show ens32 //查看是否开启混杂模式
docker network create -d macvlan --subnet 172.16.86.0/24 --gateway 172.16.86.1 -o parent=ens32 mac_net1 //创建macvlan
modinfo 8021q //查看是否支持8021q协议
modprobe 8021q //导入8021q模块
cd /etc/sysconfig/network-scripts/
修改ens32中的 //这步骤可以省略
BOOTPROTO=manual manual:引导模式,手动的
Cp -p ifcfg-ens32 ifcfg-ens32.10
BOOTPROTO=none
NAME=ens32.10
DEVICE=ens32.10
IPADDR=192.168.23.10
PREFIX=24
NETWORK=192.168.23.0
ONBOOT=yes
VLAN=yes
Cp ifcfg-ens32.10 ifcfg-ens32.20
BOOTPROTO=none
NAME=ens32.10
DEVICE=ens32.10
IPADDR=192.168.22.10
PREFIX=24
NETWORK=192.168.22.0
ONBOOT=yes
VLAN=yes
Systemctl restart network //另一台虚拟机跟以上操作一样 ifup ifcfg-ens33.10
ifup ifcfg-ens33.20 或者这条命令启用网卡
docker network create -d macvlan --subnet=172.16.10.0/24 --gateway=172.16.10.1 -o parent=ens33.10 mac_net10 ——创建macvlan网卡
docker network create -d macvlan --subnet=172.16.20.0/24 --gateway=172.16.20.1 -o parent=ens33.20 mac_net20
docker run -itd --name bbox10 --ip=172.16.10.10 --network mac_net10 busybox ——创建容器并且使用macvlan网卡
docker run -itd --name bbox20 --ip=172.16.20.10 --network mac_net20 busybox
ifconfig ens33.10 172.16.10.1 netmask 255.255.255.0
ifconfig ens33.20 172.16.20.1 netmask 255.255.255.0
//ping不同可能是没有指路,防火墙写一下规则就好
iptables -t nat -A POSTROUTING -o ens33.20 -j MASQUERADE
iptables -A FORWARD -i ens33.10 -o ens33.20 -m state --state RELATE,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i ens33.20 -o ens33.10 -m state --state RELATE,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i ens33.10 -o ens33.20 -j ACCEPT
iptables -A FORWARD -i ens33.20 -o ens33.10 -j ACCEPT
docker exec -it bbox10 ping -c 2 172.16.20.10