我目前有一个包含 3 个不同数据库的应用程序(用于测试)。我有以下泊坞窗图像:
文件
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 网络中的服务端口暴露(和映射)到(可能不同的)主机端口。这通常是因为,主机具有单一维度的端口空间 (0...65535),而Docker Compose 网络中的每个服务都有一个端口空间。2 个服务(例如http1
和http2
)可能每个都使用端口,例如,8080
但8080
主机上只有一个,因此,要在您的主机上公开这些服务中的每一个,必须让步;一个也可以在主机上,8080
但另一个可能需要在其他地方8081
。
在您的情况下,例如在 Docker Compose 网络中oracle
运行并8080
在主机的端口上公开10000
。就app
服务而言,该服务在 Docker Compose 网络中作为oracle:8080
(8080
非10000
)可用。
该expose
语法是纯粹的纪录片并没有功能的影响。
如果我按原样运行您的 Compose 脚本,则它不起作用。这是意料之中的,因为例如在 Compose 网络中postgres
可用,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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句