복붙노트

[REDIS] 어떻게 레디 스 서버와 도커 안에 다른 응용 프로그램을 실행하려면?

REDIS

어떻게 레디 스 서버와 도커 안에 다른 응용 프로그램을 실행하려면?

나는 도커 컨테이너 내에서 실행 장고 응용 프로그램을 만들었습니다. 나는 셀러리 데이터베이스로 셀러리와 레디 스를 사용 그래서 장고 응용 프로그램 내부 스레드를 만들 필요가 있었다. 나는 고정 표시기 이미지 레디 스 (우분투 14.04)를 설치하는 경우 :

RUN apt-get update && apt-get -y install redis-server
RUN pip install redis

레디 스 서버가 시작되지 않습니다 장고 응용 프로그램에서 예외가 발생 내가 수동으로 레디 스를 시작하면 연결이 포트 6379. 거절하기 때문에, 그것을 작동합니다.

나는 다음과 같은 명령을 사용하여 레디 스 서버를 시작하면, 중단 :

RUN redis-server

나는 이전 줄을 조정할하려고하면, 그 중 하나가 작동하지 않습니다

RUN nohup redis-server &

그래서 내 질문은 : 배경과 부두 노동자 컨테이너를 다시 시작할 때 다시 시작하게하는 레디 스를 시작하는 방법은 무엇입니까?

도커 "마지막 명령은"이미 사용됩니다 :

CMD uwsgi --http 0.0.0.0:8000 --module mymodule.wsgi

해결법

  1. ==============================

    1.RUN 명령은 새 이미지 레이어를 추가하고 있습니다. 그들은 런타임시 실행되지 않습니다. 만 이미지의 빌드 시간 동안.

    RUN 명령은 새 이미지 레이어를 추가하고 있습니다. 그들은 런타임시 실행되지 않습니다. 만 이미지의 빌드 시간 동안.

    대신 사용 CMD. 당신은 CMD에 의해 호출되는 쉘 스크립트로 외부화하여 여러 명령을 결합 할 수 있습니다 :

    CMD start.sh
    

    start.sh 스크립트에서는 다음 쓰기 :

    #!/bin/bash
    nohup redis-server &
    uwsgi --http 0.0.0.0:8000 --module mymodule.wsgi
    
  2. ==============================

    2.두 프로세스를 제어 할 supervisord를 사용합니다. conf의 파일은 아래와 같다 :

    두 프로세스를 제어 할 supervisord를 사용합니다. conf의 파일은 아래와 같다 :

    ...
    [program:redis]
    command= /usr/bin/redis-server /srv/redis/redis.conf
    stdout_logfile=/var/log/supervisor/redis-server.log
    stderr_logfile=/var/log/supervisor/redis-server_err.log
    autorestart=true
    
    [program:nginx]
    command=/usr/sbin/nginx
    stdout_events_enabled=true
    stderr_events_enabled=true
    
  3. ==============================

    3.당신이 도커 컨테이너를 실행하면 항상 하나의 최상위 과정이있다. 당신이 당신의 노트북을 불 때, 그 최상위 프로세스는 "초기화"스크립트, systemd 등이다. 고정 표시기 이미지는 엔트리 포인트 지시어가 있습니다. 이것은 당신의 고정 표시기 컨테이너에서 실행이, 아무것도 당신이 그 아이되고 실행하고자하는 최고 수준의 과정이다. 하나의 부두 노동자 용기 내부의 모든 장고, 셀러리 노동자, 그리고 레디 스를 실행하려면, 당신은 자식 프로세스로의 세 가지를 모두 시작하는 프로세스를 실행해야합니다. 밀라노에서 설명한 바와 같이, 당신은 당신의 부모 프로세스로 그것을 할 수있는 관리자 구성 및 시작 관리자를 설정할 수 있습니다.

    당신이 도커 컨테이너를 실행하면 항상 하나의 최상위 과정이있다. 당신이 당신의 노트북을 불 때, 그 최상위 프로세스는 "초기화"스크립트, systemd 등이다. 고정 표시기 이미지는 엔트리 포인트 지시어가 있습니다. 이것은 당신의 고정 표시기 컨테이너에서 실행이, 아무것도 당신이 그 아이되고 실행하고자하는 최고 수준의 과정이다. 하나의 부두 노동자 용기 내부의 모든 장고, 셀러리 노동자, 그리고 레디 스를 실행하려면, 당신은 자식 프로세스로의 세 가지를 모두 시작하는 프로세스를 실행해야합니다. 밀라노에서 설명한 바와 같이, 당신은 당신의 부모 프로세스로 그것을 할 수있는 관리자 구성 및 시작 관리자를 설정할 수 있습니다.

    또 다른 옵션은 실제로 초기화 시스템을 부팅하는 것입니다. 이것은 매우 가까운 당신이 본격적으로 가상 머신을 한 것처럼 기본적으로 일을 실행하기 때문에 당신이 원하는 무엇을 얻을 것이다. 그러나 것을 수행하여 컨테이너 수송의 장점을 많이 잃게 :)

    모두 가장 간단한 방법은 도커-작성을 사용하여 여러 개의 컨테이너를 실행하는 것입니다. 장고, 당신의 셀러리 노동자를위한 하나, 또 다른 레디 스에 대한 (그리고 데이터 저장소에 대한 하나뿐?)의 컨테이너는 아주 쉽게 그 방법을 설정하는 것입니다. 예를 들어 ...

    # docker-compose.yml
    web:
        image: myapp
        command: uwsgi --http 0.0.0.0:8000 --module mymodule.wsgi
        links:
          - redis
          - mysql
    celeryd:
        image: myapp
        command: celery worker -A myapp.celery
        links:
          - redis
          - mysql
    redis:
        image: redis
    mysql:
        image: mysql
    

    이것은 당신의 상위 4 개 레벨 프로세스 당신에게 네 용기를 줄 것이다. 레디 스와 MySQL은 그래서 대신에 "localhost"를 당신이 "레디 스"를 가리 것 가리키는으로, DNS 이름 "레디 스"와 앱 컨테이너 내부 "mysql을"로 노출 될 것이다.

    도커-작성 문서에 대한 좋은 정보가 많이있다

  4. from https://stackoverflow.com/questions/31660691/how-to-run-a-redis-server-and-another-application-inside-docker by cc-by-sa and MIT license