docker 一个镜像 所有容器的 dockerfile 搭建
2018-01-16 15:34
435 查看
项目目录:
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
# Th
4000
is 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 devuser@localhost; SET PASSWORD FOR devuser@localhost=PASSWORD('devpass'); GRANT ALL PRIVILEGES ON devdb.* TO devuser@localhost 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',
'admin@example.com', 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', 'admin@example.com', 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', 'admin@example.com', 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
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
# Th
4000
is 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 devuser@localhost; SET PASSWORD FOR devuser@localhost=PASSWORD('devpass'); GRANT ALL PRIVILEGES ON devdb.* TO devuser@localhost 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',
'admin@example.com', 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', 'admin@example.com', 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', 'admin@example.com', 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
相关文章推荐
- 利用Dockerfile创建镜像并生成容器
- 利用Dockerfile构建一个基于CentOS 7镜像参考
- Dockerfile 构建镜像 - 每天5分钟玩转容器技术(13)
- Dockerfile 示例一:创建一个MongoDB的镜像
- 使用Dockerfile构建支持ssh服务自启动的容器镜像
- Docker使用Dockerfile创建支持ssh服务自启动的容器镜像
- Docker 容器里镜像的迁移,或者将修改后的新的容器重新做成一个镜像
- Dockerfile 构建镜像 - 每天5分钟玩转容器技术(13)
- docker(三):Mac docker 运行tomcat镜像创建一个容器
- Dockerfile 构建镜像 - 每天5分钟玩转容器技术(13)
- 如何避免Docker容器启动脚本运行后自动退出——一个cron定时任务docker镜像方案
- Docker使用Dockerfile创建支持ssh服务自启动的容器镜像
- Docker创建一个mysql容器并保存为本地镜像
- Docker使用Dockerfile创建支持ssh服务自启动的容器镜像
- 打包一个Docker镜像,让你的好友加载开启一个容器,并且每隔一秒输出hello,world到指定的文件中
- 利用Dockerfile构建一个nginx容器
- 安装docker并使用默认镜像创建一个容器
- Docker使用Dockerfile创建支持ssh服务自启动的容器镜像
- 利用Dockerfile构建一个基于centos 7,包括java 8, tomcat 7,php ,mysql+mycat的镜像
- 使用Dockerfile创建支持ssh服务自启动的容器镜像