【问题标题】:Can't connect to PostGreSQL from a same-host container无法从同一主机容器连接到 PostGreSQL
【发布时间】:2020-11-25 21:25:44
【问题描述】:

我正在使用 docker 来管理我的 Django 应用程序,并且在我的笔记本电脑和数字海洋上具有相同的配置:

借助 adminR 映像 (https://hub.docker.com/_/adminer),我可以从我的笔记本电脑连接到 PostGreSQL

但是,如果我尝试从本地主机上的管理员连接到 PostGreSQL,我不能:

我可以从 django 容器中 ping 并找到 PostGreSQL:

但我无法从 django 脚本迁移我的数据库:

有趣的是,我可以从我的笔记本电脑上迁移到数字海洋云上: 我可以在笔记本电脑的 admineR 页面上看到更新的数据库:

所以问题显然是容器之间的网络问题......但是如果我可以ping服务,为什么django不能访问它????

编辑:

1° ip 路由:

ip路由

default via 167.99.80.1 dev eth0 proto static 
10.16.0.0/16 dev eth0 proto kernel scope link src 10.16.0.5 
10.106.0.0/20 dev eth1 proto kernel scope link src 10.106.0.2 
167.99.80.0/20 dev eth0 proto kernel scope link src 167.99.94.16 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 
172.18.0.0/16 dev br-ec478ce025ee proto kernel scope link src 172.18.0.1 linkdown 

  1. iptable -S
  root@docker-s-1vcpu-1gb-lon1-01:~# apt install iptables

Reading package lists... Done

Building dependency tree       

Reading state information... Done

iptables is already the newest version (1.8.4-3ubuntu2).

iptables set to manually installed.

0 upgraded, 0 newly installed, 0 to remove and 34 not upgraded.

root@docker-s-1vcpu-1gb-lon1-01:~# iptables -S

-P INPUT DROP

-P FORWARD DROP

-P OUTPUT ACCEPT

-N DOCKER

-N DOCKER-ISOLATION-STAGE-1

-N DOCKER-ISOLATION-STAGE-2

-N DOCKER-USER

-N ufw-after-forward

-N ufw-after-input

-N ufw-after-logging-forward

-N ufw-after-logging-input

-N ufw-after-logging-output

-N ufw-after-output

-N ufw-before-forward

-N ufw-before-input

-N ufw-before-logging-forward

-N ufw-before-logging-input

-N ufw-before-logging-output

-N ufw-before-output

-N ufw-logging-allow

-N ufw-logging-deny

-N ufw-not-local

-N ufw-reject-forward

-N ufw-reject-input

-N ufw-reject-output

-N ufw-skip-to-policy-forward

-N ufw-skip-to-policy-input

-N ufw-skip-to-policy-output

-N ufw-track-forward

-N ufw-track-input

-N ufw-track-output

-N ufw-user-forward

-N ufw-user-input

-N ufw-user-limit

-N ufw-user-limit-accept

-N ufw-user-logging-forward

-N ufw-user-logging-input

-N ufw-user-logging-output

-N ufw-user-output

-A INPUT -j ufw-before-logging-input

-A INPUT -j ufw-before-input

-A INPUT -j ufw-after-input

-A INPUT -j ufw-after-logging-input

-A INPUT -j ufw-reject-input

-A INPUT -j ufw-track-input

-A FORWARD -j DOCKER-USER

-A FORWARD -j DOCKER-ISOLATION-STAGE-1

-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

-A FORWARD -o docker0 -j DOCKER

-A FORWARD -i docker0 ! -o docker0 -j ACCEPT

-A FORWARD -i docker0 -o docker0 -j ACCEPT

-A FORWARD -o br-ec478ce025ee -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

-A FORWARD -o br-ec478ce025ee -j DOCKER

-A FORWARD -i br-ec478ce025ee ! -o br-ec478ce025ee -j ACCEPT

-A FORWARD -i br-ec478ce025ee -o br-ec478ce025ee -j ACCEPT

-A FORWARD -j ufw-before-logging-forward

-A FORWARD -j ufw-before-forward

-A FORWARD -j ufw-after-forward

-A FORWARD -j ufw-after-logging-forward

-A FORWARD -j ufw-reject-forward

-A FORWARD -j ufw-track-forward

-A OUTPUT -j ufw-before-logging-output

-A OUTPUT -j ufw-before-output

-A OUTPUT -j ufw-after-output

-A OUTPUT -j ufw-after-logging-output

-A OUTPUT -j ufw-reject-output

-A OUTPUT -j ufw-track-output

-A DOCKER -d 172.17.0.3/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 8080 -j ACCEPT

-A DOCKER -d 172.17.0.4/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 5432 -j ACCEPT

-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 8000 -j ACCEPT

-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 9000 -j ACCEPT

-A DOCKER -d 172.17.0.5/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 8080 -j ACCEPT

-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2

-A DOCKER-ISOLATION-STAGE-1 -i br-ec478ce025ee ! -o br-ec478ce025ee -j DOCKER-ISOLATION-STAGE-2

-A DOCKER-ISOLATION-STAGE-1 -j RETURN

-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP

-A DOCKER-ISOLATION-STAGE-2 -o br-ec478ce025ee -j DROP

-A DOCKER-ISOLATION-STAGE-2 -j RETURN

-A DOCKER-USER -j RETURN

-A ufw-after-input -p udp -m udp --dport 137 -j ufw-skip-to-policy-input

-A ufw-after-input -p udp -m udp --dport 138 -j ufw-skip-to-policy-input

-A ufw-after-input -p tcp -m tcp --dport 139 -j ufw-skip-to-policy-input

-A ufw-after-input -p tcp -m tcp --dport 445 -j ufw-skip-to-policy-input

-A ufw-after-input -p udp -m udp --dport 67 -j ufw-skip-to-policy-input

-A ufw-after-input -p udp -m udp --dport 68 -j ufw-skip-to-policy-input

-A ufw-after-input -m addrtype --dst-type BROADCAST -j ufw-skip-to-policy-input

-A ufw-after-logging-input -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW BLOCK] "

