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