理解Docker网络隔离

3
我已经创建了以下docker-compose文件...
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从主机访问数据库。
实际上,如果我注释掉expose和ports行,我仍然可以从主机访问两个容器。
我错过了什么?
编辑 - 我通过首先运行“docker container inspect ...”来获取IP地址来访问容器。对于postgres容器,我正在使用
psql -h xxx.xxx.xxx.xxx -U postgres

它会提示我输入密码,然后允许我执行所有你所期望的正常操作。

对于pgadmin容器,我将浏览器指向IP地址并获取pgadmin界面。

请注意,这两个操作都是在主机上的终端中执行的,而不是在任何容器内部执行的。我还注释掉了暴露命令,但仍然可以访问postgres数据库。


你是如何从主机访问容器的?你运行了什么 psql 命令? - David Maze
EXPOSE 只是文档说明。您可以启动一个不暴露任何端口的容器,然后在不同的端口上启动一些守护进程。主机将能够通过 container_ip:port 访问它们。更多信息请参见此处 - tgogos
3个回答

4
docker-compose会创建一个网络,使这两个容器在运行时能够通过DNS服务互相通信,其中DNS服务将包含每个服务的指针,按名称进行区分。
pgadmin容器的角度来看,可以使用主机名db-service访问dbserver(因为您在docker-compose.yml文件中命名了该服务)。
因此,流量并不像您所想象的那样经过主机,而是通过上述网络。
为证明,执行 docker exec -it [name-of-pg-admin-container] /bin/sh 命令并键入:ping db-service。 您会发现Docker提供了DNS解析,并且您甚至可以在那里打开到普通Postgres端口的连接。

0

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

当您暴露端口时,会在IPTABLES中创建端口转发,以连接主机网络和net1。

停止暴露db-service的5432端口,您会发现无法从主机连接到db-service。


0
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 Compose ports:选项),否则容器无法从其他主机访问。与标准应用程序相比,这里的设置要统一得多:在容器内设置应用程序以侦听0.0.0.0(“所有主机接口”,通常为默认值),然后根据需要发布端口或不发布端口。如果主机有多个接口,则可以仅在其中一个接口上发布端口(即使应用程序本身不支持该功能)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接