簡體   English   中英

docker-compose 主機名在容器之間進行通信適用於 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容器很可能沒有運行。 它出現在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容器,它不會運行apppostgres 您可以 ping postgres ,因為在您使用docker-compose run nuxt bash之前它已經在運行

為了能夠在運行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是否正在運行,並docker logs以了解它可能已退出的原因。

正如@Pierre 所說,很可能您的容器沒有運行。

從您的問題 docker-compose 下面來看,您似乎沒有在該容器中執行任何操作,例如運行服務器或 uwsgi 以使其保持活動狀態。

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

要使其在 docker 組合中運行,請添加如下命令指令。

  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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM