Docker 配置网络教程 - macvlan 网络

原文地址

本教程基于连接到 macvlan 网络的独立容器。在这种网络中,Docker 主机接受来自多个 MAC 地址和对应 IP 地址的请求,并将这些请求路由到合适的容器。

1. 目标

本教程的目标是设置一个桥接macvlan 网络并将一个容器连接到该网络,然后设置一个 802.1q trunked macvlan 网络并将一个容器连接到该网络。

2. 先决条件

  • 大多数云提供商阻止 macvlan 网络。可能需要物理访问你的网络设备(You may need physical access to your networking equipment)。
  • macvlan 网络驱动程序只能在 Linux 主机上工作。
  • Linux 内核版本至少是 3.9,建议使用 4.0 或以上内核。
  • 示例中假设你的网络接口是 eth0。请根据需要替换。

3. 网桥示例

在这个简单的网桥示例中,流量经过 eth0,Docker 将流量路由到你的使用 MAC 地址的容器。要将设备连接到你的网络,你的容器需要是物理连接到网络上的(To network devices on your network, your container appears to be physically attached to the network.)。

1. 创建名为 my-macvlan-net 的 macvlan 网络。定义子网、网关和根据实际环境定义的 parent 值。
$ docker network create -d macvlan \
  --subnet=172.16.86.0/24 \
  --gateway=172.16.86.1 \
  -o parent=eth0 \
  my-macvlan-net

可以通过 docker network lsdocker network inspect pub_net 命令来验证网络存在并且是 macvlan 网络。

2. 启动 alpine 容器并连接到 my-macvlan-net 网络

-dit 标志后台启动容器,并且可以后面连接上这个容器。--rm 标志表示容器在停止后就被删除。

$ docker run --rm -itd \
  --network my-macvlan-net \
  --name my-macvlan-alpine \
  alpine:latest \
  ash
3. 检查 my-macvlan-alpine 容器,注意 Networks 中的 MacAddress 关键字:
$ docker container inspect my-macvlan-alpine

...truncated...
"Networks": {
  "my-macvlan-net": {
      "IPAMConfig": null,
      "Links": null,
      "Aliases": [
          "bec64291cd4c"
      ],
      "NetworkID": "5e3ec79625d388dbcc03dcf4a6dc4548644eb99d58864cf8eee2252dcfc0cc9f",
      "EndpointID": "8caf93c862b22f379b60515975acf96f7b54b7cf0ba0fb4a33cf18ae9e5c1d89",
      "Gateway": "172.16.86.1",
      "IPAddress": "172.16.86.2",
      "IPPrefixLen": 24,
      "IPv6Gateway": "",
      "GlobalIPv6Address": "",
      "GlobalIPv6PrefixLen": 0,
      "MacAddress": "02:42:ac:10:56:02",
      "DriverOpts": null
  }
}
...truncated
4. 通过运行两个 docker exec 命令来了解容器如何查看自己的网络接口
$ docker exec my-macvlan-alpine ip addr show eth0

9: eth0@tunl0: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:10:56:02 brd ff:ff:ff:ff:ff:ff
inet 172.16.86.2/24 brd 172.16.86.255 scope global eth0
   valid_lft forever preferred_lft forever
$ docker exec my-macvlan-alpine ip route

default via 172.16.86.1 dev eth0
172.16.86.0/24 dev eth0 scope link  src 172.16.86.2
5. 停止容器(因为 --rm 标志,Docker 会删除容器),删除网络。
$ docker container stop my-macvlan-alpine

$ docker network rm my-macvlan-net

4. 802.1q trunked bridge 示例

在 802.1q trunked 网桥示例中,流量流经 eth0 的子接口(称为 eth0.10),Docker 使用其 MAC 地址将流量路由到你的容器。要将网络中的设备联网,你的容器看起来就是物理连接到网络上的。
原文:
In the 802.1q trunked bridge example, your traffic flows through a sub-interface of eth0 (called eth0.10) and Docker routes traffic to your container using its MAC address. To network devices on your network, your container appears to be physically attached to the network.

