Connect postgreSQL+postGIS docker container from my local network

情到浓时终转凉″ 提交于 2019-12-25 00:45:09

问题


I have built a docker container from docker hub with :

docker run --name some-postgis -e POSTGRES_PASSWORD=mysecretpassword -d mdillon/postgis
docker run -it --link some-postgis:postgres --rm postgres \
    sh -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres'

An inspect :

$ docker inspect b89c7f54e76a
[
    {
        "Id": "b89c7f54e76aa82bd142e1eb45a1f12008bf2ee2f94e392b08b386493b58891f",
        "Created": "2017-08-08T14:34:02.375576229Z",
        "Path": "docker-entrypoint.sh",
        "Args": [
            "postgres"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 8293,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2017-08-09T10:08:11.317833478Z",
            "FinishedAt": "2017-08-08T18:18:17.110547652Z"
        },
        "Image": "sha256:1c5da6633b90bfb50486b543dd11c7efb800e6d27d338d51aaf82e929d83bde2",
        "ResolvConfPath": "/var/lib/docker/containers/b89c7f54e76aa82bd142e1eb45a1f12008bf2ee2f94e392b08b386493b58891f/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/b89c7f54e76aa82bd142e1eb45a1f12008bf2ee2f94e392b08b386493b58891f/hostname",
        "HostsPath": "/var/lib/docker/containers/b89c7f54e76aa82bd142e1eb45a1f12008bf2ee2f94e392b08b386493b58891f/hosts",
        "LogPath": "/var/lib/docker/containers/b89c7f54e76aa82bd142e1eb45a1f12008bf2ee2f94e392b08b386493b58891f/b89c7f54e76aa82bd142e1eb45a1f12008bf2ee2f94e392b08b386493b58891f-json.log",
        "Name": "/psql-futurSahel",
        "RestartCount": 0,
        "Driver": "aufs",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "docker-default",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": null,
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DiskQuota": 0,
            "KernelMemory": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": -1,
            "OomKillDisable": false,
            "PidsLimit": 0,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0
        },
        "GraphDriver": {
            "Data": null,
            "Name": "aufs"
        },
        "Mounts": [
            {
                "Type": "volume",
                "Name": "bb59bb5d17ad6b3ca59d7acf5c21936ce19fb15ec9fa13388ce63c01ed559f37",
                "Source": "/var/lib/docker/volumes/bb59bb5d17ad6b3ca59d7acf5c21936ce19fb15ec9fa13388ce63c01ed559f37/_data",
                "Destination": "/var/lib/postgresql/data",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
        "Config": {
            "Hostname": "b89c7f54e76a",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "5432/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "POSTGRES_PASSWORD=postgres",
                "PATH=/usr/lib/postgresql/9.6/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "GOSU_VERSION=1.7",
                "LANG=en_US.utf8",
                "PG_MAJOR=9.6",
                "PG_VERSION=9.6.3-1.pgdg80+1",
                "PGDATA=/var/lib/postgresql/data",
                "POSTGIS_MAJOR=2.3",
                "POSTGIS_VERSION=2.3.2+dfsg-1~exp2.pgdg80+1"
            ],
            "Cmd": [
                "postgres"
            ],
            "ArgsEscaped": true,
            "Image": "mdillon/postgis",
            "Volumes": {
                "/var/lib/postgresql/data": {}
            },
            "WorkingDir": "",
            "Entrypoint": [
                "docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {}
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "07536f68477b1f345cff2caa3118d7ee9251b0a84a2ef6a1f641c24aecd1ae53",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "5432/tcp": null
            },
            "SandboxKey": "/var/run/docker/netns/07536f68477b",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "98ca66036295516d5d653b865f3bf4de976b1f8fc704269ef5d7d067817a8c4d",
            "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": "1f95d91f247bb8cb99e8eb5c1d3911b82812947880c9e2ba6ec4db3cdc8f131b",
                    "EndpointID": "98ca66036295516d5d653b865f3bf4de976b1f8fc704269ef5d7d067817a8c4d",
                    "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
                }
            }
        }
    }
]

It works like a charm on my Desktop and I can use psql to interact with the server. It works perfectly!

psql -h 172.17.0.2 -p 5432 -U postgres

But I would like to allow my colleague to connect the data base, and I don't understand well how it works ...

At this point (if we assume my local IP is 192.168.0.14)

psql -h 192.168.0.14 -p 5432 -U postgres

Doesn't work ...

I have found some link like :

  • https://developer.ibm.com/recipes/tutorials/networking-your-docker-containers-using-docker0-bridge/
  • http://blog.oddbit.com/2014/08/11/four-ways-to-connect-a-docker/

But it still notes clear.


回答1:


What you need to do is port mapping while running the container.

docker run -p 5432:5432 --name some-postgis -e POSTGRES_PASSWORD=mysecretpassword -d mdillon/postgis

This would map the 5432 (left side) on host to 5432 (right side) on container. Your colleague will be able to access the DB as long as your IP is reachable from his machine




回答2:


The reason your colleague can not connect is because you are using the Host-Machine to Docker internal IP Adress, and your colleagues machine does not realize that the 172.17.0.2 address is hosted on your machine.

The correct mechanism is therefore as @Tarun Lalwani mentioned

And now your colleague would connect using your machine i.e. the host of the dockers public ip address.



来源:https://stackoverflow.com/questions/45597167/connect-postgresqlpostgis-docker-container-from-my-local-network

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!