同一宿主机下docker互相访问

what

该文档解决:docker下,altermanager收不到prometheus消息

事因,我在一个宿主机下建立了多个docker容器

  • node-exporter
  • prometheus
  • grafana
  • alertmanager
  • timonwong/prometheus-webhook-dingtalk

这些服务之间会有一些互相访问,如prometheus可以发送数据给alertmanager来发送报警信息,alertmanager通过规则处理可以发送邮件,发送钉钉等方式告知用户,问题就出在prometheus的yml配置文档中:

1
2
3
4
5
6
7
8
9
10
11
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9002']

###############
修改后:
alerting:
alertmanagers:
- static_configs:
- targets: ['10.10.10.10:9002']

问题出在了prometheus的配置中访问了localhost端口,但这个并不是访问宿主机的9002的端口,而是访问的是docker内部的9002端口

找到问题后,使用了宿主机ip+port的方式进行访问

how

查询了资料后,发现解决该问题的方法有:

  • 宿主ip:port访问
  • 容器ip访问
  • link建立通信网络(单向,不推荐)–link xxx
  • user-defined networks(docker dns server/bridge)

前两种不太推荐,因为如果容器ip更改或者宿主机ip更改就需要更新配置文档,第三种方法不太推荐,run 时候link只是单向的建立连接,第四种docker network create

1
2
3
4
//创建网络
docker network create -d bridge my-bridge-network
//run时候加入网络
docker run -it --network test-network --network-alias mysql -e MYSQL_ROOT_PASSWORD=123 mysql:5.7