项目目录:
dockerfile:
FROM ubuntu:14.04
# Enable production settings by default; for development, this can be set to
# `false` in `docker run --env`
ENV DJANGO_PRODUCTION=true
# Set terminal to be noninteractive
ENV DEBIAN_FRONTEND noninteractive
# Enable MySQL root user creation without interactive input
RUN echo 'mysql-server mysql-server/root_password password devrootpass' | debconf-set-selections
RUN echo 'mysql-server mysql-server/root_password_again password devrootpass' | debconf-set-selections
# Install packages
RUN apt-get update && apt-get install -y \
git \
libmysqlclient-dev \
mysql-server \
nginx \
python-dev \
python-mysqldb \
python-setuptools \
supervisor \
vim
RUN easy_install pip
# Handle urllib3 InsecurePlatformWarning
RUN apt-get install -y libffi-dev libssl-dev libpython2.7-dev
RUN pip install urllib3[security] requests[security] ndg-httpsclient pyasn1
# Configure Django project
ADD . /code
RUN mkdir /djangomedia
RUN mkdir /static
RUN mkdir /logs
RUN mkdir /logs/nginx
RUN mkdir /logs/django
WORKDIR /code
RUN pip install -r requirements.txt
RUN chmod ug+x /code/initialize.sh
# Expose ports
# 80 = Nginx
# 8000 = django
# 3306 = MySQL
EXPOSE 80 8000 3306
# Configure Nginx
RUN ln -s /code/nginx.conf /etc/nginx/sites-enabled/django_docker.conf
RUN rm /etc/nginx/sites-enabled/default
z
# Run Supervisor (i.e., start MySQL, Nginx, and django)
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
CMD ["/usr/bin/supervisord"]
数据库:
initialize.sh:
#!/bin/bash
# This script initializes the Django project. It will be executed (from
# supervisord) every time the Docker image is run.
# If we're not in production, create a temporary dev database
if [ "$DJANGO_PRODUCTION" != "true" ]; then
echo "DJANGO_PRODUCTION=false; creating local database..."
# Wait until the MySQL daemon is running
while [ "$(pgrep mysql | wc -l)" -eq 0 ] ; do
echo "MySQL daemon not running; waiting one second..."
sleep 1
done
# Wait until we can successfully connect to the MySQL daemon
until mysql -uroot -pdevrootpass -e ";" ; do
echo "Can't connect to MySQL; waiting one second..."
sleep 1
done
echo "MySQL daemon is running; creating database..."
mysql -uroot -e "CREATE DATABASE devdb; CREATE USER [email protected]; SET PASSWORD FOR [email protected]=PASSWORD('devpass'); GRANT ALL PRIVILEGES ON devdb.* TO [email protected] IDENTIFIED BY 'devpass'; FLUSH PRIVILEGES;" -pdevrootpass;
mysql -uroot -pdevrootpass devdb < /code/iot10.sql;
else
echo "DJANGO_PRODUCTION=true; no local database created"
fi
# Initialize Django project
python /code/mmcsite/manage.py collectstatic --noinput
#python /code/django_docker/manage.py syncdb --noinput
#python /code/django_docker/manage.py makemigrations
#python /code/django_docker/manage.py migrate --noinput
# Create a Django superuser named `root` if it doesn't yet exist
echo "Creating Django superuser named 'root'..."
if [ "$DJANGO_PRODUCTION" != "true" ]; then
# We're in the dev environment
if [ "$ROOT_PASSWORD" == "" ]; then
# Root password environment variable is not set; so, load it from config.ini
echo "from ConfigParser import SafeConfigParser; parser = SafeConfigParser(); parser.read('/code/config.ini'); from django.contrib.auth.models import User; print 'Root user already exists' if User.objects.filter(username='root') else User.objects.create_superuser('root',
'[email protected]', parser.get('general', 'ROOT_PASSWORD'))" | python /code/mmcsite/manage.py shell
else
# Root password environment variable IS set; so, use it
echo "import os; from django.contrib.auth.models import User; print 'Root user already exists' if User.objects.filter(username='root') else User.objects.create_superuser('root', '[email protected]', os.environ['ROOT_PASSWORD'])" | python /code/mmcsite/manage.py
shell
fi
else
# We're in production; use root password environment variable
echo "import os; from django.contrib.auth.models import User; print 'Root user already exists' if User.objects.filter(username='root') else User.objects.create_superuser('root', '[email protected]', os.environ['ROOT_PASSWORD'])" | python /code/mmcsite/manage.py
shell
fi
config.ini:
[general]
DOCKER_IMAGE_NAME = mysite/mmcsite
ROOT_PASSWORD = root
[production]
SECRET_KEY = putsomethingreallylonghere
HOST = 0.0.0.0 ; IP address of your production server
USE_PASSWORD = false ; false = use SSH key authentication; true = use password
USERNAME = root
PASSWORD = (empty)
PUBLIC_KEY = ~/.ssh/id_dsa.pub ; Your public SSH key
DATABASE_HOST = 0.0.0.0 ; IP address of your database server
DATABASE_USERNAME = root
DATABASE_PASSWORD = rootpassword
DATABASE_NAME = django
Nginx :
nginx.conf:
server {
listen 80 default_server;
access_log /dev/null;
error_log /logs/nginx/nginx.error.log;
location /static/ {
root /;
}
# TODO add media directory
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 10;
proxy_read_timeout 10;
proxy_pass http://127.0.0.1:8000/;
}
}
搭建好之后:
docker build -t mysite/mmcsite .
docker run -d -p 80:80 -v $(pwd):/code --env DJANGO_PRODUCTION=false mysite/mmcsite
docker ps -a
项目详细地址:https://github.com/wangguanfu/docker-django