gpt4 book ai didi

Docker 容器在 docker compose 中无法看到彼此,主机也无法看到

转载 作者:行者123 更新时间:2023-12-02 21:07:09 25 4
gpt4 key购买 nike

我在使用 Docker 时遇到了几个问题。

  • 主机 (Windows 10) 无法访问容器托管的任何资源。
  • 容器本身也没有看到对方。

  • 我的配置:
    version: '3.7'
    services:
    chrome:
    build: ./chrome
    container_name: chrome_container
    ports:
    - "9223:9223"

    dotnetapp:
    depends_on:
    - chrome
    build: ./dotnetapp
    container_name: live_container
    environment:
    - ASPNETCORE_ENVIRONMENT=Production
    stdin_open: true
    tty: true
    Dockerfile对于 chrome(它所做的一切 - 启动带有调试功能的 Chrome,在端口 9223 上启用):
    FROM debian:buster-slim

    # preparation
    RUN apt-get update; apt-get clean
    RUN apt-get install -y wget
    RUN apt-get install -y gnupg2

    # installing xvfb
    RUN apt-get install -y xvfb

    # installing Chrome
    RUN wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add -
    RUN sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
    RUN apt-get update && apt-get install -y google-chrome-beta

    EXPOSE 9223

    COPY ./docker-entrypoint.sh /usr/local/bin/
    RUN ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat
    ENTRYPOINT ["docker-entrypoint.sh"]
    CMD ["test"]
    docker-entrypoint.sh
    #!/bin/bash
    set -e

    if [ "$1" = 'test' ]; then
    rm -f /tmp/.X99-lock
    fi

    xvfb-run -e /dev/stdout --server-args='-screen 0, 2560x1440x16' google-chrome --window-size=2560,1440 --no-sandbox --remote-debugging-port=9223 --user-data-dir=remote-profile https://www.google.com/
    Dockerfile用于第二个应用程序(仅用于 docker 内部网络测试)
    FROM mcr.microsoft.com/dotnet/core/runtime:2.2

    # run app
    CMD ["/bin/bash"]

    所以,现在,详细说明第 1 点:

    我可以通过运行启动 chrome 容器: docker-compose up --build chrome .

    然后,在主机系统上,我尝试打开浏览器 localhost:9223http://172.17.0.2:9223/在这两种情况下,我都会收到“无法访问页面错误”。附:我从 docker inspect 获得了 IP命令。

    enter image description here

    另一方面,如果我尝试进入正在运行的容器 docker exec -it chrome_container bash并执行命令 curl localhost:9223然后它显示一个成功的结果。

    enter image description here

    此时,如果我尝试使用其他地址,如 curl chrome:9223curl http://chrome:9223curl chrome_container:9223curl http://chrome_container:9223然后他们也失败了。根据文档 - 内部网络中的所有容器应为 accessible by the service host name .在我的场景中,这完全是错误的。

    我还尝试在不依赖 docker compose 的情况下启动镜像像这样 docker run -p 9223:9223 -it --rm all_chrome但结果是一样的。该资源在主机系统中不可用。

    现在,详细说明问题2。

    当我像这样运行两个应用程序时 docker-compose up .并通过 docker exec -it live_container bash 登录第二个应用程序.然后尝试使用上述 URL 访问第一个容器 - 所有这些都失败( curl localhost:9223curl 0.0.0.0:9223curl chrome:9223curl http://chrome:9223curl chrome_container:9223curl http://chrome_container:9223 )。

    我尝试了几次重新启动 Docker 并尝试了不同的端口。我怎样才能弄清楚这些事情?
  • 如何在主机系统中访问 9223 端口的资源?
  • 为什么第二个服务不能使用主机名看到第一个服务,如文档 here 所述?

  • 我在 Windows 10 上使用 Docker。

    enter image description here

    编辑:更多细节。
  • 通过 localhost 访问时 - 显示以下错误:

  • enter image description here
  • 通过 IP 访问时显示以下错误:

  • enter image description here

    因此,在主机系统(win 10)上通过 localhost 访问时似乎发生了一些事情。

    最佳答案

    刚刚在一个topic中找到了信息, 那 Chrome根本不接受来自 localhost network 外部的连接在 Debug模式下。

    因此,将容器启动为:

    docker run -p 5656:5656 -it --rm all_chrome

    然后为了解决这个问题,我必须使用代理。这是一个例子:
    socat tcp-listen:5656,fork tcp:localhost:9223

    之后 - 通过 localhost 访问工作正常:

    enter image description here

    我还没有弄清楚如何开始 socat处于守护模式,所以我可以使它成为 docker 中启动脚本的一部分..但这是一件小事。

    编辑。几个笔记。

    从另一个容器访问 Chrome 容器

    如果您尝试使用 IP 从另一个容器访问调试 session ,那么这将正常工作:
    curl 172.19.0.2:5656

    否则,如果您尝试使用主机名 - 您会看到一个错误。
    curl chrome:5656

    错误:

    Host header is specified and is not an IP address or localhost.root@38f2b5fa34ca:/app# curl chrome:5656



    这可以通过剥离 Host 来解决 header 值:
    curl chrome:5656 -H 'Host: '

    问题仍然是,这不是很方便的方法。因为应用程序并不总是有可能从请求中删除 header 。例如 - 一个 chromedriver .因此,一个解决方案是在 chrome docker 容器上进行配置,这将删除所有传入请求的主机头值。我尝试使用 squid代理,但没有成功。所以,相反,我想出了另一个解决方案。

    解决方案是为容器的内部网络使用静态、固定的 IP 地址。这样一来,您始终可以确保 docker 将使用相同的地址,因此您的应用程序可以在调用中使用它。

    配置如下:
    version: '3.7'
    services:
    chrome:
    networks:
    front:
    ipv4_address: 172.16.238.5
    app2:
    networks:
    front:
    ipv4_address: 172.16.238.10
    networks:
    front:
    driver: bridge
    ipam:
    config:
    - subnet: 172.16.238.0/24

    现在在 app2 中,您可以使用固定 IP 调用电话:
    CURL 172.16.238.5:5656

    这是迄今为止最简单的解决方案..

    p.s.如果您在 headless 模式下运行 chrome,那么您可以提供额外的参数,理论上可以解决您的一些问题 --remote-debugging-address .尝试一下。

    关于Docker 容器在 docker compose 中无法看到彼此,主机也无法看到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57277930/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com