【问题标题】:Docker NGINX container cannot resolve hostDocker NGINX 容器无法解析主机
【发布时间】:2021-04-09 17:43:14
【问题描述】:

我遇到了一个奇怪的问题,docker 无法解析我的一个网络

version: "3.5"

services:
        nginx:
                container_name: nginx_al
                image: nginx:latest
                volumes:
                        - ./ssl:/ssl/
                        - ./nginx.conf:/etc/nginx/nginx.conf:ro
                ports:
                        - "80:80"
                        - "443:443"
                        - "8080:8080"
                depends_on:
                        - keycloak
                        - server
                        - admin
                        - client
                networks:
                        - client
                        - admin
                        - backend
                        - keycloak
        keycloak:
                container_name: keycloak_al
                image: jboss/keycloak:11.0.1
                env_file:
                        - ".keycloak.env"
                restart: unless-stopped
                networks:
                        - keycloak
                        - postgres
        server:
                container_name: al_backend_server
                image: databending/al-backend
                depends_on:
                        - keycloak
                        - postgres
                networks:
                        - backend
                        - keycloak
                        - postgres
                volumes:
                        - images-data:/app/server/public
                        - ./.server.env:/app/server/.env
        postgres:
                container_name: al_postgres
                image: postgres
                env_file:
                        ".postgres.env"
                networks:
                        - postgres
                volumes:
                  - ./init.sql:/docker-entrypoint-initdb.d/init.sql
                  - postgres-data:/var/lib/postgresql/data
                restart: unless-stopped
        admin:

                networks:
                        - admin
                container_name: al_admin
                image: databending/admin-panel
                volumes:
                        - ./config.json:/usr/share/nginx/html/config.json
                        - ./.client.env:/usr/share/nginx/html/.env
        client:
                networks:
                        - client
                container_name: al_client
                image: databending/al-client
                volumes:
                        - ./.client.js:/usr/share/nginx/html/__snowpack__/env.js


volumes: 
        images-data:
                driver: local
        postgres-data:
                driver: local
networks:
        postgres:
                driver: bridge

        keycloak:
                driver: bridge
        client:
                driver: bridge
        admin:
                driver: bridge
        backend:
                driver: bridge

我不会粘贴 nginx.conf 文件,因为它包含敏感信息,而且我知道问题并非源于此。如果我运行 curl http://backend:4000/graphql(我在服务器容器中运行了一个 node.js 服务器)。 curl 会响应

curl(6) 无法解析主机:后端

但是,如果我尝试 curl keycloak,则没有问题

Docker 网络检查

[
    {
        "Name": "app_backend",
        "Id": "e2793e3df1ddfa000f537b9ad18f5ed0409d9cf4c235f07634fe039dbe551d0b",
        "Created": "2021-04-09T05:03:35.417548053Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.25.0.0/16",
                    "Gateway": "172.25.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "f0d69bc1ca28b459147d06bff2b6938c5e85c2efd1e8e015c3f3857ef60cc780": {
                "Name": "nginx_al",
                "EndpointID": "86875b4fadba913e3db9060fc1b4a1e462e455b2fda87847db71ecccfd7cbd3d",
                "MacAddress": "02:42:ac:19:00:03",
                "IPv4Address": "172.25.0.3/16",
                "IPv6Address": ""
            },
            "fa79b46119905035f404026958cdad3cf5a024f25072a778ad7085503d70fb44": {
                "Name": "al_backend_server",
                "EndpointID": "239837a5197d1a6c02df6ea326a710d884983edd4fc5b8f2b7f514c95b7cffe6",
                "MacAddress": "02:42:ac:19:00:02",
                "IPv4Address": "172.25.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {
            "com.docker.compose.network": "backend",
            "com.docker.compose.project": "app",
            "com.docker.compose.version": "1.28.6"
        }
    }
]

【问题讨论】:

    标签: docker docker-compose docker-networking


    【解决方案1】:

    缺少重要信息,但我猜:

    • keycloak 是一个网络和一个容器。如果你 curl keycloak,你会从容器而不是网络中得到答案。
    • 虽然后端是网络而不是容器。那么谁应该回答卷曲?

    如果你想在 nginx 后面找到一些东西,没有 conf(可以被剥离),那将是一个疯狂的猜测。 如果你想访问你的 al_backend_server-Container 试试 curl server

    【讨论】:

    • 感谢您的帮助!可悲的是,现在有点困惑,因为我认为“http:/WHATEVER”实际上是网络名称而不是容器名称。可能需要做更多的研究,哈哈
    • 就像一个真实的网络。您可以拥有与“主机网络”物理分离的不同子网(“桥接网络”)。作为网络成员的每个容器就像该网络上的真实设备一样。它获取 IP 地址和 MAC 地址并通过网关进行通信。因此,除了您打开的端口(-p 或“端口:”)之外,它与您的主机分开,但可以在其网络内部完全通信而无需打开任何端口。因为搞乱 IP 不是很方便,所以有一个 Docker DNS 可以将容器名称转换为 IP,因此您可以通过名称访问它。
    猜你喜欢
    • 2019-12-24
    • 1970-01-01
    • 2018-02-13
    • 2015-05-29
    • 1970-01-01
    • 2017-04-12
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多