-A ufw-before-forward -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

-A ufw-before-forward -p icmp -m icmp --icmp-type 3 -j ACCEPT

-A ufw-before-forward -p icmp -m icmp --icmp-type 11 -j ACCEPT

-A ufw-before-forward -p icmp -m icmp --icmp-type 12 -j ACCEPT

-A ufw-before-forward -p icmp -m icmp --icmp-type 8 -j ACCEPT

-A ufw-before-forward -j ufw-user-forward

-A ufw-before-input -i lo -j ACCEPT

-A ufw-before-input -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

-A ufw-before-input -m conntrack --ctstate INVALID -j ufw-logging-deny

-A ufw-before-input -m conntrack --ctstate INVALID -j DROP

-A ufw-before-input -p icmp -m icmp --icmp-type 3 -j ACCEPT

-A ufw-before-input -p icmp -m icmp --icmp-type 11 -j ACCEPT

-A ufw-before-input -p icmp -m icmp --icmp-type 12 -j ACCEPT

-A ufw-before-input -p icmp -m icmp --icmp-type 8 -j ACCEPT

-A ufw-before-input -p udp -m udp --sport 67 --dport 68 -j ACCEPT

-A ufw-before-input -j ufw-not-local

-A ufw-before-input -d 224.0.0.251/32 -p udp -m udp --dport 5353 -j ACCEPT

-A ufw-before-input -d 239.255.255.250/32 -p udp -m udp --dport 1900 -j ACCEPT

-A ufw-before-input -j ufw-user-input

-A ufw-before-output -o lo -j ACCEPT

-A ufw-before-output -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

-A ufw-before-output -j ufw-user-output

-A ufw-logging-allow -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW ALLOW] "

-A ufw-logging-deny -m conntrack --ctstate INVALID -m limit --limit 3/min --limit-burst 10 -j RETURN

-A ufw-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW BLOCK] "

-A ufw-not-local -m addrtype --dst-type LOCAL -j RETURN

-A ufw-not-local -m addrtype --dst-type MULTICAST -j RETURN

-A ufw-not-local -m addrtype --dst-type BROADCAST -j RETURN

-A ufw-not-local -m limit --limit 3/min --limit-burst 10 -j ufw-logging-deny

-A ufw-not-local -j DROP

-A ufw-skip-to-policy-forward -j ACCEPT

-A ufw-skip-to-policy-input -j DROP

-A ufw-skip-to-policy-output -j ACCEPT

-A ufw-track-forward -p tcp -m conntrack --ctstate NEW -j ACCEPT

-A ufw-track-forward -p udp -m conntrack --ctstate NEW -j ACCEPT

-A ufw-track-output -p tcp -m conntrack --ctstate NEW -j ACCEPT

-A ufw-track-output -p udp -m conntrack --ctstate NEW -j ACCEPT

-A ufw-user-input -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -m recent --set --name DEFAULT --mask 255.255.255.255 --rsource

-A ufw-user-input -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 30 --hitcount 6 --name DEFAULT --mask 255.255.255.255 --rsource -j ufw-user-limit

