技术标签: overlay bridge docker-compose k8s+container docker network
Docker通过使用网络驱动程序【network drivers】支持网络容器。默认情况下,Docker提供了多个网络驱动程序,如bridge
和overlay
驱动程序。用户也可以自己写一个网络驱动插件,这样就可以创建自己的驱动程序。
Docker引擎在宿主机会自动创建三个默认网络,创建容器时如果没有配置网络参数则默认使用bridge
网络
docker network ls
NETWORK ID NAME DRIVER SCOPE
07d530169e71 bridge bridge local
5be8dfb27f8c host host local
75467f6f34fb none null local
不同的网络模式适用场景总结如下:
network mode | 最适用的场景 |
---|---|
User-defined bridge networks | 在同一个Docker主机上运行的多个容器之间需要进行通信 |
Host networks | 容器的网络堆栈不应该与Docker主机隔离,但容器的其他方面需要隔离的 |
Overlay networks | 需要运行在不同Docker主机上的容器进行通信时,或者当多个应用程序使用swarm service一起工作时 |
Macvlan networks | 从虚拟机设置迁移或需要您的容器看起来像网络上的物理主机,每个主机都有唯一的MAC地址 |
Third-party network plugins | 需要将Docker与专门的网络堆栈集成 |
# 列出所有当前主机上或Swarm集群上的网络
docker network ls
#查看网络详情
docker network inspect network名称
# 清除未使用的docker网络
docker network prune -f
# 创建网络
ocker network create -d bridge br0
docker network create –subnet=192.168.50.0/24 br0
docker network create –subnet=192.168.50.0/24 –ip-range=192.168.50.0/24 br0
docker network create –subnet=192.168.10.0/24 –internal br1
#将容器添加进一个已有网络
docker network connect bridge 容器名或ID
docker network connect --ip 172.17.0.18 network名称【必须是自己创建的才可以】 容器名或ID
#查看某一个容器中的网络,可以将一个容器连接到多个网络中。
docker inspect 容器名或ID
docker inspect --format='{
{json .NetworkSettings.Networks}}' 容器名或ID
# 获取容器IP
docker inspect --format='{
{range .NetworkSettings.Networks}}{
{.IPAddress}}{
{end}}' 容器名或ID
#将容器从网络中移除
docker network disconnect bridge 容器名或ID
# 删除一个网络
docker network rm network名称
Docker的网络子系统是可插拔的,基于驱动程序实现。默认提供bridge、host、overlay、ipvlan、macvlan、none,并提供核心网络功能:
网桥工作在二层(OSI堆栈),是通用网络设备的一种,可以设置IP地址
在组网方面,网桥网络是在网段之间转发流量的链路层设备。网桥可以是运行在主机内核中的硬件设备或软件设备。
当创建或删除一个自定义网桥,或者连接或断开容器与用户定义网桥的连接,Docker使用特定于操作系统的工具来管理底层网络基础设施
(如添加或删除网桥设备或配置Linux上的iptables规则)。
网络配置过程
如下:
--link
选项,但不推荐。在自定义网桥网络中,容器之间可以通过名称或别名进行解析--network
的容器都附加到默认网桥网络。这可能是一个风险,因为不相关的堆栈/服务/容器可以进行通信。默认网桥的配置是全局的
docker network create
创建和配置。如果不同的应用程序组有不同的网络需求,可以在创建桥接时分别配置每个用户定义的桥接。连接到默认网桥上的所有容器共享环境变量
--link
标志将它们链接起来。这种类型的变量共享在用户定义的网络中是不可能的。但是,有更好的方法来共享环境变量,如下:
对于独立容器,移除容器和Docker主机之间的网络隔离,直接使用主机的网络。
不会与Docker宿主机隔离
(容器共享主机的网络命名空间),并且容器不会分配自己的ip地址
。例如,如果您运行一个绑定到端口80的容器,并且使用主机网络,则容器的应用程序在主机IP地址的端口80上可用。port-mapping
不生效, -p
、 --publish
、 -P
、--publish-all
选项被忽略,并产生一个告警WARNING: Published ports are discarded when using host network mode
优化性能
非常有用, 在容器需要处理大量端口
的情况下,因为它不需要网络地址转换(NAT),并且没有为每个端口创建“用户空间-代理”。仅适用于Linux主机
,不支持Mac、Windows和Windows Server的Docker Desktop使用命令如下:
docker run --rm -d --network host --name my_nginx nginx
在多个Docker守护进程主机之间创建分布式网络。
该网络位于特定主机网络之上(overlays),允许连接到它的容器在启用加密时安全通信。Docker透明地
处理每个数据包往返于正确的Docker守护进程主机和正确的目标容器间的路由
。
overlay
网络可以实现如下容器间的通信,这种策略消除了在这些容器之间进行操作系统级路由的需要。
swarm services
能够相互通信swarm services
和独立容器之间通信当初始化一个swarm或将一个Docker主机加入到一个现有的swarm时,在该Docker主机上创建了两个新的网络:
ingress
: 处理与swarm service 相关的控制和数据流量。创建swarm service 时,如果没有连接到自定义的overlay网络,默认连接到这个网络docker_gwbridge
:
docker swarm init
将Docker守护进程初始化为swarm manager ,或者使用docker swarm join
将其加入现有的swarm 。其中任何一个都会创建默认的ingress
overlay网络,默认情况下由swarm service使用。即使您从未计划使用swarm services,也需要这样做。之后,可以创建额外的用户定义overlay网络。# 1.停止所有连接ingress的容器服务,
# 2.删除ingress网桥
docker network rm ingress
# 3. 创建自定义的ingress网桥
ocker network create \
--driver overlay \
--ingress \
--subnet=10.11.0.0/16 \
--gateway=10.11.0.2 \
--opt com.docker.network.driver.mtu=1200 \
my-ingress
# 4. 重启在第一步关闭的服务
# 1. Stop Docker.
# 2. 删除已有的docker_gwbridge接口
sudo ip link set docker_gwbridge down
sudo ip link del dev docker_gwbridge
# 3. Start Docker. Do not join or initialize the swarm.
# 4.Create or re-create the docker_gwbridge bridge
docker network create \
--subnet 10.11.0.0/16 \
--opt com.docker.network.bridge.name=docker_gwbridge \
--opt com.docker.network.bridge.enable_icc=false \
--opt com.docker.network.bridge.enable_ip_masquerade=true \
docker_gwbridge
# 5. 初始化或加入swarm。由于桥已经存在,Docker不会通过自动设置创建它。
IPvlan
网络让用户完全控制IPv4
和IPv6
寻址【addressing
】,VLAN
驱动程序建立在此基础上,为用户提供对二层VLAN标记【layer 2 VLAN tagging
】的完全控制,甚至对底层网络集成感兴趣的用户提供 IPvlan L3 routing
IPvlan是经过验证的、真实的网络虚拟化技术的一个新转变。Linux实现非常轻量级,因为它们不是使用传统的Linux网桥进行隔离,而是与Linux以太网接口或子接口相关联,以加强网络之间的分离和到物理网络的连接。
IPvlan提供了许多独特的功能,并为各种模式的进一步创新提供了大量的空间,2个突出优点如下:
使用示例参见:ipvlan network
docker network create -d ipvlan \
--subnet=192.168.210.0/24 \
--subnet=192.168.212.0/24 \
--gateway=192.168.210.254 \
--gateway=192.168.212.254 \
-o ipvlan_mode=l2 -o parent=eth0 ipvlan210
Macvlan网络允许为容器分配MAC地址,使其显示为网络上的物理设备。 Docker守护进程通过容器的MAC地址将流量路由到容器。
在处理希望直接
连接到物理网络
的遗留应用程序(而不是通过Docker主机的网络堆栈路由)时,使用macvlan驱动程序
有时是最佳选择
一些应用程序,特别是遗留应用程序或监视网络流量的应用程序,希望直接连接到物理网络, 可以使用macvlan
网络驱动程序为每个容器的虚拟网络接口分配MAC地址
,使其看起来像一个直接连接到物理网络的物理网络接口
。
使用macvlan
需要注意如下几点:
使用示例:
docker network create -d macvlan \
--subnet=192.168.32.0/24 \
--ip-range=192.168.32.128/25 \
--gateway=192.168.32.254 \
--aux-address="my-router=192.168.32.129" \
-o parent=eth0 macnet32
对于此容器,禁用所有连网配置【disable all networking】,通常与自定义网络驱动程序一起使用。在swarm services
中none
不可用。
如何禁用一个容器的网络:Disable networking for a container --network none
docker run --rm -dit --network none --name no-net-alpine alpine:latest ash
docker exec no-net-alpine ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
3: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1000
link/sit 0.0.0.0 brd 0.0.0.0
#返回为空,表示没有路由表
docker exec no-net-alpine ip route
docker stop no-net-alpine
可以通过Docker安装和使用第三方网络插件。
这些插件可从Docker Hub或第三方供应商获得,关于安装和使用给定的网络插件,请参阅供应商的文档。
docker-compose network详细配置参见:docker-compose-networking
假设有一个项目,目录名arkime,docker-compose.yml 配置如下
当执行 docker-compose up 的时候,network配置如下:
version: '3.1'
services:
elasticsearch:
container_name: es01
image: elastic/elasticsearch:7.16.1
restart: always #unless-stopped
healthcheck:
test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"]
interval: 10s
timeout: 5s
retries: 3
start_period: 30s
environment:
- discovery.type=single-node
- xpack.security.enabled=false
- xpack.ml.enabled=false
- ingest.geoip.downloader.enabled=false
volumes:
- ./esdata:/usr/share/elasticsearch/data
mem_limit: 512M #28G 生产环境中配置根据实际存储的数据配置
ulimits:
nofile:
soft: 65535
hard: 65535
memlock:
soft: -1
hard: -1
ports:
- 9200:9200
arkime:
container_name: arkime-viewer
image: mammo0/docker-arkime:latest
restart: always #unless-stopped
depends_on:
- elasticsearch
environment:
- OS_HOST=es01
- OS_PORT=9200
- VIEWER=on
- ARKIME_INTERFACE=eth0
- CAPTURE=off
ports:
- 8005:8005
volumes:
- ./config:/opt/arkime/etc
- ./logs:/data/logs
- ./data:/data/pcap
通过docker network inspect arkime_default
命令,查看结果如下:
[
{
"Name": "arkime_default",
"Id": "e5474a234c87560c85a9cfdc0f2ecff5b40c58b00d1fb466a324f45407b4aef8",
"Created": "2022-12-11T08:40:15.65117582Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.19.0.0/16",
"Gateway": "172.19.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"ab936540b7233550534d32a0c1cbbe34245e9cfc4fca06c5e53c3af5b3306266": {
"Name": "arkime-viewer",
"EndpointID": "b9a19cb5069fd7cf4af7083f5b3a364069b5b21f91b4daa67a1481cf524e1df2",
"MacAddress": "02:42:ac:13:00:03",
"IPv4Address": "172.19.0.3/16",
"IPv6Address": ""
},
"e61aeedafc13837a2b83561234c69823019d24911e99ee9cb86587775488ec73": {
"Name": "es01",
"EndpointID": "9771ecdf8f079f1bcab6fd651162f23979ab101d2bf8773033a22f74bcd7055c",
"MacAddress": "02:42:ac:13:00:02",
"IPv4Address": "172.19.0.2/16",
"IPv6Address": ""
}
},
"Options": {
},
"Labels": {
"com.docker.compose.network": "default",
"com.docker.compose.project": "arkime",
"com.docker.compose.version": "2.7.0"
}
}
]
详细配置参见:docker-compose-networking
version: "3"
services:
proxy:
container_name: proxy
image: nginx:lastest
networks:
- frontend
app:
container_name: springboot-service
networks:
- frontend
- backend
db:
image: postgres
networks:
- backend
networks:
frontend:
driver: bridge
backend:
# Use a custom driver which takes special options
ipam:
driver: default
config:
- subnet: 172.28.0.0/16
不指定网络时,默认的网络也是可以配置的。不配置的话,默认是使用:brige,也可以修改为其他 的。
version: "3"
services:
web:
container_name: web
ports:
- 8088:8080
db:
container_name: db
image: postgres
networks:
default:
# Use a custom driver
driver: bridge
指定一个存在的网络,docker-compose创建的容器默认都连接到此网络
networks:
default:
external:
name: my-pre-existing-network
Network containers
Networking overview
bridge network
overlay network
ipvlan network
macvlan network
文章浏览阅读685次。1.1.什么是有状态?有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session。例如登录:用户登录后,我们把登录者的信息保存在服务端session中,并且给用户一个cookie值,记录对应的session。然后下次请求,用户携带cookie值来,我们就能识别到对应session,从而找到用户的信息。缺点是什么?服务端保存大量数据,增加服务端压力 服务端保存用户状态,无法进行水平扩展 客户端请求依赖服务.._无状态token登录
文章浏览阅读293次。SDUT OnlineJudge#include<iostream>using namespace std;int main(){int a,b,c,d;cin>>a;b=a%10;c=a/10%10;d=a/100%10;int key[3];key[0]=b;key[1]=c;key[2]=d;for(int i = 0;i<3;i++){ if(key[i]!=0) { cout<<key[i.
文章浏览阅读2.2k次。年终奖采用的平均每月的收入来评定缴税级数的,速算扣除数也按照月份计算出来,但是最终减去的也是一个月的速算扣除数。为什么这么做呢,这样的收的税更多啊,年终也是一个月的收入,凭什么减去12*速算扣除数了?这个霸道(不要脸)的说法,我们只能合理避免的这些跨级的区域了,那具体是那些区域呢?可以参考下面的表格:年终奖一列标红的一对便是盲区的上下线,发放年终奖的数额一定一定要避免这个区域,不然公司多花了钱..._年终奖盲区表
文章浏览阅读7.5k次,点赞5次,收藏19次。matlab结构体struct字段变量值提取_matlab读取struct类型数据中的值
文章浏览阅读4.8k次。1,什么情况下使用fragment通常用来作为一个activity的用户界面的一部分例如, 一个新闻应用可以在屏幕左侧使用一个fragment来展示一个文章的列表,然后在屏幕右侧使用另一个fragment来展示一篇文章 – 2个fragment并排显示在相同的一个activity中,并且每一个fragment拥有它自己的一套生命周期回调方法,并且处理它们自己的用户输_android reader fragment
文章浏览阅读2.8k次。FFT of waveIn audio signalsBy Aqiruse An article on using the Fast Fourier Transform on audio signals. IntroductionThe Fast Fourier Transform (FFT) allows users to view the spectrum content of _fft of wavein audio signals
文章浏览阅读5.9k次。https://jaywcjlove.github.io/awesome-mac/ 这个仓库主要是收集非常好用的Mac应用程序、软件以及工具,主要面向开发者和设计师。有这个想法是因为我最近发了一篇较为火爆的涨粉儿微信公众号文章《工具武装的前端开发工程师》,于是建了这么一个仓库,持续更新作为补充,搜集更多好用的软件工具。请Star、Pull Request或者使劲搓它 issu_awesomemac
文章浏览阅读616次。一.jquery简介 jQuery是一个快速的,简洁的javaScript库,使用户能更方便地处理HTML documents、events、实现动画效果,并且方便地为网站提供AJAX交互 jQuery 的功能概括1、html 的元素选取2、html的元素操作3、html dom遍历和修改4、js特效和动画效果5、css操作6、html事件操作7、ajax_简介java中jquery技术
文章浏览阅读1.6w次,点赞5次,收藏19次。我修改的是表格的固定列滚动而产生的滚动条引用Table的组件的css文件中加入下面的样式:.ant-table-body{ &amp;::-webkit-scrollbar { height: 5px; } &amp;::-webkit-scrollbar-thumb { border-radius: 5px; -webkit-box..._ant design ::-webkit-scrollbar-corner
文章浏览阅读269次。基于JSP的健身俱乐部会员管理系统项目分享:见文末!
文章浏览阅读1.8k次,点赞2次,收藏15次。同学们,是不是又到了一年一度写开题报告的时候呀?是不是还在为不知道论文的开题报告怎么写而苦恼?Take it easy!我带着倾尽我所有开题报告写作经验总结出来的最强保姆级开题报告解说来啦,一定让你脱胎换骨,顺利拿下开题报告这个高塔,你确定还不赶快点赞收藏学起来吗?_开题报告研究难点
文章浏览阅读6k次,点赞4次,收藏17次。原生先获取对象var a = document.getElementById("dom");vue先添加ref <div class="" ref="divBox">获取对象let a = this.$refs.divBox获取父、子、兄弟节点方法var b = a.childNodes; 获取a的全部子节点 var c = a.parentNode; 获取a的父节点var d = a.nextSbiling; 获取a的下一个兄弟节点 var e = a.previ_获取子节点的路径 vue