docker部署Django比传统部署会更灵活一点,如果没有了解过docker的朋友,在中间有些命令不懂的可以先百度
CentOS7.4 基础服务器版本
Docker
Django 此为docker镜像
Nginx 此为docker镜像
MySQL 此为docker镜像
下载安装docker
yum -y install docker vim
启动docker,并设置开机启动
systemctl start docker
systemctl enable docker
下载所需镜像
docker pull centos
docker pull nginx
docker pull mysql # 如果下载别的版本MySQL加写成,如:mysql:5.6
mkdir -p create_docker_image/ssh_image
cd create_docker_image/ssh_image
touch Dockerfile run.sh
chmod +x run.sh
vim run.sh
#! /bin/bash
/usr/sbin/sshd -D
vim Dockerfile
# 设置继承镜像
FROM centos:latest
# 提供一些作者的信息
MAINTAINER wallie@910
# 开始运行命令
RUN yum install -y openssh-server
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_ecdsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_ed25519_key
RUN echo "123456" | passwd --stdin root
ADD run.sh /run.sh
EXPOSE 22
CMD ["/run.sh"]
docker build -t sshd:centos .
“ m y s i t e ” 的 项 目 建 议 自 己 提 前 搭 建 好 , 直 接 拷 贝 过 来 用 , 但 针 对 有 路 径 需 要 做 一 些 调 整 \color{red}{“mysite”的项目建议自己提前搭建好,直接拷贝过来用,但针对有路径需要做一些调整} “mysite”的项目建议自己提前搭建好,直接拷贝过来用,但针对有路径需要做一些调整
可以参考我的Django+uwsgi+Nginx部署(制作中…)
cd
mkdir -p create_docker_image/django_centos
cd create_docker_image/django_centos
touch Dockerfile web_run.sh
chmod +x run.sh
vim web_run.sh
#! /bin/bash
# 同步数据库
python manage.py makemigrate --noinput
python manage.py migrate --noinput
# uwsgi启动django
uwsgi mysite.ini
/usr/sbin/sshd -D
tail -f /dev/null
vim Dockerfile
# 指定操作的镜像
FROM sshd:centos
# 创建文件夹
RUN mkdir -p /data/wwwroot # 项目存放路径
RUN mkdir -p /data/static
RUN mkdir -p /data/media
# 拷贝文件,
COPY mysite /data/wwwroot/mysite # “mysite” 为你自己的django项目可以自行更改
COPY web_run.sh /data/wwwroot/mysite/web_run.sh
#这句指令相当与:cd /data/wwwroot/mysite
WORKDIR /data/wwwroot/mysite
# 安装软件
RUN yum install epel-release -y
RUN yum -y install gcc python36 net-tools
RUN yum -y install python36-devel mysql-devel
RUN ln /usr/bin/python3.6 /usr/bin/python -f
RUN cp /usr/bin/yum /usr/bin/yum.bak
RUN cp /usr/libexec/urlgrabber-ext-down /usr/libexec/urlgrabber-ext-down.bak
RUN cp /usr/bin/yum-config-manager /usr/bin/yum-config-manager.bak
RUN sed 's/python/python2/g' /usr/bin/yum.bak > /usr/bin/yum
RUN sed 's/python/python2/g' /usr/libexec/urlgrabber-ext-down.bak > /usr/libexec/urlgrabber-ext-down
RUN sed 's/python/python2/g' /usr/bin/yum-config-manager.bak > /usr/bin/yum-config-manager
RUN pip3 install --upgrade pip
RUN pip3 install django
RUN pip3 install django_crontab
RUN pip3 install pymysql
RUN pip3 install mysqlclient
RUN pip3 install uwsgi
RUN pip3 install cryptography
EXPOSE 8080
# linux运行会报错修复
RUN cp /usr/local/lib64/python3.6/site-packages/django/db/backends/mysql/operations.py /usr/local/lib64/python3.6/site-packages/django/db/backends/mysql/operations.py.bak
RUN cp /usr/local/lib64/python3.6/site-packages/django/db/backends/mysql/base.py /usr/local/lib64/python3.6/site-packages/django/db/backends/mysql/base.py.bak
RUN sed 's/query.decode/query.encode/g' /usr/local/lib64/python3.6/site-packages/django/db/backends/mysql/operations.py.bak > /usr/local/lib64/python3.6/site-packages/django/db/backends/mysql/operations.py
RUN sed '35,36d' /usr/local/lib64/python3.6/site-packages/django/db/backends/mysql/base.py.bak > /usr/local/lib64/python3.6/site-packages/django/db/backends/mysql/base.py
docker build -t web:django .
cd
mkdir -p create_docker_image/django_nginx
cd create_docker_image/django_nginx
vim Dockerfile
# 指定操作的镜像
FROM docker.io/nginx
# 作者
MAINTAINER zhoufan
# 系统部署
RUN mkdir -p /data/static
docker build -t web:nginx .
cd
mkdir -p create_docker_image/django_nginx
cd create_docker_image/django_nginx
touch Dockerfile setup.sh
chmod +x setup.sh
vim setup.sh
#!/bin/bash
set -e
# 启动mysql
service mysql start
# 用来检测问题
echo '导入开始'
# 输入数据库project.sql
mysql < /root/project.sql
echo `service mysql status`
# 用来检测问题
echo '开始修改密码'
# 导入数据库privileges.sql
mysql < /root/privileges.sql
echo `service mysql status`
tail -f /dev/null
这 个 可 以 使 用 自 己 的 数 据 库 进 来 , 如 果 是 从 别 的 数 据 库 导 出 来 的 , 必 须 确 认 数 据 库 文 件 开 关 是 否 有 创 建 库 文 件 和 使 用 库 文 件 的 语 句 \color{red}{这个可以使用自己的数据库进来,如果是从别的数据库导出来的,必须确认数据库文件开关是否有创建库文件和使用库文件的语句 } 这个可以使用自己的数据库进来,如果是从别的数据库导出来的,必须确认数据库文件开关是否有创建库文件和使用库文件的语句
就 是 p r o j e c t . s q l , 前 两 句 。 不 懂 s q l 语 句 请 自 行 百 度 吧 \color{red}{就是project.sql, 前两句。不懂sql语句请自行百度吧} 就是project.sql,前两句。不懂sql语句请自行百度吧
vim project.sql
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `project` default character set utf8 collate utf8_general_ci;
USE `project`;
DROP TABLE IF EXISTS `abc`;
CREATE TABLE `abc` (
`id` int(11) DEFAULT NULL,
`name` varchar(25) DEFAULT NULL,
`deptid` int(11) DEFAULT NULL,
`salary` float DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
LOCK TABLES `abc` WRITE;
UNLOCK TABLES;
这 个 库 文 件 是 设 置 本 地 和 远 程 r o o t 帐 号 和 密 码 的 , “ t e s t ” 为 密 码 \color{red}{这个库文件是设置本地和远程root帐号和密码的,“test”为密码 } 这个库文件是设置本地和远程root帐号和密码的,“test”为密码
vim privileges.sql
use mysql;
/*修改root密码*/
update user set password=password('test') where user='root' and host='localhost';
/*添加root远程登陆*/
grant all privileges on *.* to root@'%' identified by 'test';
flush privileges;
把启动命令分别写到不用的sh文件中,方便修改
cd
mkdir django_run
cd django_run
vim start_db.sh
#!/bin/bash
docker run --restart=always -d --name db --privileged=true web:mysql
--restart=always 这是保持容器自动启动
--name db 容器的别名改为db
--privileged=true 获取mysql容器权限
-v 指定映射文件夹,这里指定的是库文件到本地
web:mysql 镜像名
sh start_db.sh
docker ps
如下图显示就正常运行了,如指定容器为空,请查看最后的命令操作查看错误和删除容器
因 为 d j a n g o 与 数 据 库 d b 有 链 接 , 所 以 数 据 库 运 行 成 功 后 , d j a n g o 才 能 运 行 , 不 然 会 报 错 \color{red}{因为django与数据库db有链接,所以数据库运行成功后,django才能运行,不然会报错} 因为django与数据库db有链接,所以数据库运行成功后,django才能运行,不然会报错
vim start_web.sh
#!/bin/bash
docker run --restart=always -d --name web --link db -p 8000:8000 -v /data/nginx/static/:/data/static web:django
--restart=always 这是保持容器自动启动
--name web 容器的别名改为web
--link db 指定db的关联,django中连接数据的IP地址可以直接写成“db”
-p 8000:8000 映射端口到主机,可不用加
web:django 镜像名
sh start_web.sh
docker ps
因 为 N g i n x 与 d j a n g o 有 链 接 , 所 以 d j a n g o 运 行 成 功 后 , N g i n x 才 能 运 行 , 不 然 会 报 错 \color{red}{因为Nginx与django有链接,所以django运行成功后,Nginx才能运行,不然会报错} 因为Nginx与django有链接,所以django运行成功后,Nginx才能运行,不然会报错
vim start_nginx.sh
#!/bin/bash
docker run --restart=always -d --name nginx --privileged=true -p 80:80 -v /data/nginx/conf.d/web.conf:/etc/nginx/nginx.conf -v /data/nginx/logs:/var/log/nginx -v /data/nginx/statc:/data/static --link web web:nginx
--restart=always 这是保持容器自动启动
--name web 容器的别名改为nginx
--link db 指定django的关联,nginx中连接django的IP地址可以直接写成“web”
-p 80:80 映射端口到主机
web:django 镜像名
sh start_nginx.sh
docker ps
这时,你的Django搭建没有问题的话你基本就可以看到你自己的网页了
参考资料:
docker_mysql选择版本:https://hub.docker.com/_/mysql/
本人的经验分享,希望可以帮助到你们,如何不对的地方,可以评论留言,帮我指正一下,如果帮助了你,请给我点个赞吧