我有一个以下的docker-compose文件:
nginx:
image: nginx
hostname: myservice.local
volumes:
- nginx.local.conf:/etc/nginx/conf.d/myservice.conf
container_name: goout-nginx
还有一种方法可以让docker-compose为主机设置myservice.local吗?目前在主机上调用它并没有做任何事情:
$ ping myservice.local
ping: cannot resolve myservice.local: Unknown host
我不想手动更新本地/etc/hosts
。
编辑:
我的问题似乎比我之前想象的要复杂得多。我正在尝试为我的同事创建一个开发设置,他们可以在他们的机器上本地运行。
这应该是在浏览器中的80/443
端口上运行的易于运行的应用程序。这不能在localhost:80/443
上运行,因为这些端口已被其机器上的apache使用和使用。为此,我希望正在运行的计算机已分配IP地址,以便只需打开myservice.local
即可与应用程序进行交互。这不是外部世界可访问的,只有主机可以访问。
设置应该非常简单 - 我希望只需运行docker-compose up
即可实现所有这些 - 我希望避免任何复杂的网络,IP表或/ etc / hosts设置。
答案 0 :(得分:1)
根据您的要求,这会有点复杂,但它应该有效。
这里的目标是修改主机上的/ etc / hosts,而无需运行用户的手动干预。非功能性要求是,当应用程序在非本地运行时(即,不运行应用程序的nginx或支持容器的更改),它不应该影响您的应用程序。更改应限于docker-compose文件和实用程序脚本。
为此,我建议使用以下两种方法之一:
grep -q -F '<static_ip> myservice.local' /etc/hosts || echo '<static_ip> myservice.local' >> /etc/hosts
,然后使用docker-compose up -d
启动docker compose。该脚本是幂等的,因此如果grep在/ etc / hosts中找到该行,则不应再次添加该行。这需要您为nginx容器分配静态IP,但是您可以在docker-compose中执行此操作,并且它不会与您的主机冲突,这应该符合您的要求。将文件命名为“startMyApp.sh”,以便明确它的作用,并且你的非技术娴熟的人应该倾向于使用它而不是docker-compose语法。OR
请注意,在这两种情况下,我都假设端口80/443是从您的网络服务器容器中公开的。除非您正在运行代理以重新映射它们,否则您需要这样做。
示例运行:
version: '2'
services:
tomcat:
image: tomcat
ports:
- "1234:8080"
hostname: myservice.local
networks:
my_network:
ipv4_address: 10.5.0.5
networks:
my_network:
driver: bridge
ipam:
config:
- subnet: 10.5.0.0/16
gateway: 10.5.0.1
grep -q -F "myservice.local 10.5.0.5" || sudo echo "myservice.local 10.5.0.5" >> /etc/hosts
docker-compose up -d
打开Web浏览器并浏览到“myservice.local:8080”,您可以在那里看到apache tomcat的基页。
答案 1 :(得分:0)
您也可以尝试使用environment
:
nginx:
image: nginx
volumes:
- nginx.local.conf:/etc/nginx/conf.d/myservice.conf
container_name: goout-nginx
environment:
- HOSTNAME=myservice.local
答案 2 :(得分:0)
在端口8080或其他端口上托管docker。
使用Apache或其他服务在本地收听80。
使用您自己的配置文件或您决定的任何规则将请求上传到Docker 8080。
节拍通过etc / hosts,甚至不接受通配符。
连接hosts文件还需要特定于平台的预防措施。
答案 3 :(得分:0)
如果您使用的是macOS(也可能是linux),则可以添加与所需顶级域名称相同的文件,例如test
下的/etc/resolver/
,内容如下:
nameserver 127.0.0.1
这样,所有发送到* .test的请求都将解析到您的本地主机。据我所知,这在macOS上不适用于.local
,因为该TLD是为其他服务预定义的。