本例中,由于宿主机网络MTU为1450,为了不影响网络通讯,这里主动把容器网络的MTU改成和宿主机一致。
version: '3'
services:
jaeger-query:
container_name: jaeger-query-live
image: jaegertracing/jaeger-query
networks:
- jaegeruilivenetwork
ports:
- "16686:16686"
- "16687"
environment:
- "SPAN_STORAGE_TYPE=elasticsearch"
- "ES_SERVER_URLS=http://10.129.109.101:10200,http://10.129.109.102:10200,http://10.129.109.103:10200"
- "ES_USERNAME=elastic"
- "ES_PASSWORD=XXXXX"
- "LOG_LEVEL=warn"
entrypoint:
- "/go/bin/query-linux"
- "--es.index-prefix=live"
- "--es.max-span-age=168h0m0s"
restart: always
networks:
jaegeruilivenetwork:
driver: bridge
driver_opts:
com.docker.network.driver.mtu: "1450"
$ docker compose down
$ docker compose up -d
$ docker network inspect live_jaegeruilivenetwork
附录
ChatGPT 对此问题的解释
当容器的 MTU 和主机的 MTU 不匹配时,可能会出现以下问题:
- 容器无法访问主机和其他容器的网络资源:因为容器和主机之间无法正常通信,所以容器无法访问主机和其他容器的网络资源,例如数据库、消息队列等。
- 容器之间无法通信:如果在同一台主机上运行多个容器,并且它们的 MTU 不同,那么容器之间也可能无法正常通信。这会影响到多容器应用程序的正常运行,例如微服务架构。
- 数据包分片:如果容器的 MTU 比主机的 MTU 小,那么容器在发送大数据包时可能会被分片。这会增加网络延迟和负担,降低网络传输效率。
- 数据包丢失:如果容器的 MTU 比主机的 MTU 大,那么容器发送的 IP 数据包可能会被主机的网卡丢弃。这是因为主机的网卡只能处理小于或等于其 MTU 的数据包。这会导致网络连接失败,从而影响应用程序的正常运行。
为了避免这些问题,我们建议在创建 Docker 容器时,将容器的 MTU 设置为与主机相同的值。这样可以确保容器和主机之间可以正常通信,并且容器之间也可以正常通信。