首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解码头网络隔离

了解码头网络隔离
EN

Stack Overflow用户
提问于 2019-03-01 15:22:16
回答 3查看 3.7K关注 0票数 3

我已经创建了以下文件.

代码语言:javascript
复制
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容器

代码语言:javascript
复制
psql -h xxx.xxx.xxx.xxx -U postgres

它提示我输入密码,然后允许我做所有你期望的正常事情。

在pgadmin容器的情况下,我将浏览器指向IP地址并获取pgadmin接口。

请注意,这两种方法都是从主机上的终端执行的,而不是在两个容器中执行的。我还注释掉了access命令,并且仍然可以访问postgres。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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端口。

票数 2
EN

Stack Overflow用户

发布于 2019-03-01 15:40:45

这些容器通过网桥网络net1相互连接。

当您公开端口时,您可以在IPTABLES中创建端口转发,用于连接主机网络和net1。

停止暴露数据库服务中的5432端口,您会发现无法从主机连接到db-服务。

票数 0
EN

Stack Overflow用户

发布于 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 (“所有主机接口”,通常是默认的),然后根据需要发布端口或不发布端口。如果主机有多个接口,则只能在其中一个接口上发布一个端口(即使应用程序本机不支持该接口)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54947559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档