Docker swarm - 登录到rsyslog容器

时间:2017-06-07 21:50:15

标签: logging docker syslog docker-swarm rsyslog

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

当我尝试将配置从dev env转换到我的swarm 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

设置dev env时我遇到了syslog-address的问题...我觉得很奇怪我必须使用localhost而不是日志容器的docker dns名称...但是en dev可以使用本地主机。

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

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会产生:

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  

1 个答案:

答案 0 :(得分:1)

变化:

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

为:

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

容器之间的网络将使用基于DNS的发现,只要它们在同一网络上运行即可。容器内的Localhost是与容器外部的docker主机上的localhost分开的命名空间,因此容器不会看到docker主机上发布的具有环回地址的端口。您可以通过它的主机名而不是localhost连接到docker主机。但是,容器到容器的网络更便携。

我认为这可以在dev中使用localhost的唯一原因是你的服务是使用主机网络模式,而不是连接到覆盖网络。