django+celery+docker搭建记录(4)-使用docker
2018-03-20 12:52
911 查看
1. 安装docker服务
使用yum安装dockeryum install docker启动docker服务service docker start2. 创建Docker容器
2.1 自定义容器
使用python2.7镜像作为基础创建django服务镜像,编写Dockerfile如下:# use base python image with python 2.7FROM 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-composedocker-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搭建记录(3)- 使用django定时执行celery任务
- django+celery+docker搭建记录(1)-Celery使用
- 使用Docker搭建Django,Nginx,R,Python部署环境的方法
- [集群搭建]记录使用docker搭建elasticsearch集群
- 使用Docker搭建Django,Nginx,R,Python部署环境
- 使用Docker搭建Django,Nginx,R,Python部署环境
- django使用celery学习记录
- 【原创】 在django中使用celery 任务队列,redis做后端
- 记录:vsftpd在vmware中使用Nat防火墙下使用PASV模式的搭建
- android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创)
- android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录
- android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创)
- android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录
- 使用django从数据库中随机取N条记录的不同方法及其性能实测
- 使用django+celery+RabbitMQ实现异步执行
- 使用django从数据库中随机取N条记录的不同方法及其性能实测
- android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创)
- 使用Python和Django1.4搭建Web应用
- 10、django开发环境搭建及使用
- 使用 django+celery+RabbitMQ 实现异步执行