[英]docker compose network version 3 – containers can't see each other unless using public IP?
[英]Docker containers are not able to see each other in docker compose, nor is host
我在使用 Docker 时遇到了几个问题。
我的配置:
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:9223
或http://172.17.0.2:9223/
并且在这两种情况下我都得到“无法访问页面错误”。 Ps 我从docker inspect
命令获得了 IP。
另一方面,如果我尝试运行容器docker exec -it chrome_container bash
并执行命令curl localhost:9223
那么它会显示 SUCCESS 结果。
此时,如果我尝试使用其他地址,例如curl chrome:9223
或curl http://chrome:9223
或curl chrome_container:9223
或curl 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:9223
或curl 0.0.0.0:9223
或curl chrome:9223
或curl http://chrome:9223
或curl chrome_container:9223
或curl http://chrome_container:9223
)。
我尝试重新启动 Docker 几次并尝试了不同的端口。 我怎样才能弄清楚这些事情?
如何在主机系统的 9223 端口访问资源?
为什么第二个服务不能使用主机名查看第一个服务,如此处所述?
我在 Windows 10 上使用 Docker。
编辑:更多细节。
因此,在主机系统(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.