![](/img/trans.png)
[英]How to get a Docker container's IP address, located within a bridge network, from a windows host?
[英]connect from inside a docker container to IP address on host network
问题:(简短版本)
使用 Docker 进行应用程序开发时,如何配置 Docker-compose 文件以让我从 Docker 容器内部访问主机网络上服务器的 IP 地址? 我不想访问主机本身——而是想访问与主机位于同一网络上的另一台服务器。 我还需要让各种 docker 容器能够相互通信。
允许从 docker 容器内部访问主机网络 IPv4 资源并仍然允许容器间通信的最干净的方法是什么?
所有背景和细节都在下面(又名长版)。
设置:
我正在编写一个应用程序,它轮询 Modbus 服务器以在给定的时间间隔收集测量数据。 Modbus 服务器位于我本地网络上的 192.168.1.50 端口 502。 我可以从我的电脑成功 ping 那个服务器。
这是我的开发方法:
这是创建应用程序环境的 Docker-compose 文件:
version: '3.8'
services:
db:
container_name: db
image: postgres:10.7
environment:
POSTGRES_PASSWORD: pwd
POSTGRES_DB: app_db
volumes:
- ./data/postgres:/var/lib/postgresql/data
ports:
- 5432:5432
web:
container_name: web
build:
context: ../.
dockerfile: ./_app/dev/Dockerfile
volumes:
- ../.:/app
ports:
- 8000:8000
depends_on:
- db
env_file:
- app.env
command: ./manage.py runserver 0.0.0.0:8000
这是 Dockerfile:
FROM python:3.8.5-buster
RUN mkdir /app
WORKDIR /app
RUN apt-get update -y
RUN apt-get install inetutils-traceroute -y
COPY ./_app/dev/python_reqs.txt /app/python_reqs.txt
RUN pip install --upgrade pip
RUN pip install -r python_reqs.txt
# Install wait-for-it
COPY ./_app/wait-for-it.sh /usr/local/bin/
RUN chmod u+x /usr/local/bin/wait-for-it.sh
# Configure custom entrypoint to wait for postgres and run webserver
COPY ./_app/dev/custom-entrypoint /usr/local/bin/
RUN chmod u+x /usr/local/bin/custom-entrypoint
ENTRYPOINT ["custom-entrypoint"]
EXPOSE 8000
问题:
从“web”docker 容器内部,我无法访问主机 LAN 上的 Modbus 服务器。 我无法 ping 其 IP 地址 (192.168.1.50)。
traceroute 192.168.1.50
没有提供有用的信息。 它只是失败了。
当我运行 docker docker-compose up
会创建一个名为“_app_default”的 docker 网络。 这是我运行docker network inspect _app_default
时得到的docker network inspect _app_default
:
[
{
"Name": "_app_default",
"Id": "59f0836c2f3017c537f973a38ab3a55ad96e2ed737c4ac111fc0e911fa0c8a67",
"Created": "2020-09-13T18:51:14.6395366Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "192.168.112.0/20",
"Gateway": "192.168.112.1"
}
]
},
"Internal": false,
"Attachable": true,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"28af77ef2d6f99812cb392c8f9eca045b150256c464befc3bb249c9de9e653c1": {
"Name": "db",
"EndpointID": "d657f2f29699ada859447c919ad2c94195a6e9a7ae7eeb35989560d2717183c5",
"MacAddress": "02:42:c0:a8:70:02",
"IPv4Address": "192.168.112.2/20",
"IPv6Address": ""
},
"a8a619d664a27286e276614e549514dff2c15c5c3c44c39e127fec54ec2b5c6b": {
"Name": "web",
"EndpointID": "8f1661c6fa24104a70171d1f830e1fe34ed8d89bacd55c9b9d05dc62f64112c0",
"MacAddress": "02:42:c0:a8:70:03",
"IPv4Address": "192.168.112.3/20",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {
"com.docker.compose.network": "default",
"com.docker.compose.project": "_app",
"com.docker.compose.version": "1.27.0"
}
}
]
我已经尝试过的:
我尝试在 'web' 服务定义中使用network_mode: "host"
。 那没有帮助。
我尽力通读了 Docker 网络文档,但我找不到针对这种情况的直接解决方案,然后我就彻底扭转了局面——不幸的是,我不擅长网络主题——但 :) 。 我需要“覆盖”网络吗? 还是“macvlan”? 帮助!
非常感谢您的 StackOverflow 超级明星可以发送的任何帮助。 谢谢!!
-艾伦
看起来您的 docker 网络和本地网络的 ip 范围重叠。 要解决这个问题,您需要覆盖 docker 网络地址池,例如
编辑 docker 守护进程配置
$ cat ~/.docker/daemon.json
{
"debug" : true,
"default-address-pools" : [
{
"base" : "172.31.0.0/16",
"size" : 24
}
]
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.