文章目錄
  1. 1. 问题
  2. 2. GOOGLE
  3. 3. 探索
  4. 4. 解决方案

问题

虚拟机上安装docker之后,docker容器内无法访问外网。DNS解析和部分http可以通信。

虚拟机版本为:ubuntu 14.04
docker版本为:17.07.0-ce
虚拟环境为:openstack

GOOGLE

搜索发现可能是由于openstack默认mtu是1450,而docker默认mtu是1500导致的。ifconfig查看,果然如此。eth0 mtu是1450.而docker0 mtu是1500.

探索

尝试修改docker0的mtu。发现了两个方案:

1,编辑/etc/docker/daemon.json文件。ubuntu上默认没有这个文件。可以新建,内容如下。

{
  "mtu": 1500
}

2,编辑/etc/default/docker文件。ubuntu上有这个文件。默认内容为空。

DOCKER_OPTS=“--mtu=1450"

测试发现这两个方法修改之后。docker0显示的mtu依然是1500。此时陷入迷茫。

通过docker network inspect bridge 命令发现bridge网络的属性中mtu被设置成了1450.如下:

"Options": {

    "com.docker.network.bridge.default_bridge": "true",

    "com.docker.network.bridge.enable_icc": "true",

    "com.docker.network.bridge.enable_ip_masquerade": "true",

    "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",

    "com.docker.network.bridge.name": "docker0",

    "com.docker.network.driver.mtu": "1450"

},

而我测试的docker容器使用了docker compose。看了下docker compose的文档。得知docker compose会自动创建一个新的网络。可以通过如下的方式配置网络的参数:

networks:
  frontend:
    # Use a custom driver
    driver: custom-driver-1
  backend:
    # Use a custom driver which takes special options
    driver: custom-driver-2
    driver_opts:
      foo: "1"
      bar: "2"

先在docker-compose.yml中配置如下:

networks:
 default:
  mtu: 1450

发现并没有效果。使用docker network inspect compose-default 查看,参数一栏写的是:

"mtu": "1450"

注意到之前在bridge中,参数一栏是”com.docker.network.driver.mtu”,所以尝试修改docker-compose.yml文件中参数为:

networks:
 default:
  com.docker.network.driver.mtu: 1450

重启生效。

解决方案

所以在docker-compose.yml文件中修改networks的参数mtu为1450即可。

疑问:

docker0显示的mtu并不会发生改变。看到一些文档里写的是修改docker0属性,可能是对于docker0的理解有误。

文章目錄
  1. 1. 问题
  2. 2. GOOGLE
  3. 3. 探索
  4. 4. 解决方案