繁体   English   中英

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

[英]Docker containers are not able to see each other in docker compose, nor is host

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

  1. 主机 (Windows 10) 无法访问容器托管的任何资源。
  2. 容器本身也看不到对方。

我的配置:

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

用于 chrome 的Dockerfile (它所做的一切 - 以调试方式启动 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 (仅用于Dockerfile内部网络测试)

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/并且在这两种情况下我都得到“无法访问页面错误”。 Ps 我从docker inspect命令获得了 IP。

在此处输入图片说明

另一方面,如果我尝试运行容器docker exec -it chrome_container bash并执行命令curl localhost:9223那么它会显示 SUCCESS 结果。

在此处输入图片说明

此时,如果我尝试使用其他地址,例如curl chrome:9223curl http://chrome:9223curl chrome_container:9223curl http://chrome_container:9223那么它们也会失败。 根据文档 - 内部网络中的所有容器都可以通过服务主机名访问 在我的场景中,这完全是错误的。

我也试着开始图像,而不依赖于docker compose这样的docker run -p 9223:9223 -it --rm all_chrome但结果是一样的。 该资源在主机系统内不可用。

现在,详细说明问题 2。

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

我尝试重新启动 Docker 几次并尝试了不同的端口。 我怎样才能弄清楚这些事情?

  1. 如何在主机系统的 9223 端口访问资源?

  2. 为什么第二个服务不能使用主机名查看第一个服务,如此处所述

我在 Windows 10 上使用 Docker。

在此处输入图片说明

编辑:更多细节。

  • 通过本地主机访问时 - 显示以下错误:

在此处输入图片说明

  • 通过IP访问时-显示以下错误:

在此处输入图片说明

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

刚刚在一个主题中找到信息, Chrome在调试模式下根本不接受来自本地主机network外部的连接。

因此,启动容器为:

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

然后为了解决这个问题,我必须使用代理。 下面是一个例子:

socat tcp-listen:5656,fork tcp:localhost:9223

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

在此处输入图片说明

我还没有搞清楚如何开始socat守护进程方式,所以我可以使它在启动脚本的一部分docker ..但是这是一个次要的事情。

编辑。 几个笔记。

从另一个容器访问 Chrome 容器

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

curl 172.19.0.2:5656

否则,如果您尝试使用主机名 - 您会看到错误。

curl chrome:5656

错误:

主机标头已指定且不是 IP 地址或 localhost.root@38f2b5fa34ca:/app# curl chrome:5656

这可以通过剥离Host标头值来解决:

curl chrome:5656 -H 'Host: '

问题仍然是,这不是很方便的方法。 因为应用程序并不总是有可能从请求中删除标头。 例如 - 一个chromedriver 因此,解决办法是让Chrome泊坞窗容器上的配置,这将删除主机头值对所有传入的请求。我试图做它用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

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

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

暂无
暂无

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

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