【问题标题】:Running mongodb docker container managed by supervisor运行由主管管理的 mongodb docker 容器
【发布时间】:2020-12-17 12:00:49
【问题描述】:

为了在 一个 docker 容器中运行多个服务(我知道这不是它的意图),我从here 中选择了一个官方 docker 镜像

并通过安装supervisor扩展Dockerfile

RUN apt-get update && \
    apt-get install -y supervisor && \
    apt-get clean

RUN mkdir -p /var/log/supervisor
COPY ./supervisord.conf /etc/supervisord.conf
EXPOSE 27017 9001 
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]

还有supervisord.conf 文件:

[supervisord]
nodaemon=true

[program:mongo]
user=root
command=/usr/bin/mongod --port 27017 --quiet --logpath /var/log/mongodb/mongod.log --logappend
process_name=%(program_name)s
autostart=true
user=root
startsecs=3                   
redirect_stderr=true
stdout_logfile=/var/log/mongod.log

为了简单起见,我只是发布 mongodb 服务。使用 docker-compose 我正在启动由主管管理的 mongodb docker-container 和另一个尝试连接到数据库的服务:

version: '3.7'
services:
  mongodb:
    restart: on-failure:2
    image: mongodb
    container_name: mongodb
    ports:
      - "27017:27017"
    init: true
    networks:
      - mongonet
    healthcheck:
      test: "exit 0"
    volumes:
      - ./datadir:/var/lib/mongo

#
  login-service:
    restart: on-failure:2
    container_name: login-service
    image: login-service
    depends_on:
      - mongodb
    ports:
      - "8082:8082"
    networks:
      - mongonet
    healthcheck:
      test: "exit 0"


networks:
  mongonet:
    driver: bridge
 

这会产生以下错误:

com.mongodb.MongoSocketOpenException: Exception opening socket
at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:70) ~[mongodb-driver-core-4.0.5.jar!/:na]
at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:127) ~[mongodb-driver-core-4.0.5.jar!/:na]
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117) ~[mongodb-driver-core-4.0.5.jar!/:na]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_212]
Caused by: java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_212]

好像我缺少一个网络配置。我尝试在/etc/mongod.conf.orig 中更改bindIP,但似乎mongodb 服务在重新启动后没有获取此配置。日志告诉我 mongodb 正在等待连接:

{"t":{"$date":"2020-12-17T10:07:37.020+00:00"},"s":"I",  "c":"NETWORK",  "id":23016,   "ctx":"listener","msg":"Waiting for connections","attr":{"port":27017,"ssl":"off"}}

是否缺少主管命令的某种参数?任何帮助将不胜感激。

【问题讨论】:

    标签: mongodb docker supervisord


    【解决方案1】:

    我找到了一个解决方案,并且我与主管中的网络配置相差不远。通过将--bind_ip 0.0.0.0 添加到supervisor 命令中,我能够绑定所有IPv4 和IPv6 地址,如here 所述。还有一个参数--bind_ip_all 帮助我实现了同样的目标。这是我最终的主管配置:

    [supervisord]
    nodaemon=true
    
    [program:mongo]
    command=/usr/bin/mongod --bind_ip_all
    autorestart=true
    stderr_logfile=/dev/stdout
    stderr_logfile_maxbytes = 0
    stdout_logfile=/dev/stdout
    stdout_logfile_maxbytes = 0
    

    替代方案

    此外,如果您不需要自己构建映像,还有一个更好的解决方案:

    Dockerfile:

    FROM mongo:bionic
    
    RUN apt-get update && \
        apt-get install -y supervisor && \
        apt-get clean
    
    RUN mkdir -p /var/log/supervisor
    COPY ./supervisord.conf /etc/supervisord.conf
    EXPOSE 27017 9001 
    
    CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]
    

    ... 和 supervisord.conf 文件:

    [supervisord]
    nodaemon=true
    
    [program:mongo]
    command=/usr/local/bin/docker-entrypoint.sh mongod
    autorestart=true
    stderr_logfile=/dev/stdout
    stderr_logfile_maxbytes = 0
    stdout_logfile=/dev/stdout
    stdout_logfile_maxbytes = 0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-15
      • 1970-01-01
      • 2016-07-25
      • 2017-12-20
      • 1970-01-01
      • 2017-02-12
      • 2017-11-22
      • 1970-01-01
      相关资源
      最近更新 更多