Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的 Container-IP 直接通信。
使用host模式容器使用宿主机的网络直接公开服务,这意味着如果你在容器运行一个web服务,那么它直接绑定主机的网络接口上,而不是通过docker进行任何网络转发
总结:与宿主机共享网络命名空间/网络协议栈。
使用这种模式允许容器共享另一个容器的网络命名空间,这意味着两个容器可以有相同的网络接口和IP地址,如果他们共享是同一个网络命名空间的话。
总结:多个容器之间共享一个networknamespace。
这是最简单的网络模式,此网络模式表示容器拥有自己的网络命名空间,但不会进行任何网络配置,这实际上给用户完全自主权来自配置及容器的网络。
总结:自闭空间。
这是docker默认网络模式,每个新创建的容器都将从该网络中分配一个IP地址,此网络模式允许所有docker容器(宿主机)之间相互通信。
总结:通过veth对连接容器与docker0网桥,网桥分配给容器IP,同时docker0作为“局域网”内容器网关,最后和宿主机网卡通信。
docker允许用户创建自己定义的网络,用户可以定义网络范围,子网,路由等参数,这种类型的网络使得我们的用户可以更好的对容器网络进行控制和隔离。
docker 主要有7个状态
1、created 已创建,还未运行的容器
2、running 正在运行中的容器
3、restartin 容器正在启动中
4、removing 容器正在迁移中
5、paused 停止状态的容器
6、exited 已暂停状态的容器
7、dead 死亡 主要是操作系统出现异常或断电关机等有可能引发的状态
随机映射端口 docker run -d --name test1 -P nginx
指定映射端口 docker run -d --name test2 -p 43000:80 nginx
查看docker网络列表 docker network ls
查看容器进程号 docker inspect -f '{{.State.Pid}}' 容器id
查看容器的进程、网络、文件系统等命名空间编号
ls -l /proc/进程/ns
根据容器id创建相同网络的容器
docker run -itd --name test2 --net=container:容器id centos:7
创建自定义网络,先自定义网络,再使用指定IP运行docker
docker network create --subnet=172.18.0.0/16 --opt
"com.docker.network.bridge.name"="docker1" mynetwork
docker run -itd --name test4 --net mynetwork --ip 172.18.0.10 centos:7
cgroups,是一个非常强大的linux内核工具,他不仅可以限制被 namespace 隔离起来的资源, 还可以为资源设置权重、计算使用量、操控进程启停等等。 所以 cgroups(Control groups)实现了对资源的配额和度量。
1、资源限制:可以对任务使用的资源总额进行限制。
2、优先级分配:通过分配的cpu时间片数量以及磁盘IO带宽大小,实际上相当于控制了任务运行优先级。
3、资源统计:可以统计系统的资源使用量,如cpu时长,内存用量等。
4、任务控制:cgroup可以对任务执行挂起、恢复等操作。
查看当前cpu使用率
cd /sys/fs/cgroup/cpu/docker/容器id/
cat cpu.cfs_quota_us 表示该cgroups限制占用的时间
cat cpu.cfs_period_us cpu分配的周期
可以重新创建一个容器并设置限额
docker run -itd --name test6 --cpu-quota 50000 centos:7 /bin/bash
或者
echo 50000 > cpu.cfs_quota_us
cgroup 控制的是内核资源--》 间接控制中cpu 的资源--》控制这 中的进程资源--》 docker容器的资源--》 docker容器内应用的资源
控制的主题包括cpu 、内存、I/O。
主要介绍的CPO资源的控制,而CPU资源控制的方式主要有:
1、cpu-shares 权重指的的是多个容器同一个cpu下,被分配到CPu资源的机会占比。
2、cpu-period周期指的是 CPU在给与当前管理,控制的容器分配资源时,CPU的分配周期 ,默认周期1S,此项配置可以运行时直接指定。
3、quest-cpus 指定容器,仅能使用指定CPU,比如 0、1、2、3, 假设使用0和2可以用这种方式指定cpu核心。
数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。数据卷的使用类似于 Linux 下对目录进行的 mount 操作。
如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。数据卷容器是一个普通的容器,专门提供数据卷给其他容器挂载使用。
创建一个容器作为数据卷容器
docker run --name web2 -v /data1 -v /data2 -it centos:7 /bin/bash
echo "this is web2" > /data1/abc.txt
echo "THIS IS WEB2" > /data2/ABC.txt
使用 --volumes-from 来挂载 web2 容器中的数据卷到新的容器
docker run -it --volumes-from web2 --name web3 centos:7 /bin/bash
cat /data1/abc.txt
cat /data2/ABC.txt
在启动容器的时候,如果不指定对应的端口,在容器外是无法通过网络来访问容器内的服务。端口映射机制将容器内的服务提供给外部网络访问,实质上就是将宿主机的端口映射到容器中,使得外部网络访问宿主机的端口便可访问容器内的服务。
随机映射端口(从32768开始)
docker run -d --name test2 -p 43000:80 nginx 指定映射端口
容器互联是通过容器的名称在容器间建立一条专门的网络通信隧道。简单点说,就是会在源容器和接收容器之间建立一条隧道,接收容器可以看到源容器指定的信息。
创建并运行源容器取名web1
docker run -itd -P --name web1 centos:7 /bin/bash
创建并运行接收容器取名web2,使用--link选项指定连接容器以实现容器互联
docker run -itd -P --name web2 --link web1:web1 centos:7 /bin/bash --link 容器名:连接的别名
进web2 容器, ping web1
docker exec -it web2 bash
ping web1