【发布时间】: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@转至localhost或127.0.0.1
127.0.0.1 potato
这样我就可以从我的代码或 Robo3T 连接到 MongoDb,就好像它在名为 potato 的主机上运行一样。
如果有更好的选择,请随时评论。塔。
【问题讨论】:
-
一旦你设置了
ports:选项,从非Docker主机进程的角度来看,它与本地系统上运行的另一个进程没有区别,你通常不会尝试分配进程的主机名。在不同的上下文中需要不同的连接字符串是正常的。 -
这是一个有效的观点
标签: docker docker-compose containers