Docker swarm - 记录到 rsyslog 容器
Docker swarm - log to rsyslog container
我有一个包含 6 个服务的 docker 群,我想将它们记录到一个中央日志容器中。
我在我的开发环境(非 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
我在设置开发环境时遇到了 syslog-address 的问题...我觉得奇怪的是我必须使用本地主机而不是日志容器的 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
产量:
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" \
容器之间的网络将使用基于 DNS 的发现,只要它们 运行 在同一网络上。容器内的本地主机与容器外 docker 主机上的本地主机是一个单独的命名空间,因此容器将看不到 docker 主机上发布的具有环回地址的端口。您可以通过主机名而不是本地主机连接到您的 docker 主机。但是,容器到容器的网络更具可移植性。
我认为这在 localhost 开发中可行的唯一原因是如果您的服务使用主机网络模式,而不是连接到覆盖网络。
我有一个包含 6 个服务的 docker 群,我想将它们记录到一个中央日志容器中。 我在我的开发环境(非 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
我在设置开发环境时遇到了 syslog-address 的问题...我觉得奇怪的是我必须使用本地主机而不是日志容器的 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
产量:
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" \
容器之间的网络将使用基于 DNS 的发现,只要它们 运行 在同一网络上。容器内的本地主机与容器外 docker 主机上的本地主机是一个单独的命名空间,因此容器将看不到 docker 主机上发布的具有环回地址的端口。您可以通过主机名而不是本地主机连接到您的 docker 主机。但是,容器到容器的网络更具可移植性。
我认为这在 localhost 开发中可行的唯一原因是如果您的服务使用主机网络模式,而不是连接到覆盖网络。