【问题标题】:Name a service in docker compose to be used as a hostname在 docker compose 中命名服务以用作主机名
【发布时间】:2020-09-19 02:25:14
【问题描述】:

我想用 docker-compose 启动一个数据库容器(例如:MongoDb),以便我可以对数据库运行一些测试。

这是我的mongodb.yml docker-compose 文件。

version: '3.7'
services:
    mongo:
        image: mongo:latest
        restart: always
        ports:
            - 27017:27017
        environment:
            - MONGO_INITDB_ROOT_USERNAME=root
            - MONGO_INITDB_ROOT_PASSWORD=example

    mongo-express:
        image: mongo-express:latest
        restart: always
        ports:
            - 8081:8081
        environment:
            - ME_CONFIG_MONGODB_ADMINUSERNAME=root
            - ME_CONFIG_MONGODB_ADMINPASSWORD=example
        depends_on:
            - mongo

当我使用docker-compose -f mongodb.yml up 运行它时,我可以成功连接到本地主机上的 MongoDb。换句话说,以下连接字符串是有效的:"mongodb://root:example@localhost:27017/admin?ssl=false"

我想使用别名的等价物,以便通过主机名potato 访问 localhost,而不是 MongoDb

在 GitLab CI/CD 中,使用 Docker 运行程序,我可以启动 mongo 容器并提供别名,而不会出现任何问题。像这样:

my_ci_cd_job:
  stage: my_stage
  services:
    - name: mongo:latest
      alias: potato
  variables:
    MONGO_INITDB_ROOT_USERNAME: root
    MONGO_INITDB_ROOT_PASSWORD: example

这允许我在 GitLab CI/CD 中使用 "mongodb://root:example@potato:27017/admin?ssl=false" 进行连接

我在本地需要相同的,以便我可以重复使用我的连接字符串。

我在image: mongo:latest下面添加了以下

container_name: potato

但我无法连接到服务器potato。我已经尝试了一些与网络、别名等的组合。没有运气。 我不明白我在做什么了。难道没有一个简单的等价物给容器提供别名,以便我的 C# 应用程序或 MongoDb 客户端可以访问它吗?

在我看来,即使是 https://docs.docker.com/compose/compose-file/#external_links 部分的文档也是无用的。它提到了其他地方没有定义的随机样本。

非常感谢任何帮助!

我试过了..

我尝试了以下方法:How do I set hostname in docker-compose? 没有成功

我花了几个小时阅读 docker compose 文档,这非常令人困惑。大多数问题在没有具体示例的情况下脱离上下文这一事实也无济于事,因为它需要一些更深入的知识。


解决方案 多亏了这些回复,很明显这是一个不值得推荐的骇人听闻的事情。

我接受了建议,现在连接字符串为:

mongodb://root:example@potato:27017/admin?ssl=false

默认情况下。这样,我不需要为我的 GitLab CI/CD 管道更改任何内容,该管道具有 mongo db 的别名 potato

当使用 docker compose 在本地运行 mongoDb 容器时,它在 localhost 中执行此操作,但我编辑了我的 hosts 文件(例如:在 Windows 中 C:\Windows\System32\drivers\etc,在 Linux 中 /etc/hosts)向 @ 发出任何请求987654340@转至localhost127.0.0.1

127.0.0.1  potato

这样我就可以从我的代码或 Robo3T 连接到 MongoDb,就好像它在名为 potato 的主机上运行一样。

如果有更好的选择,请随时评论。塔。

【问题讨论】:

  • 一旦你设置了ports:选项,从非Docker主机进程的角度来看,它与本地系统上运行的另一个进程没有区别,你通常不会尝试分配进程的主机名。在不同的上下文中需要不同的连接字符串是正常的。
  • 这是一个有效的观点

标签: docker docker-compose containers


【解决方案1】:

如果我理解正确,您希望将主机名(例如,potato)绑定到 主机 机器上的 IP 地址。

Afaik 这是不可能的,但有一些变通方法[1]。

每次启动 docker-compose 时,这些容器之间都会使用一个网络,您无法确定它们将获得哪些 IP 地址。这些可能是172.17.0.0/24172.14.0.0/24 或其他任何东西。

您唯一确定的是,您的 主机 将在端口 27017 上运行服务。因此,您可以说主机名 potato 指向主机上的 localhost,方法是添加127.0.0.1 potato 到您 主机 上的 /etc/hosts 文件。

这样,连接字符串"mongodb://root:example@localhost:27017/admin?ssl=false" 将从您的主机的角度指向本地端口,而从您的其余 docker-compose 服务的角度来看,它将指向 docker 容器。

我不得不说,我发现这是一种 hacky 方法,正如 @DavidMaze 所说,根据您使用它们的上下文需要不同的连接字符串是正常的。

[1]https://github.com/dlemphers/docker-local-hosts

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多