繁体   English   中英

Docker-compose 网络:如何连接到其他容器?

[英]Docker-compose network : how to connect to other container?

我使用带有多个容器的 docker compose 运行 zabbix。

我在将两个容器相互连接时遇到问题(请参阅: docker containerized zabbix server monitoring the same host running the zabbix server:connection denied )。

所以我想知道容器之间的连接如何在 docker-compose 中工作:我需要使用 docker-compose.yml 中的links吗? 我是否需要在 docker-compose.yml 中的network中指定一个 IP 地址,然后在我的应用程序中使用这个 IP 地址?

特别是,如果我想将 docker-compose.yml 中名为 containerA 的容器 A ip 连接到 docker-compose.yml 中名为 containerB 的容器 B,我可以使用 docker ps -a 中出现的容器名称吗? (容器名称通常与 docker-compose.yml 中的容器名称不同)还是应该使用 docker-compose.yml 中出现的服务名称? 或者我应该使用链接服务:别名,以便我可以在我的应用程序中使用别名?

我曾尝试使用链接,但在将容器相互链接时遇到了循环链接问题。

这是 yml 文件(注意网络别名与第一个服务名称相同......):

version: '3.5'
services:
 zabbix-server:
  container_name: zabbixserver
  image: zabbix/zabbix-server-pgsql:centos-6.0-latest
  ports:
   - "10051:10051"
  volumes:
   - /etc/localtime:/etc/localtime:ro
   - /etc/timezone:/etc/timezone:ro
   - ./zbx_env/usr/lib/zabbix/alertscripts:/usr/lib/zabbix/alertscripts:ro
   - ./zbx_env/usr/lib/zabbix/externalscripts:/usr/lib/zabbix/externalscripts:ro
   - ./zbx_env/var/lib/zabbix/export:/var/lib/zabbix/export:rw
   - ./zbx_env/var/lib/zabbix/modules:/var/lib/zabbix/modules:rw
   - ./zbx_env/var/lib/zabbix/enc:/var/lib/zabbix/enc:ro
   - ./zbx_env/var/lib/zabbix/ssh_keys:/var/lib/zabbix/ssh_keys:ro
   - ./zbx_env/var/lib/zabbix/mibs:/var/lib/zabbix/mibs:ro
   - snmptraps:/var/lib/zabbix/snmptraps:rw
#   - ./env_vars/.ZBX_DB_CA_FILE:/run/secrets/root-ca.pem:ro
#   - ./env_vars/.ZBX_DB_CERT_FILE:/run/secrets/client-cert.pem:ro
#   - ./env_vars/.ZBX_DB_KEY_FILE:/run/secrets/client-key.pem:ro
  ulimits:
   nproc: 65535
   nofile:
    soft: 20000
    hard: 40000
  deploy:
   resources:
    limits:
     cpus: '0.70'
     memory: 1G
    reservations:
     cpus: '0.5'
     memory: 512M
  env_file:
   - ./env_vars/.env_db_pgsql
   - ./env_vars/.env_srv
  secrets:
   - POSTGRES_USER
   - POSTGRES_PASSWORD
  depends_on:
   - postgres-server
  networks:
   zbx_net_backend:
    aliases:
     - zabbix-server
     - zabbix-server-pgsql
     - zabbix-server-centos-pgsql
     - zabbix-server-pgsql-centos
   zbx_net_frontend:
#  devices:
#   - "/dev/ttyUSB0:/dev/ttyUSB0"
  stop_grace_period: 30s
  sysctls:
   - net.ipv4.ip_local_port_range=1024 65000
   - net.ipv4.conf.all.accept_redirects=0
   - net.ipv4.conf.all.secure_redirects=0
   - net.ipv4.conf.all.send_redirects=0
  labels:
   com.zabbix.description: "Zabbix server with PostgreSQL database support"
   com.zabbix.company: "Zabbix LLC"
   com.zabbix.component: "zabbix-server"
   com.zabbix.dbtype: "pgsql"
   com.zabbix.os: "centos"
zabbix-agent:
  image: zabbix/zabbix-agent:centos-6.0-latest
  ports:
   - "10050:10050"
  volumes:
   - /etc/localtime:/etc/localtime:ro
   - /etc/timezone:/etc/timezone:ro
   - ./zbx_env/etc/zabbix/zabbix_agentd.d:/etc/zabbix/zabbix_agentd.d:ro
   - ./zbx_env/var/lib/zabbix/modules:/var/lib/zabbix/modules:ro
   - ./zbx_env/var/lib/zabbix/enc:/var/lib/zabbix/enc:ro
   - ./zbx_env/var/lib/zabbix/ssh_keys:/var/lib/zabbix/ssh_keys:ro
  deploy:
   resources:
    limits:
     cpus: '0.2'
     memory: 128M
    reservations:
     cpus: '0.1'
     memory: 64M
   mode: global
  links:
   - zabbix-server:zabbix-server
  env_file:
   - ./env_vars/.env_agent
  privileged: true
  pid: "host"
  networks:
   zbx_net_backend:
    aliases:
     - zabbix-agent
     - zabbix-agent-passive
     - zabbix-agent-centos
  stop_grace_period: 5s
  labels:
   com.zabbix.description: "Zabbix agent"
   com.zabbix.company: "Zabbix LLC"
   com.zabbix.component: "zabbix-agentd"
   com.zabbix.os: "centos"

使用另一个容器的 Compose 服务名称和该容器内的进程正在侦听的端口。 在您的示例中,假设第二个ports:数字都正确,两个容器都应该能够访问zabbix-server:10051zabbix-agent:10050 另请参阅 Docker 文档中的Compose 中的网络

我需要在docker-compose.yml中使用links吗?

links:选项已过时,如果存在,您应该将其删除。 expose:同样仅由过时的第一代 Docker 网络使用,从 Compose 文件中删除它没有任何后果。

我需要在docker-compose.yml中指定networks中的 IP 地址吗?

不,Docker 可以自行分配容器专用 IP 地址。 这些是 Docker 的内部实现细节。 知道它们的存在是很有用的(特别是,由于每个容器都有一个私有 IP 地址,因此多个容器可以在内部使用相同的端口),但您永远不需要直接指定它们或查找它们。

您很少需要指定networks: { aliases: }或覆盖容器生成的container_name: docker ps名称与 Compose 文件中的名称不匹配,但这不是实际问题。 如果您需要直接管理单个容器,您可以例如docker-compose stop zabbix-server ,并且如前所述,您可以使用 Compose 服务名称进行容器到容器的通信。

事实上,对于大多数实际情况,您可以完全删除所有networks:块。 Compose 为您提供了一个名为default的网络,您通常不需要配置任何东西。

因此,在您最初显示的文件中,我建议删除所有networks:links:container_name:选项。 ports:仅当您想从 Docker 外部调用这些容器时才需要。 即使删除这些,您也可以使用最初显示的主机名和端口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM