繁体   English   中英

从容器(docker)访问服务器资源

[英]Access server ressource from the container (docker)

我知道很多人都问过类似的问题,但我找到的解决方案都不能应用于我的案例。 我确信解决方案应该很简单,但我真的找不到它!

基本上我需要从 docker 容器 (dmz) 访问在我的主机上运行的特定服务。 我有一个 docker 容器池和一个在真机(主机)上运行的“编排器”服务。 这家伙是一个python REST服务,运行在主机的5001端口,它负责例如保存正在运行的docker机器的执行日志等。 我需要一台特定的机器才能访问主机(dmz),而不是其他机器。 如果他们需要与主机交谈,则需要通过 dmz。

 ======================================================================
 |1-  HOST  -> 5002:5002   dmz(dockerContainer):5002/service1         |
 |2-  dmz(container)     <--> 9200:9200 elasticsearch(container):9200 |
 |3-  HOST:5002/service2  <- 5001:5001   dmz(dockerContainer)         |     
 ======================================================================

连接 1 和 2 工作。 它们是 rest 服务,我什至得到了 rest 请求的答案。 3 是我现在需要做的事情,我无法做到,我不知道发生了什么,但我向上帝发誓,三周前,我可以从容器中通过其真实的 IP 地址访问主机。 现在我不能了! 我不知道发生了什么变化,但就在我之前可以,现在我不能了。

  • 到目前为止我已经尝试过:
    1. 通过过去有效的真实 IP 访问主机(向上帝发誓,确实如此)。 我得到一个TimeoutError: [Errno 110] Connection timed out
    2. 访问 docker0 172.17.0.1 ( https://nickjanetakis.com/blog/docker-tip-65-get-your-docker-hosts-ip-address-from-in-a-container )。 同样的TimeoutError: [Errno 110] Connection timed out 这甚至很好,因为这意味着其他容器也可以这样做,我不希望任何人都可以这样访问服务器!
    3. 在额外主机中添加主机( https://forums.docker.com/t/accessing-host-machine-from-within-docker-container/14248/5 ) - 不允许预定义和用户定义的网络同时使用...我需要它。
    4. 端口转发(可能是方向,但我在容器->主机方向上看不到怎么做)为docker添加主机端口。 它适用于主机->容器方向,在composer文件的端口上添加5002:5002,但反对它是不可能的。 当我启动网络时,我无法再启动我的服务(这是合理的,因为端口不可用)。 怎么用? 我的意思是在 docker 上进行主机感应? 如何将端口转发指向已启动并正在运行的服务?

关于如何做到这一点的任何想法?!?

OS Version/build : Ubuntu 16.04
Docker version : 19.03.2, build 6a30dfc
Docker-compose version : 1.24.0, build 0aa59064

作曲家文件:

version: '3.5'

services:   
  dmz:
    container_name: testbed_dmz
    # 1 - DMZ image name  
    image: testbed_dmz:latest
    ports:
        # 2 - DMZ ports 
      - "5002:5002"
    networks:
      data_network:
        # 3 - DMZ ip address  
        ipv4_address: 192.168.7.2   
  elasticsearch:
    container_name: data_server
    # 4 - Elasticsearch image name  
    image: docker.elastic.co/elasticsearch/elasticsearch:7.0.0
    environment:
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - discovery.type=single-node
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - "9200:9200"
    networks:
      data_network:
        # 5 elasticsearch ip address
        ipv4_address: 192.168.7.3  
  kibana:
    container_name: testbed_kibana
    # 6 kibana image name
    image: docker.elastic.co/kibana/kibana:7.0.0
    environment:
        # 7 again the elasticsearch ip address
      - SERVER_NAME=192.168.7.3
    ports:
      - "5601:5601" networks:
      data_network:
        # 8 kibana ip address
        ipv4_address: 192.168.7.4   
networks:
    data_network:
        # 9 the name of the network
        name: DMZ_DATA_NET
        driver: bridge
        ipam:
            driver: default
            config:
                # 10 the network address
                - subnet: 192.168.7.0/29

要连接到主机上运行的进程,请尝试将network_mode: host添加到服务定义中:

services:   dmz:
    container_name: testbed_dmz
    network_mode: host

但是然后 dmz 需要使用localhost:[port_num]连接到 python 进程,假设它在主机的port_num端口上运行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM