[英]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
容器,它不會運行app
和postgres
。 您可以 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.