如何在docker堆栈部署中连接到容器

问题描述 投票:0回答:3

我正在尝试使用docker stack deploy来部署节点应用程序。这应该是显而易见的,但我如何从节点应用程序连接到数据库?

这是我的示例docker文件 - 我还没有处理扩展每个服务,只是尝试连接所有内容。鉴于此文件,如果我docker stack deploy --compose-file docker-compose.yml dev - 那么将节点连接到mongo的连接字符串的正确mongo地址是什么?

version: '3'

services:
  node: 
    image: rgilling/rsc:latest
    ports:
      - "8080:8080"
    networks:
      - "core"
      - "front"
    logging:
      driver: "json-file"
      options:
        max-size: "500k"
        max-file: "10"
  db1:
    image: mongo:latest
    ports:
      - "27017:27017"
    command: mongod
    networks:
      - core
    logging:
      driver: "json-file"
      options:
        max-size: "500k"
        max-file: "10"
  search1:
    image: docker.elastic.co/elasticsearch/elasticsearch:5.3.0
    environment:
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    cap_add:
      - IPC_LOCK
    volumes:
      - ../../elastic/config/search1.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - ../../elastic/config/log4j2.properties:/usr/share/elasticsearch/config/log4j2.properties
      - ../../elastic/logs/search1:/usr/share/elasticsearch/logs/search1
      - ../../elastic/data/search1:/usr/share/elasticsearch/data/search1  
    ports:
      - 9200:9200
    networks:
      - core
    logging:
      driver: "json-file"
      options:
        max-size: "500k"
        max-file: "2"
  kibana:
    image: docker.elastic.co/kibana/kibana:5.3.0
    hostname: test-rep
    volumes:
      - ../../kibana/config/systest.yml:/usr/share/kibana/config/kibana.yml
    networks:
      - core
    ports:
      - "5601:5601"
    depends_on: 
      - search1
    logging:
      driver: "json-file"
      options:
        max-size: "500k"
        max-file: "10"
  mail:
    image: mailhog/mailhog
    hostname: test-mail
    networks:
      - core
    ports:
      - "8025:8025"
      - "1025:1025"
    logging:
      driver: "json-file"
      options:
        max-size: "500k"
        max-file: "10"
networks: 
  core:
    driver: overlay
  front:
    driver: overlay 
docker docker-compose
3个回答
-3
投票

docker将为每个容器创建一个网络可访问的名称。在你的情况下,它将是db1

mongodb://user:password@db1/my-database

你也可以在docker-compose中添加一个links部分,它允许你指定一个映射到db1的名称。

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


node:
  links:
   - db1:mongo-server-name

通常最好添加links部分,因此docker知道哪些容器应该相互连接。


node:
  links:
   - db1

在这种情况下无需重命名。只需指定node连接的容器


0
投票

以上答案实际上是错误的。在docker堆栈部署中不支持links:请参阅此链接:https://docs.docker.com/compose/compose-file/#not-supported-for-docker-stack-deploy

你可以通过在swarm中使用链接容器的服务名来连接到另一个容器假设两个服务mysql_service和java_service在swarm中运行然后在java_service容器内尝试ping mysql_service来验证它是否已连接

或者您可以使用别名为网络中的服务提供备用主机名

https://docs.docker.com/compose/compose-file/#aliases


0
投票

如果您通过docker stack deploy运行应用程序 - 一个服务的所有容器都可以看到对方。

因此,对于您连接到DB的情况,您应该写:

db1:27017

(其中db1 - 是您的数据库容器名称)

https://docs.docker.com/compose/compose-file/#deploy

© www.soinside.com 2019 - 2024. All rights reserved.