是否有可能通过docker-compose公开http端口?

我在本地机器上运行postgres和keycloak图像。 这两个图像都configuration了暴露的端口。 但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 

码头工人

HTTP是一种坐在TCP之上的协议,所以如果Docker通过TCP公开一个端口(而不是UDP,另一种select),那么你可以通过HTTP连接到那个端口, 假如说HTTP正在监听那个端口在容器内。

所以如果你不能用上面的组合文件连接到http:// localhost:8080 ,这可能意味着keycloak服务或者没有任何东西在容器内的端口8080上监听,或者任何的监听都不会说HTTP ,或者听着什么,说什么HTTP会因为其他原因拒绝连接。

要彻底排除问题是端口映射或主机上的东西,在容器内跳(使用docker exec )并尝试从内部连接到8080; 如果你不能,那么你已经确认问题是什么在容器内运行,而不是与Docker相关的任何东西。

看来端口暴露是通过http:// {docker-machine-ip}:{port}连接到docker机器,并且能够通过localhost连接到docker机器,需要在虚拟机中configuration端口转发。

本地虚拟机端口转发

在这个configuration之后,我可以通过http:// localhost:{port}连接到所有正在运行的容器