无法在 Docker-Compose 内部 forward/map 移植
Unable to forward/map port internaly in Docker-Compose
我目前有一个包含 3 个不同数据库的应用程序(用于测试)。我有以下 docker 图片:
Docker 文件
FROM golang:1.15
WORKDIR /myapp
# Download wait for it tool.
ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /wait-for-it
RUN chmod +x /wait-for-it
及以下docker-compose.yml
version: '3.7'
services:
app:
build:
context: .
dockerfile: Dockerfile.dev
volumes:
- .:/app
command: sh -c "/wait-for-it postgres:10001 -- /wait-for-it oracle:10000 -- /wait-for-it mongodb:10002"
depends_on:
- oracle
- mongodb
- postgres
ports:
- "8080:8080"
oracle:
image: chameleon82/oracle-xe-10g:latest
ports:
- "10000:8080"
expose:
- 10000
postgres:
image: postgres:9.6-alpine
ports:
- "10001:5432"
environment:
- POSTGRES_HOST_AUTH_METHOD=trust
- POSTGRES_DB=testdb
expose:
- 10001
mongodb:
image: mongo:latest
ports:
- "10002:27017"
expose:
- 10002
如您所见,我的应用程序在 8080 上侦听,但 Oracle 也是如此。我知道我可以更改我的应用程序端口,但我仍然想将 Oracle 切换到另一个端口。我试图通过端口映射实现它,但我确实觉得它只适用于主机,不适用于 docker-compose,我错了吗?
将 Docker Compose 网络(即 app
、oracle
)中的服务视为不同的主机。每个都可以通过其服务名称寻址,即 app
应该通过该名称 (oracle
) 引用 oracle
服务。
端口映射允许您将 Docker Compose 网络中的服务端口公开(和映射)到(可能不同的)主机端口。这通常是因为主机具有端口 spaces (0...65535) 的单一维度,而 Docker Compose 网络中的 each 服务具有端口 space。 2 个服务(例如 http1
和 http2
)可以各自使用端口,例如8080
但主机上只有一个 8080
,因此,要在您的主机上公开这些服务中的每一个,就必须让步;一个也可以在主机的 8080
上,但另一个需要在其他地方,也许 8081
.
在你的情况下,例如oracle
运行 在 Docker Compose 网络中的 8080
上,并暴露在主机的端口 10000
上。就 app
服务而言,此服务在 Docker Compose 网络中以 oracle:8080
(8080
而不是 10000
)的形式提供。
expose
语法纯粹是记录性的,没有任何功能作用。
正在回复评论
如果我 运行 你的 Compose 脚本 as-is,它不起作用。这是预期的,因为例如postgres
在 Compose 网络中的 5432
上可用,但在 10001
上可用
docker-compose logs app
Attaching to 63690852_app_1
app_1 | wait-for-it: waiting 15 seconds for postgres:10001
app_1 | wait-for-it: timeout occurred after waiting 15 seconds for postgres:10001
app_1 | wait-for-it: waiting 15 seconds for oracle:10000
app_1 | wait-for-it: timeout occurred after waiting 15 seconds for oracle:10000
app_1 | wait-for-it: waiting 15 seconds for mongodb:10002
app_1 | wait-for-it: timeout occurred after waiting 15 seconds for mongodb:10002
如果我更正端口:
command: sh -c "/wait-for-it postgres:5432 -- /wait-for-it oracle:8080 -- /wait-for-it mongodb:27017"
它按预期工作:
docker-compose logs app
Attaching to 63690852_app_1
app_1 | wait-for-it: waiting 15 seconds for postgres:5432
app_1 | wait-for-it: postgres:5432 is available after 0 seconds
app_1 | wait-for-it: waiting 15 seconds for oracle:8080
app_1 | wait-for-it: oracle:8080 is available after 8 seconds
app_1 | wait-for-it: waiting 15 seconds for mongodb:27017
app_1 | wait-for-it: mongodb:27017 is available after 0 seconds
我目前有一个包含 3 个不同数据库的应用程序(用于测试)。我有以下 docker 图片:
Docker 文件
FROM golang:1.15
WORKDIR /myapp
# Download wait for it tool.
ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /wait-for-it
RUN chmod +x /wait-for-it
及以下docker-compose.yml
version: '3.7'
services:
app:
build:
context: .
dockerfile: Dockerfile.dev
volumes:
- .:/app
command: sh -c "/wait-for-it postgres:10001 -- /wait-for-it oracle:10000 -- /wait-for-it mongodb:10002"
depends_on:
- oracle
- mongodb
- postgres
ports:
- "8080:8080"
oracle:
image: chameleon82/oracle-xe-10g:latest
ports:
- "10000:8080"
expose:
- 10000
postgres:
image: postgres:9.6-alpine
ports:
- "10001:5432"
environment:
- POSTGRES_HOST_AUTH_METHOD=trust
- POSTGRES_DB=testdb
expose:
- 10001
mongodb:
image: mongo:latest
ports:
- "10002:27017"
expose:
- 10002
如您所见,我的应用程序在 8080 上侦听,但 Oracle 也是如此。我知道我可以更改我的应用程序端口,但我仍然想将 Oracle 切换到另一个端口。我试图通过端口映射实现它,但我确实觉得它只适用于主机,不适用于 docker-compose,我错了吗?
将 Docker Compose 网络(即 app
、oracle
)中的服务视为不同的主机。每个都可以通过其服务名称寻址,即 app
应该通过该名称 (oracle
) 引用 oracle
服务。
端口映射允许您将 Docker Compose 网络中的服务端口公开(和映射)到(可能不同的)主机端口。这通常是因为主机具有端口 spaces (0...65535) 的单一维度,而 Docker Compose 网络中的 each 服务具有端口 space。 2 个服务(例如 http1
和 http2
)可以各自使用端口,例如8080
但主机上只有一个 8080
,因此,要在您的主机上公开这些服务中的每一个,就必须让步;一个也可以在主机的 8080
上,但另一个需要在其他地方,也许 8081
.
在你的情况下,例如oracle
运行 在 Docker Compose 网络中的 8080
上,并暴露在主机的端口 10000
上。就 app
服务而言,此服务在 Docker Compose 网络中以 oracle:8080
(8080
而不是 10000
)的形式提供。
expose
语法纯粹是记录性的,没有任何功能作用。
正在回复评论
如果我 运行 你的 Compose 脚本 as-is,它不起作用。这是预期的,因为例如postgres
在 Compose 网络中的 5432
上可用,但在 10001
docker-compose logs app
Attaching to 63690852_app_1
app_1 | wait-for-it: waiting 15 seconds for postgres:10001
app_1 | wait-for-it: timeout occurred after waiting 15 seconds for postgres:10001
app_1 | wait-for-it: waiting 15 seconds for oracle:10000
app_1 | wait-for-it: timeout occurred after waiting 15 seconds for oracle:10000
app_1 | wait-for-it: waiting 15 seconds for mongodb:10002
app_1 | wait-for-it: timeout occurred after waiting 15 seconds for mongodb:10002
如果我更正端口:
command: sh -c "/wait-for-it postgres:5432 -- /wait-for-it oracle:8080 -- /wait-for-it mongodb:27017"
它按预期工作:
docker-compose logs app
Attaching to 63690852_app_1
app_1 | wait-for-it: waiting 15 seconds for postgres:5432
app_1 | wait-for-it: postgres:5432 is available after 0 seconds
app_1 | wait-for-it: waiting 15 seconds for oracle:8080
app_1 | wait-for-it: oracle:8080 is available after 8 seconds
app_1 | wait-for-it: waiting 15 seconds for mongodb:27017
app_1 | wait-for-it: mongodb:27017 is available after 0 seconds