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
容器,不会 运行 app
或 postgres
. 您可以 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>
我有以下 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
容器,不会 运行 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
它是 运行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>