1. 创建名为 my-8021q-macvlan-net 的 macvlan 网络。定义子网、网关和根据实际环境定义的 parent 值。
$ docker network create -d macvlan \
  --subnet=172.16.86.0/24 \
  --gateway=172.16.86.1 \
  -o parent=eth0.10 \
  my-8021q-macvlan-net

通过 docker network lsdocker network inspect pub_net 命令验证网络是否存在,是不是 macvlan 网络,并且有 parent 0.10。可以在 Docker 主机上使用 ip addr show 命令来验证接口 eth0.10 存在并且有独立的 IP 地址。

2. 启动 alpine 容器并连接到 my-8021q-macvlan-net 网络

-dit 标志后台启动容器,并且可以后面连接上这个容器。--rm 标志表示容器在停止后就被删除。

$ docker run --rm -itd \
  --network my-8021q-macvlan-net \
  --name my-second-macvlan-alpine \
  alpine:latest \
  ash
3. 检查 my-second-macvlan-alpine 容器,注意 Networks 中的 MacAddress 关键字:
$ docker container inspect my-second-macvlan-alpine

...truncated...
"Networks": {
  "my-8021q-macvlan-net": {
      "IPAMConfig": null,
      "Links": null,
      "Aliases": [
          "12f5c3c9ba5c"
      ],
      "NetworkID": "c6203997842e654dd5086abb1133b7e6df627784fec063afcbee5893b2bb64db",
      "EndpointID": "aa08d9aa2353c68e8d2ae0bf0e11ed426ea31ed0dd71c868d22ed0dcf9fc8ae6",
      "Gateway": "172.16.86.1",
      "IPAddress": "172.16.86.2",
      "IPPrefixLen": 24,
      "IPv6Gateway": "",
      "GlobalIPv6Address": "",
      "GlobalIPv6PrefixLen": 0,
      "MacAddress": "02:42:ac:10:56:02",
      "DriverOpts": null
  }
}
...truncated
4. 通过运行两个 docker exec 命令来了解容器如何查看自己的网络接口
$ docker exec my-second-macvlan-alpine ip addr show eth0

11: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:10:56:02 brd ff:ff:ff:ff:ff:ff
inet 172.16.86.2/24 brd 172.16.86.255 scope global eth0
   valid_lft forever preferred_lft forever
$ docker exec my-second-macvlan-alpine ip route

default via 172.16.86.1 dev eth0
172.16.86.0/24 dev eth0 scope link  src 172.16.86.2
5. 停止容器(因为 --rm 标志,Docker 会删除容器),删除网络。
$ docker container stop my-second-macvlan-alpin

