Docker swarm – login到rsyslog容器

我有一个docker群,有6个服务,我想logging到一个中央日志logging容器。 我有这个工作在我的开发环境(非swarm) – 请参阅下面的docker-compose文件。

当我尝试将configuration从dev env转换到我的swd prod env时,它失败。

首先我提出日志服务:

docker service create --replicas 1 \ --name logserver \ --network phototankswarm \ --constraint=node.hostname==pi2 \ -p localhost:5514:514 \ kaninfod/pt-syslog 

这很好地运行。

然后其中一个服务(例如redis):

 docker service create --replicas 1 \ --name redis \ --network phototankswarm \ --constraint=node.hostname==pi1 \ --log-driver=syslog \ --log-opt syslog-facility="daemon" \ --log-opt tag="rails" \ --log-opt syslog-address="tcp://localhost:5514" \ -p 6379:6379 \ armhf/redis 

这失败了:

 starting container failed: Failed to initialize logging driver: dial tcp [::1]:5514: getsockopt: connection refused 

我在设置开发环境时遇到了系统日志地址问题…我觉得很奇怪,我必须使用本地主机,而不是日志容器的docker dns名称…但是它的开发工作与本地主机。

这是我用于我的开发环境的撰写文件:

 version: '3' services: nginx: image: nginx depends_on: - api - syslog ports: - "80:8080" logging: driver: syslog options: syslog-facility: "daemon" tag: "nginx" syslog-address: "tcp://localhost:5514" networks: - phototankswarm env_file: .env.dev volumes: - ./frontend/nginx/conf.d:/etc/nginx/conf.d - ./frontend/public:/www db: image: mysql env_file: .env.dev depends_on: - syslog networks: - phototankswarm ports: - "3306:3306" volumes: - ./sql/data:/var/lib/mysql logging: driver: syslog options: syslog-facility: "daemon" tag: "mysql" syslog-address: "tcp://localhost:5514" redis: image: redis depends_on: - syslog networks: - phototankswarm logging: driver: syslog options: syslog-facility: "daemon" tag: "redis" syslog-address: "tcp://localhost:5514" api: image: pt-rails env_file: .env.dev networks: - phototankswarm command: > sh -c ' bundle exec sidekiq -d && bundle exec rails s -p 3000 -b 0.0.0.0 ' volumes: - /Users/martinhinge/Pictures/docker/phototank:/media/phototank - ./backend:/usr/src/app ports: - "3000:3000" depends_on: - db - redis - syslog logging: driver: syslog options: syslog-facility: "daemon" tag: "rails" syslog-address: "tcp://localhost:5514" syslog: image: syslog ports: - "localhost:5514:514" networks: - phototankswarm volumes: - /tmp:/var/log/syslog networks: phototankswarm: 

编辑

运行$ docker run -it --rm --net container:dac082edcd6f hypriot/rpi-alpine-scratch netstat -lnt yield:

 Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 127.0.0.11:35314 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN tcp 0 0 :::514 :::* LISTEN 

更改:

 --log-opt syslog-address="tcp://localhost:5514" \ 

至:

 --log-opt syslog-address="tcp://logserver:514" \ 

只要在同一个networking上运行,容器之间的networking将使用基于DNS的发现。 容器内的本地主机与容器外部的泊坞窗主机上的本地主机是独立的名称空间,因此容器将不会看到在具有回送地址的泊坞串主机上发布的端口。 您可以通过主机名而不是本地主机连接到您的docker主机。 但是,容器到容器联网更便携。

我认为这可以在本地主机开发的唯一原因是如果您的服务使用主机networking模式,而不是连接到覆盖networking。