2016-02-24 6 views
2

У меня проблема с использованием сельдерея в докер.Сельдерей не работает на докер

Я сконфигурировал два контейнера для докеров, web_server и celery_worker. celery_worker включает сервер rabbitmq. Веб-сервер вызывает задачу у работника сельдерея.

Я сконфигурировал то же самое в VM бродягой. И это работает. Но докер выдает сообщение об ошибке, как показано ниже.

Traceback (most recent call last): 
    File "/web_server/test/test_v1_data_description.py", line 58, in test_create_description 
    headers=self.get_basic_header() 

    ......... 
    ......... 

    File "../task_runner/__init__.py", line 31, in run_describe_task 
    kwargs={}) 
    File "/usr/local/lib/python3.4/dist-packages/celery/app/base.py", line 349, in send_task 
    self.backend.on_task_call(P, task_id) 
    File "/usr/local/lib/python3.4/dist-packages/celery/backends/rpc.py", line 32, in on_task_call 
    maybe_declare(self.binding(producer.channel), retry=True) 
    File "/usr/local/lib/python3.4/dist-packages/kombu/messaging.py", line 194, in _get_channel 
    channel = self._channel = channel() 
    File "/usr/local/lib/python3.4/dist-packages/kombu/utils/__init__.py", line 425, in __call__ 
    value = self.__value__ = self.__contract__() 
    File "/usr/local/lib/python3.4/dist-packages/kombu/messaging.py", line 209, in <lambda> 
    channel = ChannelPromise(lambda: connection.default_channel) 
    File "/usr/local/lib/python3.4/dist-packages/kombu/connection.py", line 756, in default_channel 
    self.connection 
    File "/usr/local/lib/python3.4/dist-packages/kombu/connection.py", line 741, in connection 
    self._connection = self._establish_connection() 
    File "/usr/local/lib/python3.4/dist-packages/kombu/connection.py", line 696, in _establish_connection 
    conn = self.transport.establish_connection() 
    File "/usr/local/lib/python3.4/dist-packages/kombu/transport/pyamqp.py", line 116, in establish_connection 
    conn = self.Connection(**opts) 
    File "/usr/local/lib/python3.4/dist-packages/amqp/connection.py", line 165, in __init__ 
    self.transport = self.Transport(host, connect_timeout, ssl) 
    File "/usr/local/lib/python3.4/dist-packages/amqp/connection.py", line 186, in Transport 
    return create_transport(host, connect_timeout, ssl) 
    File "/usr/local/lib/python3.4/dist-packages/amqp/transport.py", line 299, in create_transport 
    return TCPTransport(host, connect_timeout) 
    File "/usr/local/lib/python3.4/dist-packages/amqp/transport.py", line 95, in __init__ 
    raise socket.error(last_err) 
nose.proxy.OSError: [Errno 111] Connection refused 

Это докеры для двух контейнеров.

Dockerfile для web_server.

FROM ubuntu:14.04 
MAINTAINER Jinho Yoo 

# Update packages. 
RUN apt-get clean 
RUN apt-get update 

# Create work folder. 
RUN mkdir /web_server 
WORKDIR /web_server 

# Setup web server and celery. 
ADD ./install_web_server_conf.sh ./install_web_server_conf.sh 
RUN chmod +x ./install_web_server_conf.sh 
RUN ./install_web_server_conf.sh 

#Reduce docker size. 
RUN rm -rf /var/lib/apt/lists/* 

# Run web server. 
CMD ["python3","web_server.py"] 

# Expose port. 
EXPOSE 5000 

Dockerfile для celery_worker.

FROM ubuntu:14.04 
MAINTAINER Jinho Yoo 

# Update packages. 
RUN apt-get clean 
RUN apt-get update 
RUN apt-get install -y wget build-essential ca-certificates-java 

# Setup python environment. 
ADD ./bootstrap/install_python_env.sh ./install_python_env.sh 
RUN chmod +x ./install_python_env.sh 
RUN ./install_python_env.sh 

# Install Python libraries including celery. 
RUN pip3 install -r ./core/requirements.txt 

# Add mlcore user for Celery worker 
RUN useradd --uid 1234 -M mlcore 
RUN usermod -L mlcore 

# Celery configuration for supervisor 
ADD celeryd.conf /etc/supervisor/conf.d/celeryd.conf 
RUN mkdir -p /var/log/celery 

# Reduce docker size. 
RUN rm -rf /var/lib/apt/lists/* 

# Run celery server by supervisor. 
CMD ["supervisord", "-c", "/ml_core/supervisord.conf"] 

# Expose port. 
EXPOSE 8080 
EXPOSE 8081 
EXPOSE 4040 
EXPOSE 7070 
EXPOSE 5672 
EXPOSE 5671 
EXPOSE 15672 

ответ

0

Я нашел причину. Докерный контейнер в celery_worker не запускается rabbitmq-server. Поэтому я добавил две строки в Dockerfile celery_worker, как показано ниже.

# Run rabbitmq server and celery. 
ENTRYPOINT service rabbitmq-server start && supervisord -c /ml_core/supervisord.conf 
0

Докерные контейнеры не могут разговаривать друг с другом нормально. Я предполагаю, что ваша строка соединения - это что-то вроде localhost:<port>?

Существует несколько способов связаться с вашими контейнерами.

1: связывание http://rominirani.com/2015/07/31/docker-tutorial-series-part-8-linking-containers/

по существу, во время выполнения, докер добавляет запись в файл хостов, что указывает на внутренний IP-адрес контейнера Docker в той же частной стека докер сети.

2: docker run --net=host: это связывает ваши контейнеры с вашего стека хост-сети, таким образом, все контейнеры по всей видимости, работает от localhost, и могут быть доступны как таковой. Вы можете столкнуться с проблемами конфликтов портов, если вы используете несколько контейнеров, которые привязаны к одному и тому же внешнему порту, просто имейте это в виду.

3: внешний HAProxy: вы можете связать запись DNS с HAProxy и настроить прокси для перенаправления трафика с хостом-хостом, который соответствует записи DNS на хост: порт, на котором запущен ваш контейнер, и любые вызовы от другие контейнеры «оставят» частный сетевой стек докеров, ударят по DNS-серверу и вернутся обратно в HAProxy, который направит в соответствующий контейнер.

Смежные вопросы