docker - 在 docker compose 中命名服务以用作主机名

标签 docker docker-compose containers

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

这是我的mongodb.yml docker 撰写文件。

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"
我想使用别名的等价物,而不是 localhost , MongoDb 可通过主机名 potato 访问

在 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

默认情况下。这样,我不需要为具有别名 potato 的 GitLab CI/CD 管道进行任何更改。对于 mongo 数据库。

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

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

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

最佳答案

如果我理解正确,您希望将主机名(例如 potato )绑定(bind)到主机上的 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

关于docker - 在 docker compose 中命名服务以用作主机名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62121158/

相关文章:

python - 超正方体未找到错误 : two docker container python app (docker-compose)

docker - 适用于 Windows 的 Docker 上的 Kubernetes -> AKS/EKS

docker - 使用Kubernetes的OpenStack服务的容器化?

linux - Docker:什么是带有 Linuxkit 的 Windows 上的新 Linux 容器 (LCOW)

amazon-web-services - 通过 ECS 运行 docker 镜像是否需要 PM2?

r - 在无状态(Google Cloud Engine) docker 上从R保留永久日志的最佳方法是什么?

docker - docker-如何在docker up和up之后保持数据?

html - 带排水沟的容器

c++ - 如何在 C++ 容器中向左移动元素(以实现删除)?

java - 使用 gradle 任务构建镜像时无法在 docker 容器内设置环境变量