$ docker network rm my-8021q-macvlan-net
<think>好的,我现在需要帮用户分析他们提供的命令输出,解释当前OCR服务的网络配置和可能的问题。首先,用户执行了docker inspect ocr_service,并查看了Networks部分。显示该容器连接到了网络"zjck-net",IP地址是172.18.0.6,网关是172.18.0.1。接着,用户进入容器内部,检查端口8866是否在监听,结果发现该端口在0.0.0.0上监听,说明服务对所有接口开放。然后用户进行了两次nslookup,解析ocr_service都得到了172.18.0.6,即容器自身的IP地址。 接下来要逐步分析这些信息。首先,确认网络配置是否正确。容器连接到自定义网络zjck-net,Docker的自定义网络通常支持容器间通过服务名进行DNS解析。这里nslookup ocr_service返回了正确的IP,说明DNS解析正常。但用户可能遇到的问题是,其他容器无法通过服务名ocr_service访问该服务,或者外部无法访问端口8866。 然后,检查端口监听情况。ss命令显示8866端口在容器内部监听所有接口,这意味着服务配置正确,可以接受来自外部的连接。但需要确认Docker的端口映射是否正确。用户提供的docker inspect输出中没有显示端口映射部分,可能容器启动时没有使用-p参数发布端口,导致外部主机无法访问该端口。需要检查docker run命令或docker-compose.yml中是否将容器的8866端口映射到宿主机的某个端口。 此外,用户可能在同一个Docker网络中的其他容器可以通过服务名ocr_service和端口8866访问该服务,但外部访问需要通过宿主机的映射端口。如果用户没有设置端口映射,外部请求无法到达容器。因此,解决方案是确保在运行容器时添加-p 宿主机端口:8866的参数,或者检查docker-compose文件中的端口配置。 总结可能的问题点:1. 容器没有端口映射,导致外部无法访问;2. 防火墙或安全组规则阻止了宿主机端口的访问;3. 服务虽然监听0.0.0.0,但可能存在配置错误,比如绑定了错误的主机。需要用户确认端口映射是否存在,并检查宿主机防火墙设置。</think>以下是对你提供的命令及输出的逐步分析: ### 一、网络配置分析 1. **容器网络信息** (`docker inspect`) - 容器接入的网络名称:`zjck-net` (自定义桥接网络) - 容器分配的IP地址:`172.18.0.6` - 网关地址:`172.18.0.1` (Docker网络的默认网关) - 网络ID:`21d6fb779aff...` (标识Docker内部网络) -网络属于典型的Docker自定义桥接网络,提供容器间通信能力 2. **端口监听状态** (`ss -tuln`) - 检测到容器内`8866`端口在`0.0.0.0`地址监听 - 状态为`LISTEN`表示服务已正常启动 - `tcp`协议+`0.0.0.0`绑定说明服务接受任意来源的连接请求 3. **DNS解析验证** (`nslookup`) - 容器内DNS服务器:`127.0.0.11` (Docker内置DNS) - 解析`ocr_service`返回自身IP `172.18.0.6`,符合预期 - 两次解析结果一致,说明Docker DNS服务稳定 ### 二、潜在问题诊断 #### 现象推测 根据上下文,可能遇到以下问题之一: 1. **外部无法访问服务**:宿主机无法通过`IP:端口`访问容器服务 2. **容器间通信异常**:其他容器无法通过`ocr_service:8866`访问服务 #### 验证步骤 1. **检查端口映射**: ```bash docker ps --filter "name=ocr_service" --format "table {{.Names}}\t{{.Ports}}" ``` - 若输出无`0.0.0.0:XXXX->8866/tcp`格式内容,表示未配置端口发布 2. **容器间连通性测试**: ```bash # 启动测试容器 docker run -it --rm --network zjck-net alpine sh # 在测试容器中执行 apk add curl curl http://ocr_service:8866 ``` - 若连接失败,检查服务日志:`docker logs ocr_service` 3. **宿主机防火墙检查**: ```bash iptables -L -n | grep 8866 firewall-cmd --list-ports # CentOS/Fedora ufw status # Ubuntu ``` ### 三、解决方案建议 1. **添加端口映射**(若需宿主机访问): ```bash docker run -p 宿主机端口:8866 ...其他参数... ``` *示例:`-p 8080:8866` 可通过宿主机IP:8080访问* 2. **确保容器间同网络**: ```bash docker network inspect zjck-net | grep Containers ``` 确认所有需通信的容器都显示在`Containers`列表中 3. **服务健康检查**: ```bash # 容器内部执行 curl -I localhost:8866 netstat -tuln | grep 8866 ``` ### 四、配置示意图 ```plaintext 宿主机访问路径: 外部请求 -> 宿主机IP:映射端口 -> Docker NAT -> 容器IP:8866 容器间访问路径: 其他容器 -> Docker DNS解析`ocr_service` -> 容器IP:8866 ``` 当前配置中DNS解析和端口监听均正常,若仍无法访问,重点检查: 1. 服务本身的响应状态(返回有效HTTP响应) 2. 容器防火墙规则(一般Docker自动管理) 3. 应用程序绑定地址配置(需确保绑定`0.0.0.0`)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值