我在本地机器上运行postgres和keycloak图像 . 这两个图像都配置了暴露的端口 . 但是docker机器只通过TCP暴露端口 . 所以我能够通过TCP连接到postgres,但是无法通过HTTP连接到keycloack的localhost:8080 .
因此可以通过HTTP连接到docker暴露的端口 .
泊坞窗,compose.yml
postgres:
image: postgres:9.6.3
volumes:
- ./db/init:/docker-entrypoint-initdb.d
environment:
- POSTGRES_USER=root
- POSTGRES_PASSWORD=root
ports:
- 5432:5432
keycloak:
image: jboss/keycloak-postgres
environment:
- KEYCLOAK_LOGLEVEL=DEBUG
- POSTGRES_DATABASE=user-service
- POSTGRES_USER=root
- POSTGRES_PASSWORD=root
links:
- postgres:postgres
ports:
- "8080:8080"
- "9999:9990"
- "443:8443"
volumes:
- ./data:/data
2 回答
HTTP是一种基于TCP的协议,因此如果Docker通过TCP公开端口(而不是UDP,另一种选择),那么您可以通过HTTP连接到该端口, provided something that speaks HTTP is listening on that port inside the container.
因此,如果您无法使用上述撰写文件连接到http://localhost:8080,这可能意味着
keycloak
服务要么没有收听,要么说是HTTP因为某些其他原因而拒绝连接 .要完全排除问题是端口映射或主机上的某些内容,请跳转到容器内(使用
docker exec
)并尝试从内部连接到8080;如果你能确认问题是在容器内运行的是什么,而不是与Docker相关的任何东西 .看来端口暴露是通过http:// :连接到docker机器,并且能够通过localhost连接到它,需要在虚拟机中配置端口转发 .
在这个配置之后,我能够使用http:// localhost:连接到我所有正在运行的容器