我已经创建了以下文件.
version: '3'
services:
db-service:
image: postgres:11
volumes:
- ./db:/var/lib/postgresql/data
expose:
- 5432
environment:
- POSTGRES_PASSWORD=mypgpassword
networks:
- net1
pgadmin:
image: dpage/pgadmin4
volumes:
- ./pgadmin:/var/lib/pgadmin
ports:
- 5000:80
environment:
- PGADMIN_DEFAULT_EMAIL=me@gmail.com
- PGADMIN_DEFAULT_PASSWORD=mypass
networks:
- net1
networks:
net1:
external: false通过在docker站点上阅读各种文档,我期望pgadmin容器能够通过端口5432访问postgres容器,但我不应该能够直接从主机访问postgres。但是,我可以使用psql从主机访问数据库。
事实上,如果我注释掉公开和端口行,我仍然可以从主机访问两个容器。
我错过了什么?
编辑-我是通过首先运行docker container inspect...来访问容器来获取IP地址。对于我使用的postgres容器
psql -h xxx.xxx.xxx.xxx -U postgres它提示我输入密码,然后允许我做所有你期望的正常事情。
在pgadmin容器的情况下,我将浏览器指向IP地址并获取pgadmin接口。
请注意,这两种方法都是从主机上的终端执行的,而不是在两个容器中执行的。我还注释掉了access命令,并且仍然可以访问postgres。
发布于 2019-03-01 15:27:05
docker-compose为这两个容器创建了一个网络,当您运行它时,它可以通过一个包含指向每个服务的指针的DNS服务来彼此交谈。
因此,从pgadmin容器的角度来看,可以在主机名db-service下访问dbserver (因为您在docker-come.yml文件中将服务命名为这个名称)。
因此,流量不是通过主机,而是通过前面提到的网络。
作为证明,docker exec -it [name-of-pg-admin-container] /bin/sh和类型:ping db-service。您将看到docker提供了DNS解析,甚至可以打开一个连接到那里的一般postgres端口。
发布于 2019-03-01 15:40:45
这些容器通过网桥网络net1相互连接。
当您公开端口时,您可以在IPTABLES中创建端口转发,用于连接主机网络和net1。
停止暴露数据库服务中的5432端口,您会发现无法从主机连接到db-服务。
发布于 2019-03-01 16:36:56
Docker为每个容器分配内部IP地址。如果您碰巧有这个地址,并且它恰好是可访问的,那么Docker不会做任何特定的防火墙关闭它。特别是在Linux主机上,如果特定的Docker网络是在172.17.0.0/24上,主机可能有一个172.17.0.1地址,一个特定的容器可能是172.17.0.2,它们可以这样相互交谈。
使用Docker内部IP地址的不是最佳实践。如果删除并重新创建容器,其IP地址将发生变化;在某些主机平台上,即使从同一台主机也无法直接访问私有IP地址;其他主机也无法访问私有IP地址。在常规使用中,您不应该需要docker inspect容器。
您在这里获得的重要隔离级别是,除非显式发布端口(docker run -p选项,Docker ports:选项),否则容器无法从其他主机访问。这里的设置比标准应用程序要统一得多:在容器中设置应用程序以侦听0.0.0.0 (“所有主机接口”,通常是默认的),然后根据需要发布端口或不发布端口。如果主机有多个接口,则只能在其中一个接口上发布一个端口(即使应用程序本机不支持该接口)。
https://stackoverflow.com/questions/54947559
复制相似问题