[英]How to connect docker-compose to container network and localhost network
[英]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:10051
和zabbix-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.