-A ufw-user-input -p tcp -m tcp --dport 22 -j ufw-user-limit-accept

-A ufw-user-input -p tcp -m tcp --dport 2375 -j ACCEPT

-A ufw-user-input -p tcp -m tcp --dport 2376 -j ACCEPT

-A ufw-user-limit -m limit --limit 3/min -j LOG --log-prefix "[UFW LIMIT BLOCK] "

-A ufw-user-limit -j REJECT --reject-with icmp-port-unreachable

-A ufw-user-limit-accept -j ACCEPT

root@docker-s-1vcpu-1gb-lon1-01:~# 

root@docker-s-1vcpu-1gb-lon1-01:~# docker inspect django | tail -n51
        "NetworkSettings": {
            "Bridge": "",
            
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "8000/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "56733"
                    }
                ],
                "9000/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "9000"
                    }
                ]
            },
            
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "8eddd72be1915a2d0f5eb1a4812271debc4e4eca103800ede3511f3f4c56ae98",
                    
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]







root@docker-s-1vcpu-1gb-lon1-01:~# docker inspect nginx
[
    {
        
        "RepoTags": [
            "nginx:latest"
        ],
        "RepoDigests": [
            
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2020-11-18T07:48:35.319575714Z",
        "Container": "7e8ca989e54001b9955974e36eb6d679ab4fe015066014645ef927fe88c326ec",
        "ContainerConfig": {
            "Hostname": "7e8ca989e540",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.19.4",
                "NJS_VERSION=0.4.4",
                "PKG_RELEASE=1~buster"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"nginx\" \"-g\" \"daemon off;\"]"
            ],
            
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGTERM"
        },
        "DockerVersion": "19.03.12",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.19.4",
                "NJS_VERSION=0.4.4",
                "PKG_RELEASE=1~buster"
            ],
            "Cmd": [
                "nginx",
                "-g",
                "daemon off;"
            ],
            
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGTERM"
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 132890123,
        "VirtualSize": 132890123,
        "GraphDriver": {
            "Data": {
               
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
              
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]



root@docker-s-1vcpu-1gb-lon1-01:~# docker inspect postgreSQL
[
    {
        "Id": "c0e06b4a1fa410d0344e7b40fbc7b78308f70638affa65266357c8346570bf4e",
        "Created": "2020-11-25T11:54:28.352080019Z",
        "Path": "docker-entrypoint.sh",
        "Args": [
            "-c",
            "config_file=/etc/postgresql/postgresql.conf"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 437388,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2020-11-25T11:54:28.93246511Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        
        "ResolvConfPath":             "Name": "/postgreSQL",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "docker-default",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": [
                "/root/babymusic_django_server/postgreSql/appdata:/var/lib/postgresql/data/pgdata",
                "/root/babymusic_django_server/postgreSql/my-postgres.conf:/etc/postgresql/postgresql.conf"
            ],
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {
                "5432/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "5432"
                    }
                ]
            },
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            
            
            
          
            
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": null,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "MaskedPaths": [
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "LowerDir":                     
            },
            "Name": "overlay2"
        },
        "Config": {
            "Hostname": "c0e06b4a1fa4",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "5432/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                
                "POSTGRES_USER=romain",
                "POSTGRES_DB=baby_music",
                "PGDATA=/var/lib/postgresql/data/pgdata",
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/postgresql/13/bin",
                "GOSU_VERSION=1.12",
                "LANG=en_US.utf8",
                "PG_MAJOR=13",
                "PG_VERSION=13.1-1.pgdg100+1"
            ],
            "Cmd": [
                "-c",
                "config_file=/etc/postgresql/postgresql.conf"
            ],
            "Image": "postgres:13",
            "Volumes": {
                "/var/lib/postgresql/data": {}
            },
            "WorkingDir": "",
            "Entrypoint": [
                "docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {},
            "StopSignal": "SIGINT"
        },
        "NetworkSettings": {
            "Bridge": "",
            
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "5432/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "5432"
                    }
                ]
            },
            
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.4",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:04",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "8eddd72be1915a2d0f5eb1a4812271debc4e4eca103800ede3511f3f4c56ae98",
                    
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.4",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:04",
                    "DriverOpts": null
                }
            }
        }
    }
]
root@docker-s-1vcpu-1gb-lon1-01:~# 



