您的位置:首页 > 运维架构 > Docker

django+celery+docker搭建记录(4)-使用docker

2018-03-20 12:52 911 查看

1. 安装docker服务

使用yum安装dockeryum install docker启动docker服务service docker start

2. 创建Docker容器

2.1 自定义容器

使用python2.7镜像作为基础创建django服务镜像,编写Dockerfile如下:# use base python image with python 2.7
FROM python:2.7

# add requirements.txt to the image
ADD requirements.txt /app/requirements.txt

# set working directory to /app/
WORKDIR /app/

# install python dependencies
RUN pip install -r requirements.txt

# create unprivileged user
RUN adduser --disabled-password --gecos '' vanya创建依赖文件requirements.txtDjango==1.11.11
django-celery-beat==1.1.1
celery==4.1.0
redis==2.10.6

2.2 依赖镜像

项目需要使用redis和rabbitmq,使用官方的镜像,分别使用
redis:3.2.1
rabbitmq:3.6.15

2.3 使用docker-compose组合容器

docker-compose.ymlversion: '2'

services:
# Redis
redis:
image: redis:3.2.11
hostname: redis

rabbit:
image: rabbitmq:3.6.15
hostname: rabbit
environment:
- RABBITMQ_DEFAULT_USER=vanya
- RABBITMQ_DEFAULT_PASS=12345
ports:
- "5672:5672"
- "15672:15672"

web:
build:
context: .
dockerfile: Dockerfile
hostname: web
command: ./run_web.sh
volumes:
- .:/app
ports:
- "8888:8888"
links:
- rabbit
- redis
privileged: true
user: vanya

worker:
build:
context: .
dockerfile: Dockerfile
command: ./run_celery.sh
volumes:
- .:/app
links:
- rabbit
- redis
privileged: true
user: vanya

  beat:
    build:
      context: .
      dockerfile: Dockerfile
    command: ./run_beat.sh
    volumes:
      - .:/app
    links:
      - rabbit
      - redis
    privileged: true
    user: vanya

这里redis没有做什么设置,rabbitmq设置了默认的用户名密码和端口映射。
web、worker、beat容器都使用刚才编写的Dockerfile来创建,启动命令分别使用run_web.sh、run_celery.sh、run_beat.sh。
run_web.sh#!/bin/sh

sleep 10

cd proj
python manage.py makemigrations app1
python manage.py migrate
python manage.py runserver 0.0.0.0:8888run_celery.sh#!/bin/sh

sleep 10

cd proj
celery worker -A proj -l inforun_beat.sh#!/bin/sh

sleep 10

cd proj
celery -A proj beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler将原来的项目复制到同一个路径下,并修改其中的redis、rabbitmq相关连接



./proj/proj/settings.pyCELERY_BROKER_URL = 'amqp://vanya:12345@rabbit:5672/'
CELERY_RESULT_BACKEND = 'redis://redis:6379/0'因为docker容器设置了hostname,所以使用hostname连接,rabbitmq仅设置了用户名密码,没有设置虚拟主机,redis未设置密码,端口使用默认的6379。

3 运行

运行前确定安装了docker-composeyum install docker-compose
docker-compose build
docker-compose up
执行build时报错 error pulling image configuration: Get https://dseasb33srnrn.cloudfront.net/


问题是因为国内网络无法连接到docker hub,可以使用国内的镜像,如网易阿里云等。在/etc/sysconfig/docker中添加--registry-mirror=http://hub-mirror.c.163.com



重新启动docker服务然后再执行即可。service docker restart执行up时报错



sh文件没有赋予执行权限,赋予权限后启动chmod +x *.shbeat_1报错celery.platforms.LockFailed: [Errno 13] Permission denied: '/app/proj/celerybeat.pid'



原因是我们容器内使用了新创建的vanya用户,该用户对/app/proj/目录(宿主机的./proj/目录)没有写权限,无法生成celerybeat.pid文件,其他项目中需要写文件时同样会遇到该问题。
docker容器不指定用户时默认使用root用户,而容器和宿主机的root用户id都是0,所以不指定用户时一般不会有错误。
如果必须要指定用户的话,可以给目录赋予其他用户读写权限:chmod a+w ./proj或者Dockerfile中创建用户时使用-u参数指定创建的用户同宿主机目录所有者用户id相同RUN adduser --disabled-password --gecos '' -u 1012 vanya采用第一种方式后再运行,容器正常启动,docker ps查看运行正常

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Django Celery Docker
相关文章推荐