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

1. 安装docker服务

使用yum安装docker

yum 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.txt

Django==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.yml

version: '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:8888

run_celery.sh

#!/bin/sh

sleep 10

cd proj
celery worker -A proj -l info

run_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.py

CELERY_BROKER_URL = 'amqp://vanya:12345@rabbit:5672/'
CELERY_RESULT_BACKEND = 'redis://redis:6379/0'

因为docker容器设置了hostname,所以使用hostname连接,rabbitmq仅设置了用户名密码,没有设置虚拟主机,redis未设置密码,端口使用默认的6379。

3 运行

运行前确定安装了docker-compose

yum 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 *.sh

beat_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查看运行正常


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值