root@docker-s-1vcpu-1gb-lon1-01:~# docker inspect PostGresqlAdmin 
[
    {
        "Path": "entrypoint.sh",
        "Args": [
            "docker-php-entrypoint",
            "php",
            "-S",
            "[::]:8080",
            "-t",
            "/var/www/html"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 454939,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2020-11-25T21:00:16.349310968Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {
                "8080/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "8081"
                    }
                ]
            },
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            
            
            
          
            
        },
        "Mounts": [],
        "Config": {
            "Hostname": "4c76998dc75a",
            "Domainname": "",
            "User": "adminer",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "8080/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
         
                           "NetworkSettings": {
            "Bridge": "",
            
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "8080/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "8081"
                    }
                ]
            },
            
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.5",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:05",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "8eddd72be1915a2d0f5eb1a4812271debc4e4eca103800ede3511f3f4c56ae98",
                    
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.5",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:05",
                    "DriverOpts": null
                }
            }
        }
    }
]

编辑 2

检查 ipv4 转发:

root@docker-s-1vcpu-1gb-lon1-01:~# sysctl net.ipv4.conf.all.forwarding
net.ipv4.conf.all.forwarding = 1

接受端口转发:

root@docker-s-1vcpu-1gb-lon1-01:~# sudo iptables -P FORWARD ACCEPT
root@docker-s-1vcpu-1gb-lon1-01:~# iptables -S | grep FORWARD
-P FORWARD ACCEPT
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -o br-ec478ce025ee -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o br-ec478ce025ee -j DOCKER
-A FORWARD -i br-ec478ce025ee ! -o br-ec478ce025ee -j ACCEPT
-A FORWARD -i br-ec478ce025ee -o br-ec478ce025ee -j ACCEPT
-A FORWARD -j ufw-before-logging-forward
-A FORWARD -j ufw-before-forward
-A FORWARD -j ufw-after-forward
-A FORWARD -j ufw-after-logging-forward
-A FORWARD -j ufw-reject-forward
-A FORWARD -j ufw-track-forward

使用172.17.0.4访问数据库:

有效!

在 --net=host 上发布会发出警告,并且不允许访问数据库:

【问题讨论】:

    标签: django postgresql docker


    【解决方案1】:

    如果您查看 nmap 输出,您会看到端口被报告为已过滤。这意味着其中之一:

    • 来自 Docker 网络(通常为 172.17. 0.0/16 )的路由设置不正确
    • 每个容器都运行自己的独立网络,子网重叠,这会阻止数据包正确路由返回
    • 或者有一个数据包过滤器 (iptables) 阻止它阻止数据包正确到达目的地。

    除了调试问题之外,我还需要来自每个容器的路由表 (ip route)、数据包过滤器输出 (iptables -S) 和 docker inspect

    更新:

    这些是我看到的潜在问题:

    修复当前设置:

    • 您的 iptables 中有 -P FORWARD DROP,这会阻止访问,请使用:sudo iptables -P FORWARD ACCEPT 启用它。
    • 请检查应设置为1sysctl net.ipv4.conf.all.forwarding,如果不编辑/etc/sysctl.conf 以修复该问题,并使用sysctl -p 重新加载设置。

    • 您也可以使用 postgresql ip 172.17.0.4 访问数据库。
    • 另一种选择是将 postgresql 网络设置为 --net=host,然后您应该能够绕过 iptables。
    • 或者,您可以通过指定 --net=container:&lt;postgresql_container_name&gt; 将您的应用程序连接到 postgresql 网络并使用 localhost 访问数据库。
    • 您可以在 docker 中创建一个单独的网络并在其中运行所有容器,这样您就可以从任何地方访问任何地方,而无需通过您的主机 IP 进行路由

    可能还有其他一些方法可以实现这一点,但我留给你自己弄清楚:)

    更新 2:

    -P INPUT DROP 也是一个问题,用这个来修复它:sudo iptables -P INPUT ACCEPT

    如果您选择第一个选项来修复当前设置,请确保保留 iptables 更改,否则您将在重新启动时丢失它们。请查阅您的 Linux 发行版手册,了解如何操作。

    【讨论】:

    • 感谢您的提示。我花了 20 分钟才更新问题...
    • # sysctl net.ipv4.conf.all.forwarding => net.ipv4.conf.all.forwarding = 1
    • 好的,我也错过了这个:-P INPUT DROP,也允许输入数据包。 (见上面的更新)
    • 太棒了!知道为什么海洋数字会这样设置默认设置吗?
    • 我认为它依赖于发行版,与 Digital Ocean 无关。我可以看到你安装了ufw,这可能是原因。您可以在此处修改 ufw 设置:/etc/default/ufw 或完全禁用它。
    猜你喜欢
    • 1970-01-01
    • 2017-10-11
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 2019-06-15
    相关资源
    最近更新 更多