docker-compose 主机的 ip/hostname

标签 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。

最佳答案

鉴于您的要求,这将有点令人费解,但它应该可以工作。

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

为此,我建议以下两件事之一:

  • 一个 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 语法。

  • 或者
  • 创建一个新的 docker 容器,它将主机的/etc/hosts 文件映射到容器中的/tmp/hosts 中。然后你可以在新的docker容器中使用网络发现来获取你的Nginx容器的IP,并使用与上面相同的方法将其添加到hosts文件中。唯一的好处是您不需要静态 IP。我认为选项1要容易得多。

  • 请注意,在这两种情况下,我都假设端口 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/hostsdocker-compose up -d
    打开 Web 浏览器并浏览到“myservice.local:8080”,您可以在那里看到 apache tomcat 的基本页面。

    关于docker-compose 主机的 ip/hostname,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50539700/

    相关文章:

    node.js - 在 docker 容器中安装 Mongoose

    node.js - 文件更改后 Docker Compose 容器中的 node_modules 为空

    macos - docker-compose 命令不适用于 Mac

    python - 以普通用户身份运行时,docker-compose 给出错误 "ImportError: No module named ssl_match_hostname"

    amazon-web-services - 将Docker-Compose YML部署到AWS ECS

    docker - Azerothcore 通过 Docker 连接到互联网

    docker 纯粹从命令行构建

    docker - 我可以运行 Docker 镜像的中间层吗?

    networking - 如何从Windows 10上的容器(Docker for Windows)连接到Docker主机

    docker - 当被docker run覆盖时,为什么docker仍在运行CMD?