docker-compose主机的ip / hostname

时间:2018-05-26 05:42:44

标签: docker docker-compose

我有一个以下的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设置。

4 个答案:

答案 0 :(得分:1)

根据您的要求,这会有点复杂,但它应该有效。

这里的目标是修改主机上的/ etc / hosts,而无需运行用户的手动干预。非功能性要求是,当应用程序在非本地运行时(即,不运行应用程序的nginx或支持容器的更改),它不应该影响您的应用程序。更改应限于docker-compose文件和实用程序脚本。

为此,我建议使用以下两种方法之一:

  1. 一个bash脚本,如果条目尚未存在,则会将条目插入其/ etc / hosts 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语法。
  2. OR

    1. 创建一个新的docker容器,它将主机的/ etc / hosts文件映射到容器中的/ tmp / hosts。然后,您可以在新的docker容器中使用网络发现来获取Nginx容器的IP,并使用与上面相同的方法将其添加到hosts文件中。这里唯一的好处是您不需要静态IP。我认为选项1更容易。
    2. 请注意,在这两种情况下,我都假设端口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是为其他服务预定义的。