docker-撰写主机名以在容器之间进行通信适用于 postgres 但不适用于应用程序

docker-compose hostname to communicate between containers works with postgres but not app

我有以下 docker-compose.yml:

services:
  postgres:
    image: "postgres:11.0-alpine"
  app:
    build: .
    ports:
      - "4000:4000"
    depends_on:
      - postgres
      - nuxt
  nuxt:
    image: node:latest
    ports:
      - "3000:3000"

我需要 nuxt 服务来与 app 通信。

nuxt 服务 (docker-compose run --rm --service-ports nuxt bash) 中,如果我 运行

root@62cafc299e8a:/app# ping postgres 
PING postgres (172.18.0.2) 56(84) bytes of data.
64 bytes from avril_postgres_1.avril_default (172.18.0.2): icmp_seq=1 ttl=64 time=0.283 ms
64 bytes from avril_postgres_1.avril_default (172.18.0.2): icmp_seq=2 ttl=64 time=0.130 ms
64 bytes from avril_postgres_1.avril_default (172.18.0.2): icmp_seq=3 ttl=64 time=0.103 ms

但如果我这样做:

root@62cafc299e8a:/app# ping app     
ping: app: No address associated with hostname

为什么它适用于 postgres 但不适用于 app

如果我这样做 docker network inspect 4fcb63b4b1c9,它们似乎都在同一个网络上:

[
    {
        "Name": "myapp_default",
        "Id": "4fcb63b4b1c9fe37ebb26e9d4d22c359c9d5ed6153bd390b6f0b63ffeb0d5c37",
        "Created": "2019-05-16T16:46:27.820758377+02:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "53b726bdd01159b5f18e8dcb858e979e6e2f8ef68c62e049b824899a74b186c3": {
                "Name": "myapp_app_run_c82e91ca4ba0",
                "EndpointID": "b535b6ca855a5dea19060b2f7c1bd82247b94740d4699eff1c8669c5b0677f78",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            },
            "62cafc299e8a90fd39530bbe4a6af8b86098405e54e4c9e61128539ffd5ba928": {
                "Name": "myapp_nuxt_run_3fb01bb2f778",
                "EndpointID": "7eb8f5f8798baee4d65cbbfe5f0f5372790374b48f599f32490700198fa6d54c",
                "MacAddress": "02:42:ac:12:00:04",
                "IPv4Address": "172.18.0.4/16",
                "IPv6Address": ""
            },
            "9dc1c848b2e347876292650c312e8aaf3f469f2efa96710fb50d033b797124b4": {
                "Name": "myapp_postgres_1",
                "EndpointID": "a925438ad5644c03731b7f7c926cff095709b2689fd5f404e9ac4e04c2fbc26a",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {
            "com.docker.compose.network": "default",
            "com.docker.compose.project": "myapp",
            "com.docker.compose.version": "1.23.2"
        }
    }
]

那是为什么呢?也尝试使用别名,但没有成功。 :(

您的 app 容器很可能不是 运行ning。它出现在 docker network inspect 意味着容器 存在 但它可能被退出(即不是 运行ning)。可以用docker ps -a查询,例如:

$ docker ps -a
CONTAINER ID  ...  STATUS   ...                           NAMES
fe908e014fdd       Exited (0) Less than a second ago      so_app_1
3b2ca418c051       Up 2 minutes                           so_postgres_1
  • 容器 app 存在但不是 运行ning:即使它存在于网络中,您也无法 ping 通它
  • 容器 postgres 存在并且正在 运行ning:您将能够 ping 它

可能是因为 docker-compose run --rm --service-ports nuxt bash 只会创建 运行 nuxt 容器,不会 运行 apppostgres. 您可以 ping postgres 因为在您使用 docker-compose run nuxt bash

之前它已经 运行ning

为了能够在 运行 宁 docker-compose run nuxt ... 之后 ping 其他容器,您应该:

  • 之前已经运行安装了其他容器(例如使用docker-compose up -d
  • 让其他容器 depends_on 成为您尝试 运行 的容器,例如:
    nuxt:
      image: node:latest
      ports:
        - "3000:3000"
      # this will ensure posgres and app are run as well when using docker-compose run
      depends_on:
        - app
        - nuxt
    

即便如此,您的容器也可能无法启动(或启动后立即退出)并且您将无法 ping 通它。检查 docker ps -a 它是 运行ning 和 docker logs 看看它可能已经退出的原因。

正如@Pierre 所说,您的容器很可能不是 运行ning。

从下面 docker- 根据您的问题,您似乎没有在该容器中执行任何操作,例如 运行 连接服务器或 uwsgi 以使其保持活动状态。

  app:
    build: .
    ports:
      - "4000:4000"
    depends_on:
      - postgres
      - nuxt

要在 docker compose 中保留它 运行ning,请添加如下命令指令。

  app:
    build: .
    command: tail -f /dev/null #trick to stop immediate exit and keep the container alive.
    ports:
      - "4000:4000"
    depends_on:
      - postgres
      - nuxt

现在应该是'pingable'容器。

如果您希望通过 docker run 运行,请使用 -t,它会创建一个伪 tty docker run -t -d <image> <command>