我试图了解 docker 的“macvlan”网络。我创建一个新网络:
docker network create -d macvlan \
--subnet=192.168.2.0/24 \
--gateway=192.168.2.1 \
-o parent=eno1 \
pub_net
Run Code Online (Sandbox Code Playgroud)
并使用新网络启动新容器:
docker run --rm -d --net=pub_net --ip=192.168.2.74 --name=whoami -t jwilder/whoami
Run Code Online (Sandbox Code Playgroud)
当我尝试从容器访问服务或 ping 它时,我得到:
curl: (7) Failed to connect to 192.168.2.74 port 8000: no route to host
Run Code Online (Sandbox Code Playgroud)
使用 Ubuntu 16.04、Ubuntu 18.04 和 CentOS 7 进行测试。docker 主机本身或网络上的其他客户端都无法访问容器。
我按照 docker 站点的示例进行操作:https://docs.docker.com/network/network-tutorial-macvlan/#bridge-example
我缺少什么?
我在这里读到了在 Docker macvlan 中绑定地址来执行这些命令(不知道它们做了什么):
docker run --rm -d --net=pub_net --ip=192.168.2.74 --name=whoami -t jwilder/whoami
Run Code Online (Sandbox Code Playgroud)
但这对我的机器没有任何作用
在我的 Linux 网络中,我无法通过专用的 macvlan 网络从运行它们的主机访问我的 docker 容器。与此 macvlan 网络的所有其他连接都正常。
所以基本上设置是:
DOCKER1 eth0 172.0.0.1 (default)
| eth1 10.0.0.1 (macvlan)
CONTAINER1 10.0.0.11 (macvlan)
DOCKER2 eth0 172.0.0.2 (default)
| eth1 10.0.0.2 (macvlan)
CONTAINER2 10.0.0.12 (macvlan)
Run Code Online (Sandbox Code Playgroud)
如何让主机通过 macvlan 网络访问自己的容器?
我需要特定的应用程序来通过这个网络进行交互,所以使用docker exec
不能解决我的问题;)。
我在 2 个 docker 主机之间设置了 Macvlan 网络,如下所示:
ens192: 172.18.0.21
创建 macvlan 网桥接口
docker network create -d macvlan \
--subnet=172.18.0.0/22 \
--gateway=172.18.0.1 \
--ip-range=172.18.1.0/28 \
-o macvlan_mode=bridge \
-o parent=ens192 macvlan
Run Code Online (Sandbox Code Playgroud)
创建 macvlan 接口 HOST_1
ip link add ens192.br link ens192 type macvlan mode bridge
ip addr add 172.18.1.0/28 dev ens192.br
ip link set dev ens192.br up
Run Code Online (Sandbox Code Playgroud)
ens192: 172.18.0.23
创建 macvlan 网桥接口
docker network create -d macvlan \
--subnet=172.18.0.0/22 \
--gateway=172.18.0.1 \
--ip-range=172.18.1.16/28 \
-o macvlan_mode=bridge \
-o parent=ens192 …
Run Code Online (Sandbox Code Playgroud) 我有一个使用 MAC 地址执行硬件许可证的 Docker 项目。我无法更改此设置,ISV 使用包含 MAC 地址的硬件指纹。
我正在尝试创建一个 macvlan 网络,它将使用物理适配器并从我的网络 DHCP 服务器获取 IP 地址,或者我将手动分配静态 IP 地址。我必须能够手动设置 MAC 地址,这样它就不会动态更改并使我的许可证密钥失效。
根据 Docker 文档,该mac_address
设置已被弃用,至少在 v3 模式中是这样,但在 v2 模式中似乎受到尊重。
我有一个使用普通 LSIO Nginx 作为测试来构建的配置,但无法运行并出现错误,指出无法分配 MAC 地址。
version: "2.1"
services:
nginx:
image: linuxserver/nginx
container_name: nginx_macvlan
environment:
- TZ=Americas/Los_Angeles
volumes:
- .mount:/config
ports:
- 80:80
- 443:443
restart: unless-stopped
mac_address: b7-48-d5-a6-d1-99
networks:
nginx_vlan:
ipv4_address: 192.168.1.10
networks:
nginx_vlan:
driver: macvlan
ipam:
driver: default
config:
- subnet: 192.168.1.0/24
Run Code Online (Sandbox Code Playgroud)
PS C:\Users\piete\source\TestMacVlan> cd "c:\Users\piete\source\TestMacVlan"
PS C:\Users\piete\source\TestMacVlan> docker-compose -f …
Run Code Online (Sandbox Code Playgroud) 使用portainer,我创建了一个macvlan 配置网络。现在,我想删除这个网络。但是,由于某种原因,我不能。我确实收到以下错误消息:Error response from daemon: error while removing network: configuration network "my_macvlan_config" is in use
。奇怪的是,我不认为网络正在使用中。没有容器连接到它。检查网络时,我得到以下结果:
~$ sudo docker network inspect my_macvlan_config
[
{
"Name": "my_macvlan_config",
"Id": "5d95270684516484632c4505e15ba8253bbe8d780b2c41a84a07fbbe09d7a9b6",
"Created": "2020-05-18T20:59:03.472260896+02:00",
"Scope": "local",
"Driver": "null",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "192.168.13.0/24",
"IPRange": "192.168.13.200/29",
"Gateway": "192.168.13.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": true,
"Containers": {},
"Options": {
"parent": "eth0"
},
"Labels": {}
}
]
Run Code Online (Sandbox Code Playgroud)
Docker …
主机ip:192.168.123.2网关:192.168.123.1
适配器是enp3s0,所以我在主机中创建了一个docker网络:
docker network create -d macvlan --subnet 192.168.123.0/24 --gateway 192.168.123.1 -o parent=enp3s0 -o macvlan_mode=bridge macnet
Run Code Online (Sandbox Code Playgroud)
运行容器集IP
docker run --net macnet --ip 192.168.123.102 --name hd3 -it ubuntu bash
Run Code Online (Sandbox Code Playgroud)
容器和主机ping网关192.168.123.1都工作.
但是在容器和主机之间不起作用.
容器:
ping网关正常
ping主机不正常
主机:
ping网关
没问题ping容器不行
为什么以及如何在docker容器和主机之间进行通信?
所以我试图创建一个网络(docker network create
),以便其流量将通过特定的物理网络接口(NIC);我有两个:(<iface1>
内部)和<iface2>
(外部)。
我需要两个网卡的流量在物理上分开。
方法一:
我认为macvlan
应该使用驱动程序来创建这样的网络。对于我在互联网上找到的大部分内容,解决方案参考 Pipework(现已弃用)和临时 docker-plugins(也已弃用)。对我最有帮助的是这个1
docker network create -d macvlan \
--subnet 192.168.0.0/16 \
--ip-range 192.168.2.0/24 \
-o parent=wlp8s0.1 \
-o macvlan_mode=bridge \
macvlan0
Run Code Online (Sandbox Code Playgroud)
然后,为了使容器从主机可见,我需要在主机中执行以下操作:
sudo ip link add macvlan0 link wlp8s0.1 type macvlan mode bridge
sudo ip addr add 192.168.2.10/16 dev macvlan0
sudo ifconfig macvlan0 up
Run Code Online (Sandbox Code Playgroud)
现在容器和主机可以看到对方:)但是容器无法访问本地网络。这个想法是容器可以访问互联网。
方法2:
因为我将手动使用<iface2>
,所以如果默认情况下流量通过 ,我就可以了<iface1>
。但无论我以何种顺序启动网卡(我也尝试暂时删除 LKM <iface2>
);整个流量总是被外部网卡超过<iface2>
。我发现这种情况发生是因为路由表在某个“随机”时间自动更新。为了强制流量通过<iface1>
,我必须(在主机中):
sudo route del -net …
Run Code Online (Sandbox Code Playgroud) 我正在尝试找到一种方法来运行 2 个服务,这些服务在我的 SmartThings 集线器(cast-web-api 和 MQTT-Bridge)上使用 MAC 地址作为唯一的网络 ID
现在,我构建了一个 docker-compose.yml 文件来满足我的需要,但我想将我的 eth0 桥接到容器上的 2 个不同的 MAC 地址。目标是保持 DHCP 并将我路由器中的静态 IP 分配给“Mac1”“Mac2”。
我正在使用 Docker 版本 19.03.1 和 docker-compose 版本 1.24.1
我尝试过,但没有成功使用“mac_address:”还尝试使用该界面运行界面和使用该界面的构建,例如: 这篇文章
到目前为止我的文件(版本 1)
mqtt:
image: arm32v6/eclipse-mosquitto
volumes:
- ./mosquitto/config:/mosquitto/config
- ./mosquitto/data:/mosquitto/data
- ./mosquitto/log:/mosquitto/log
ports:
- "1883:1883"
mqttbridge:
image: st_mqtt_bridge
volumes:
- ./mqtt-bridge:/config
ports:
- "8082:8082"
links:
- mqtt
cast-web-api:
image: cast-web-api
volumes:
- ./cast-web/config:/config
ports:
- "3000:3000"
Run Code Online (Sandbox Code Playgroud)
有可能实现我之前描述的吗?也许 Macvlan 桥接?我是否需要将 docker-compose 升级到版本 2 或 3 ?
我正在尝试为我的 docker 容器设置 MACVLAN。我安装了全新的 Raspbian 和 Docker,并按照 Docker 文档中概述的步骤创建了 MACVLAN: https: //docs.docker.com/network/network-tutorial-macvlan。
网络如下所示:
[
{
"Name": "pub_net",
"Id": "782c49f79f549b11f04a6df98b8b2cbf52deef072e036306231309e44a1c9f3a",
"Created": "2020-02-25T14:44:12.105402396+01:00",
"Scope": "local",
"Driver": "macvlan",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.178.0/24",
"Gateway": "192.168.178.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"682a47a60a5478d19b8c6fc923e11c949f70c5c07fe4dc8d94a772524c2820a1": {
"Name": "IoBroker",
"EndpointID": "5e7068dd9330792a91e1f1f023bd052d91d1fa93f50a2eb670ef8be81b61587f",
"MacAddress": "02:42:c0:a8:b2:02",
"IPv4Address": "192.168.178.2/24",
"IPv6Address": ""
}
},
"Options": {
"parent": "eth0"
},
"Labels": {} …
Run Code Online (Sandbox Code Playgroud) docker ×9
macvlan ×9
networking ×3
docker-swarm ×2
containers ×1
linux ×1
nic ×1
raspberry-pi ×1
raspbian ×1
routes ×1