技术标签: 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
文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr
文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc
文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8
文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束
文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求
文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname
文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#include<iostream>#include<stack>#include<queue>using namespace std;typed_二叉树的建立
文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码
文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词
文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限
文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定
文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland