我有以下 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。
最佳答案
鉴于您的要求,这将有点令人费解,但它应该可以工作。
这里的目标是在不需要运行用户手动干预的情况下修改主机上的/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 语法。 或者
请注意,在这两种情况下,我都假设端口 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 的基本页面。
关于docker-compose 主机的 ip/hostname,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50539700/