首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >设置docker固定IP时出错: network> <container>使用未定义的网络<现有docker

设置docker固定IP时出错: network> <container>使用未定义的网络<现有docker
EN

Stack Overflow用户
提问于 2021-01-26 03:16:06
回答 2查看 131关注 0票数 0

我有一个容器,我想有一个固定的IP。

我的相关设置(docker-compose)如下:

代码语言:javascript
运行
复制
version: '3'

networks:
  default:
    external:
      name: srv

services:

  caddy:
    image: caddy
    container_name: caddy
    volumes:
      - /etc/docker/data/caddy/Caddyfile:/etc/caddy/Caddyfile
      - /etc/docker/data/caddy/data:/data
      - /etc/docker/data/caddy/config:/config
    ports:
      - 80:80
      - 443:443
      - 2015:2015
    environment:
      - ACME_AGREE=true
    restart: unless-stopped
    # networks:
    #   srv:
    #     ipv4_address: 172.19.0.254

当最后几行被注释掉时,一切都很好。当我取消对它们的注释时,重新启动caddy容器会产生错误

代码语言:javascript
运行
复制
ERROR: Service "caddy" uses an undefined network "srv"

caddy容器正确运行时对其进行检查:

代码语言:javascript
运行
复制
~ # docker inspect caddy
[
    {
        "Id": "37904d87c82c4612f48bcc9952b6505d871a816336c6b242b4ab3fae51cbfa95",
        "Created": "2021-01-25T18:27:29.686179872Z",
        "Path": "caddy",
(...)        

        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "1a4360ebfe25eff6dffec0f9ec049389da6e53e84eaf76db23bf6028868b31f3",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "2015/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "2015"
                    }
                ],
                "2019/tcp": null,
                "443/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "443"
                    }
                ],
                "80/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "80"
                    }
                ]
            },
            "SandboxKey": "/var/run/docker/netns/1a4360ebfe25",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "",
            "Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "",
            "Networks": {
                "srv": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": [
                        "caddy",
                        "37904d87c82c"
                    ],
                    "NetworkID": "36b7471fa0f16a74531b011ce6762cf66a802fda7622d70d66b6fb130a2398ea",
                    "EndpointID": "8dea6be732eda01a9b4d6cc0a26df2eca8a6df1a6f6d7a961fb46820a6ef9d58",
                    "Gateway": "172.19.0.1",
                    "IPAddress": "172.19.0.8",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:13:00:08",
                    "DriverOpts": null
                }
            }
        }
    }
]

如何强制容器使用固定IP?

注意:一个标题类似的问题(ERROR: Service "xxx" uses an undefined network "xxx")解决了缺乏网络定义的问题(不是我的情况)

EN

回答 2

Stack Overflow用户

发布于 2021-01-26 03:46:24

当你说在顶层

代码语言:javascript
运行
复制
networks:
  default: { ... }

然后,当您在每个服务配置中显式引用该网络时,它需要使用匹配的组合名称default

代码语言:javascript
运行
复制
networks:
  # vvv the name of the top-level `networks:` item
  #     (probably different from the `docker network create` name)
  default:
    ipv4_address: 172.19.0.254

网络的“真实”Docker名称在这里并不重要;在组合文件中,您总是在顶级networks:块下使用该名称。

(显式设置容器的私有IPv4地址有点不寻常,通常不需要这样做。如果您没有每个服务的networks:,它将默认连接到default网络,即使您已经在顶层手动重新配置了该网络。)

票数 1
EN

Stack Overflow用户

发布于 2021-01-26 03:46:06

caddy服务不使用网络的外部名称,而只是看到default。尝试更新网络定义:

代码语言:javascript
运行
复制
networks:
  srv:
    external: true

检查Compose file version 3 reference

您还可以指定网络的名称,将其与合成文件中用于引用网络的名称分开:

代码语言:javascript
运行
复制
version: "3.9"
networks:
  outside:
    external:
      name: actual-name-of-network
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65891031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档