我的最终目标是允许运行FastAPI应用程序的容器与主机上的MySQL数据库进行通信。
首先我尝试使用host.docker.internal
Dockerfile
FROM debian:latest
RUN apt update && apt install -y \
netcat \
iputils-ping
CMD echo "tailing /dev/null" && tail -f /dev/null
docker-compose.yml
version: "3.2"
services:
test:
build:
context: "."
extra_hosts:
- "host.docker.internal:host-gateway"
期望表现:ping 能够正常工作,nc -vz 也能够正常工作
特别地,使用 nc -vz 命令,我期望看到类似以下的输出:
root@9fe8de220d44:/# nc -vz host.docker.internal 80
Connection to host.docker.internal (172.17.0.1) port 80 (tcp) succeeded!
实际行为:ping 可用,nc -vz 不可用
root@5981bcfbf598:/# ping host.docker.internal
PING host.docker.internal (172.17.0.1) 56(84) bytes of data.
64 bytes from host.docker.internal (172.17.0.1): icmp_seq=1 ttl=64 time=0.079 ms
64 bytes from host.docker.internal (172.17.0.1): icmp_seq=2 ttl=64 time=0.067 ms
64 bytes from host.docker.internal (172.17.0.1): icmp_seq=3 ttl=64 time=0.068 ms
^C
--- host.docker.internal ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2013ms
rtt min/avg/max/mdev = 0.067/0.071/0.079/0.005 ms
root@5981bcfbf598:/# nc -vz host.docker.internal 80
nc: connect to host.docker.internal (172.17.0.1) port 80 (tcp) failed: Connection refused
在主机上
我在端口80上运行了 Apache。
$ netstat -tulpn
...
tcp6 0 0 :::80 :::* LISTEN 1258/apache2
此外,我的防火墙已配置为允许所有传入的80端口请求:防火墙显示允许所有IPv4和IPv6的HTTP端口80
操作系统和Docker版本:
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.6 LTS
Release: 18.04
Codename: bionic
$ docker --version
Docker version 20.10.21, build baeda1f
手动指定网络也失败
host.docker.internal
失败后,我按照这里的说明连接到了一个手动指定的网络(在我的情况下是 Ubuntu 18.04 的 Linux 主机):https://dev59.com/zlEG5IYBdhLWcg3wM2Zu#70725882
这是我的设置:
Dockerfile
FROM debian:latest
RUN apt update && apt install -y \
netcat \
iputils-ping
CMD echo "tailing /dev/null" && tail -f /dev/null
docker-compose.yml
version: "3.2"
networks:
test:
name: test-network
attachable: true
ipam:
driver: default
config:
- subnet: 172.42.0.0/16
ip_range: 172.42.5.0/24
gateway: 172.42.0.1
services:
test:
build:
context: "."
networks:
- test
确认网关
$ docker inspect test-test-1 -f '{{range .NetworkSettings.Networks}}{{.Gateway}}{{end}}'
172.42.0.1
ping正常
root@07f81c211a0c:/# ping 172.42.0.1
PING 172.42.0.1 (172.42.0.1) 56(84) bytes of data.
64 bytes from 172.42.0.1: icmp_seq=1 ttl=64 time=0.056 ms
64 bytes from 172.42.0.1: icmp_seq=2 ttl=64 time=0.068 ms
64 bytes from 172.42.0.1: icmp_seq=3 ttl=64 time=0.065 ms
期望行为:nc -vz成功
根据https://dev59.com/zlEG5IYBdhLWcg3wM2Zu#70725882的说明:
root@9fe8de220d44:/# nc -vz 172.18.0.1 80
Connection to 172.18.0.1 80 port [tcp/http] succeeded!
实际行为:nc -vz失败
root@07f81c211a0c:/# nc -vz 172.42.0.1 80
nc: connect to 172.42.0.1 port 80 (tcp) failed: Connection refused
我做错了什么?
提前感谢您的帮助!
host.docker.internal
以同样的方式失败。希望这足够提供上下文,不会被投票降低评分? - AJ Livingston