【问题标题】:Reach Docker container from other docker Container within localhost:port从 localhost:port 中的其他 docker Container 访问 Docker 容器
【发布时间】:2019-10-31 09:39:37
【问题描述】:

当前撰写 yaml:

version: '3.7'

networks:
  app-tier:
    driver: bridge

services:
  php:
    container_name: docker_php
    build: .docker/php73
    volumes:
      - .:/srv/
    networks:
      - app-tier

  rabbitmq:
    container_name: docker_rabbitmq
    image: "rabbitmq:3-management"
    hostname: "rabbitmq-localhost"
    environment:
        RABBITMQ_DEFAULT_USER: guest
        RABBITMQ_DEFAULT_PASS: guest
    ports:
      - "15672:15672"
      - "5672:5672"
    networks:
      - app-tier

我的目标是在 localhost 中从 docker_php 访问 docker_rabbitmq 容器:

#bash php_container
telnet loaclhost 15672

如何配置网络:

容器 A 在本地主机上有端口映射到容器 B?

【问题讨论】:

    标签: docker docker-compose dockerfile


    【解决方案1】:

    你受到内部端口的限制,这意味着如果你的两个容器在同一个 docker 定义的网络中,你可以使用各自容器的内部打开的端口。要为另一个容器中的容器定义 hostname,您可以在 docker-compose.yml 内的服务定义中使用 links 属性。

    考虑一个您希望仅由该网络上的容器访问的微服务,因此暴露主机上的端口是没有意义的。现在假设rabbitmq 是您要从php 服务访问的服务,您需要在php 服务定义中定义指向rabbitmq 的链接(请注意链接/主机定义不是双向的,如果您需要在rabbitmq 中使用php,则需要在rabbitmq 中为php 定义一个链接)

    version: '3.7'
    
    networks:
      app-tier:
        driver: bridge
    
    services:
      php:
        container_name: docker_php
        build: .docker/php73
        volumes:
          - .:/srv/
        networks:
          - app-tier
        links:
          - rabbitmq
    
      rabbitmq:
        container_name: docker_rabbitmq
        image: "rabbitmq:3-management"
        hostname: "rabbitmq-localhost"
        environment:
            RABBITMQ_DEFAULT_USER: guest
            RABBITMQ_DEFAULT_PASS: guest
        networks:
          - app-tier
    

    现在您可以从php 访问rabbitmq 的内部端口,但请注意无法访问外部端口,这些端口是用于主机的。

    # inside your `php` container `bash`
    telnet rabbitmq <internal_port>
    

    也不是我通过删除摆脱了rabbitmq 中的端口

    现在主机无法访问rabbitmq 的这些端口。

    更新

    如果你想访问端口,那么rabbitmq 中打开的端口可以在本地主机上的php 中访问。最简单和最简单的方法是将rabbitmq 配置为在php 的网络上以容器网络模式运行以执行此简单添加 network_mode:“容器:[容器名称/id]”

    rabbitmq:
        container_name: docker_rabbitmq
        image: "rabbitmq:3-management"
        hostname: "rabbitmq-localhost"
        environment:
            RABBITMQ_DEFAULT_USER: guest
            RABBITMQ_DEFAULT_PASS: guest
        network_mode: "container:php"
        ports:
            - "15672:15672"
            - "5672:5672"
    

    【讨论】:

    • 是否有可能实现它,php 容器可以通过rabbitmq 主机而不是localhost 到达rabbitmq 容器?比如:``` 在你的php 容器内bash telnet localhost ``
    • @Mindau 可以使用两种方式,socat 和使用主机网络。
    • 感谢您的回答。网络模式正是我所需要的。我刚刚使用了``` network_mode: "service:php" ```
    • 您可以使用容器名称在容器之间建立连接,而无需执行您在此处建议的任何手动设置:您不需要links: 或自定义network:network_mode: 设置。 Docker 文档中的Networking in Compose 很好地描述了这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 2021-08-21
    • 2021-05-22
    • 2020-10-02
    相关资源
    最近更新 更多