5

我有以下内容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"
        }
    }
]

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

4

2 回答 2

6

您的app容器很可能没有运行。它的出现docker network inspect意味着容器存在但它可能已经退出(即没有运行)。您可以使用 进行检查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存在但未运行:即使它存在于网络中,您也无法 ping 通它
  • 容器postgres存在并正在运行:您将能够 ping 它

这可能是由于docker-compose run --rm --service-ports nuxt bash 只会创建和运行nuxt容器,它不会运行app也不postgres. 您可以 ping 通postgres,因为它在您使用之前已经在运行docker-compose run nuxt bash

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

  • 让其他容器之前已经运行(例如使用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它是否正在运行,并docker logs查看它可能退出的原因。

于 2019-11-15T16:35:20.297 回答
0

正如@Pierre 所说,很可能您的容器没有运行。

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

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

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

  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,它会创建一个 psuedo-tty docker run -t -d <image> <command>

于 2019-11-21T11:12:15.363 回答