如何连接到Docker堆栈部署中的容器

问题描述:

我正在尝试使用docker stack部署来部署节点应用程序。我想这应该是显而易见的,但是如何从节点应用程序连接到数据库?如何连接到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 

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

mongodb://user:[email protected]/my-database

,你还可以添加links部分,将泊坞窗,撰写,它可以让你指定一个名称映射到db1

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


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

它通常是最好反正添加links部分,所以搬运工知道哪些容器都应该相互连接。


node: 
    links: 
    - db1 

没有必要在这种情况下,重命名。只是指定node连接到

+0

我有一些无关的问题阻止了我进行测试,但是当我运行堆栈部署时,它会说:“忽略不支持的选项:cap_add,链接” - 您确定链接适用于堆栈部署吗? –

+0

没关系,我得到它的工作。对于任何感兴趣的人来说,地址确实是db1,但我不认为“链接”可用于堆栈部署。有一种称为路由网格的服务,将地址路由到任何运行该服务的容器(在自动调节的情况下)。我还没有尝试过像使用dns那样更高级的东西,但是也许在docker-compose中使用'hostname'选项仍然可以用于堆栈部署 - 我没有尝试过。 –

+0

错误的答案,正如文档所述:'链接不支持docker stack部署或部署密钥.' –

以上答案其实是错误的links:不搬运工栈支持部署 看到这个链接的容器:https://docs.docker.com/compose/compose-file/#not-supported-for-docker-stack-deploy

您可以通过使用连接容器的服务名称连接到另一个容器在假设两个服务mysql_service和java_service的群在群运行,则java_service容器内尝试ping mysql_service以验证它是否连接

,或者您可以使用别名来有一个替代的主机名称服务网络

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

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

因此,对于您的情况下连接到数据库,你应该这样写:

db1:27017

(其中DB1 - 是你的数据库容器名称)

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