【问题标题】:docker-compose java application connection to mongodbdocker-compose java 应用程序连接到 mongodb
【发布时间】:2019-07-28 13:02:26
【问题描述】:

2 个容器,一个 Java 应用程序和第二个 mongodb。

如果我在本地运行我的 java 应用程序并在容器中运行 mongodb,它会连接,但如果两者都在容器内运行,则 java 应用程序无法连接到 mongodb。

docker-compose文件如下,是不是漏了什么

version: "3"

services:

  user:
    image: jboss/wildfly
    container_name: "user"
    restart: always
    ports:
      - 8081:8080
      - 65194:65193
    volumes:
      - ./User/target/User.war:/opt/jboss/wildfly/standalone/deployments/User.war
    environment:
      - JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,address=0.0.0.0:65193,suspend=n,server=y -Djava.net.preferIPv4Stack=true
      - MONGO_HOST=localhost
      - MONGO_PORT=27017
      - MONGO_USERNAME=myuser
      - MONGO_PASSWORD=mypass
      - MONGO_DATABASE=mydb
      - MONGO_AUTHDB=admin
    command: >
      bash -c "/opt/jboss/wildfly/bin/add-user.sh admin Admin#007 --silent && /opt/jboss/wildfly/bin/standalone.sh -b 0.0.0.0 -bmanagement 0.0.0.0"
    links:
      - mongo

  mongo:
    image: mongo:4.0.10
    container_name: mongo
    restart: always
    volumes:
       - ./assets:/docker-entrypoint-initdb.d/
    environment:
      - MONGO_INITDB_ROOT_USERNAME=myuser
      - MONGO_INITDB_ROOT_PASSWORD=mypass
    ports:
      - 27017:27017
      - 27018:27018
      - 27019:27019

编辑

我也对以下内容感到困惑。

links:
  - mongo

depends_on:
  - mongo

【问题讨论】:

  • Mongo 主机应该是 'mongo'
  • 谢谢,我也对链接​​和depends_on感到困惑,介意解释一下,谢谢

标签: java mongodb docker docker-compose


【解决方案1】:

2019 年 7 月,官方 docker 文档:

来源:https://docs.docker.com/compose/compose-file/#links

解决方案#1:启动前的环境文件

基本上我们用环境变量将所有配置集中在一个文件中,并在docker-compose up

之前执行

以下方法在这些情况下帮助了我:

  • 您的 docker-compose.yml 有多个容器,它们之间存在复杂的依赖关系
  • docker-compose 中的某些服务需要连接到同一台机器上的另一个进程。这个进程可以是 docker 容器,也可以不是。
  • 您需要在多个 docker-compose 文件(如主机、密码等)之间共享变量

步骤

1.-创建一个文件来集中配置

此文件可以命名为:/env/company_environments 是否带有扩展名。

export MACHINE_HOST=$(hostname -I | awk '{print $1}')
export GLOBAL_LOG_PATH=/my/org/log
export MONGO_PASSWORD=mypass
export MY_TOKEN=123456

2.-在你的docker-compose.yml中使用环境变量

容器 A

app_who_needs_mongo:
  environment:
    - MONGO_HOST=$MACHINE_HOST
    - MONGO_PASSWORD=$MONGO_PASSWORD
    - TOKEN=$MY_TOKEN
    - LOG_PATH=$GLOBAL_LOG_PATH/app1

容器 B

app_who_needs_another_db_in_same_host:
  environment:
    - POSTGRESS_HOST=$MACHINE_HOST
    - LOG_PATH=$GLOBAL_LOG_PATH/app1

3.- 启动您的容器

只需在 docker-compose 命令之前添加源代码:

source /env/company_environments
docker-compose up -d

解决方案 #2:host.docker.internal

https://stackoverflow.com/a/63207679/3957754

基本上使用docker的一个特性,其中host.docker.internal可以用作你的docker-compose启动了多个容器的服务器的ip

【讨论】:

  • 谢谢,你能不能也解释一下depends_on和链接property
  • depends_on 就像你在 java maven 中的 。带有 depends_on 应用 B 的应用 A,如果应用 B 错误或第一次尝试时不会启动,docker-compose 在应用 A 之前启动应用 B。links 是一种到达方式如果值与别名或服务名称相同,则为主机名。链接已弃用!
  • 所以我应该使用depends_on: -mongo 并删除links,希望它不会损坏?我已经为 mongo 连接设置了环境变量。
  • 我编辑了我的答案,请检查。此外,不推荐使用链接! depends_on: mongo 只是在你的 java 进程之前启动 mongo 进程,但不会在你的 java 应用中配置 mongo 的主机名。
【解决方案2】:

您可能无法连接,因为您将 MONGO_HOST 设置为 localhost 并且 mongo 是一个链接服务。

为了使用链接服务网络,您必须指定MONGO_HOST作为服务的名称 - mongo,如下所示:

 MONGO_HOST=mongo

【讨论】:

猜你喜欢
  • 2020-04-07
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多