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