如何在端口80已经被暴露的情况下访问另一个容器的端口80

92次阅读
没有评论

问题描述

在使用Docker时,有一个需求是在已经暴露了端口80的情况下,如何访问另一个容器的端口80。用户在Docker文件中运行了一些集成测试,其中包括两个容器。其中一个容器在端口80上启动了一个Web服务器,但是同样的端口也在另一个容器中被暴露了(用户无法控制client:latest镜像中暴露端口的部分)。用户尝试使用port: 8080:80将端口80转发到服务器上的8080端口,但这只会改变主机上暴露的端口,而不会改变Docker环境中的端口。
在这种情况下,用户如何连接test_clienttest_server

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

用户可以使用代理来在两个服务之间转发流量。以下是一个示例,其中包括使用certbot自动化SSL的配置。在下面的示例中,我有两个服务在端口80/443上监听(Sonarqube和Jenkins)。你还可以看到我可以通过名称引用容器主机(https://jenkins:8080)。
以下是nginx配置的示例:

server {
    listen              443 ssl;
    server_name         jenkins.hauntedmansion.io;
    ssl_certificate     /etc/letsencrypt/live/jenkins.hauntedmansion.io/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/jenkins.hauntedmansion.io/privkey.pem;
    client_max_body_size 20M;

    location / {
      proxy_set_header   Host $host;
      proxy_set_header   X-Real-IP $remote_addr;
      proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header   X-Forwarded-Proto $scheme;
      proxy_pass         http://jenkins:8080;
      proxy_read_timeout 90;
      proxy_redirect     http://127.0.0.1:8080 https://jenkins.hauntedmansion.io;
    }
}

在上面的示例中,我们使用nginx作为代理服务器,将流量从端口443转发到容器中运行的Jenkins服务(http://jenkins:8080)。这样,用户就可以通过https://jenkins.hauntedmansion.io访问Jenkins服务了。
如果你想查看完整的Docker Compose示例,请点击以下链接:
https://gist.github.com/cvega/66e0e5a2815e9b923da2c616f74dea7e

正文完