了解 Docker 网络隔离

daz*_*sed 3 docker docker-compose

我创建了以下 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
Run Code Online (Sandbox Code Playgroud)

通过阅读 docker 站点上的各种文档,我的期望是 pgadmin 容器能够通过端口 5432 访问 postgres 容器,但我不应该能够直接从主机访问 postgres。但是,我可以使用 psql 从主机访问数据库。

事实上,如果我注释掉公开和端口行,我仍然可以从主机访问这两个容器。

我对此缺少什么?

docker container inspect...编辑 - 我通过首先运行来获取 IP 地址来访问容器。对于我正在使用的 postgres 容器

psql -h xxx.xxx.xxx.xxx -U postgres
Run Code Online (Sandbox Code Playgroud)

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

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

请注意,这两个命令都是从主机上的终端执行的,而不是从任一容器内执行的。我还注释掉了公开命令,并且仍然可以访问 postgres 数据库。

Han*_*eek 5

docker-compose为这两个容器创建一个网络,以便在运行时能够通过 DNS 服务相互通信,该服务将包含按名称指向每个服务的指针。

因此,从容器的角度来看pgadmin,可以在主机名下访问数据库服务器db-service(因为这是您在 docker-compose.yml 文件中为服务命名的名称)。

因此,该流量不会像您假设的那样通过主机,而是通过上述网络。

为了证明,docker exec -it [name-of-pg-admin-container] /bin/sh请输入: ping db-service。您将看到 docker 提供了 DNS 解析,您甚至可以在那里打开到普通 postgres 端口的连接。