Nginx多容器部署web项目uwsgi+Django+Redis+Mysql

一、准备工作

1.镜像拉取

# 查看自己的镜像
docker images

# 拉取项目需要的镜像
docker pull python:3.6
docker pull mysql:5.7
docker pull redis

image-20210120194541957

2.构建docker网络,让他们在同一个网络下实现互通

docker network ls # 查看自己的docker网络
docker network create luffu\y  # 创建luffy网络

image-20210120194520316

二、测试网络

1.启动mysql

# 需要指定root
docker run --name mysql --privileged=true -p 3307:3306  -v /data/mysql/datadir:/var/lib/mysql -v /data/mysql/conf.d:/etc/mysql/conf.d -e  MYSQL_ROOT_PASSWORD=123456 -d --network luffy  mysql:5.7

  --name:指定容器名

--p:映射宿主主机端口  因为本机有了一个3306端口 所以我改成了3307

-v:挂载宿主目录到容器目录

-e:设置环境变量,此处指定root密码

-d:后台运行容器

--privileged=true 防止挂载数据卷出现权限问题

--network 指定网络名称空间

2.启动python

docker run -dit --network luffy --name python python:3.6 /bin/bash
# 这里我没有指定映射端口 先不慌

3.启动redis

docker run -dit --network luffy --name redis -p 6377:6379 -v /data/redis:/data/redis nginx

4.查看启动的容器并测试网络

docker ps 

image-20210120223817750

docker exec -it python ping mysql

image-20210120222206169

ok,并且记录下mysql的本地回环地址172.18.0.2 端口号 3306(可以在启动容器时自己指定)

也可以通过docker inspect mysql(容器名)来查看id

image-20210120203336079

5.进入到mysql容器里面创建luffy数据库

5.1进入容器设置客户端访问权限

docker exec -it mysql bash  # 进入容器执行bash
mysql -uroot -p123456  # 登录

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
mysql> create database luffy default charset utf8;  # 创建数据库 根据django连接的数据库
# 设置权限账号密码:账号密码要与项目中配置的一致
mysql> grant all privileges on luffy.* to 'luffy'@'%' identified by 'Luffy123?';
mysql> grant all privileges on luffy.* to 'luffy'@'localhost' identified by 'Luffy123?';
mysql> flush privileges;
--------------------------------------------------------
Query OK, 1 row affected (0.00 sec)


ctrl +P +Q #容器不停止退出

5.2 测试连接

mysql

image-20210120215656390

redis

image-20210120224028439

三、python准备工作

1、进入容器安装依赖

docker exec -it python /bin/bash

安装软件管理包和可能使用的依赖

pip -V
---------------------------------
pip 20.3.1 from /usr/local/lib/python3.6/site-packages/pip (python 3.6)


pyhon -V
----------------------------------
Python 3.6.12

pip install uwsgi -i https://pypi.doubanio.com/simple  # 安装uwsgi
pip install django==2.2.2 -i https://pypi.doubanio.com/simple  # 安装django
----------------------------------
....
  Stored in directory: /root/.cache/pip/wheels/65/f4/1f/460436beb9f2a87299f8787db2b983854793ead943c540b058
Successfully built uwsgi
Installing collected packages: uwsgi

2.修改mysql和redis的配置

image-20210121101117153

3.把luffy文件拷贝到容器上

docker cp 主机文件路径 容器id:容器内部路径

docker cp /home/luffy/luffy-api python:home/luffy

四、通过uwsgi启动python项目

1.进入python容器

docker exec -it python /bin/bash

2.查看导入的python项目

cd /home/luffy  # 根据自己的路径
ls
-------------------------------------------------------------
Luffy  celery_task  logs  luffyapi.xml	manage.py  manage_.py  requerment.txt  uwsgi.log

pip install -r requerment.txt -i https://pypi.doubanio.com/simple  # 安装项目依赖库

ps:如果需要再次修改配置文件我们需要安装一些工具

在使用docker容器时,有时候里边没有安装vim,敲vim命令时提示说:vim: command not found,这个时候就需要安装vim,可是当你敲apt-get install vim命令时,提示:未找到指令
# 我们需要
apt-get update

#这个命令的作用是:同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,这样才能获取到最新的软件包。

等更新完毕以后再敲命令:apt-get install vim命令即可。

3.进行数据库迁移

python manage_.py makemigrations
python manage_.py migrate

image-20210121100834252

4.用Navicat创建点数据

INSERT INTO luffy_teacher(id, orders, is_show, is_delete, created_time, updated_time, name, role, title, signature, image, brief) VALUES (1, 1, 1, 0, '2019-07-14 13:44:19.661327', '2019-07-14 13:46:54.246271', 'Alex', 1, '老男孩Python教学总监', '金角大王', 'teacher/alex_icon.png', '老男孩教育CTO & CO-FOUNDER 国内知名PYTHON语言推广者 51CTO学院2016\2017年度最受学员喜爱10大讲师之一 多款开源软件作者 曾任职公安部、飞信、中金公司、NOKIA中国研究院、华尔街英语、ADVENT、汽车之家等公司');

INSERT INTO luffy_teacher(id, orders, is_show, is_delete, created_time, updated_time, name, role, title, signature, image, brief) VALUES (2, 2, 1, 0, '2019-07-14 13:45:25.092902', '2019-07-14 13:45:25.092936', 'Mjj', 0, '前美团前端项目组架构师', NULL, 'teacher/mjj_icon.png', '是马JJ老师, 一个集美貌与才华于一身的男人,搞过几年IOS,又转了前端开发几年,曾就职于美团网任高级前端开发,后来因为不同意王兴(美团老板)的战略布局而出家做老师去了,有丰富的教学经验,开起车来也毫不含糊。一直专注在前端的前沿技术领域。同时,爱好抽烟、喝酒、烫头(锡纸烫)。 我的最爱是前端,因为前端妹子多。');

INSERT INTO luffy_teacher(id, orders, is_show, is_delete, created_time, updated_time, name, role, title, signature, image, brief) VALUES (3, 3, 1, 0, '2019-07-14 13:46:21.997846', '2019-07-14 13:46:21.997880', 'Lyy', 0, '老男孩Linux学科带头人', NULL, 'teacher/lyy_icon.png', 'Linux运维技术专家,老男孩Linux金牌讲师,讲课风趣幽默、深入浅出、声音洪亮到爆炸');

INSERT INTO luffy_course_category(id, orders, is_show, is_delete, created_time, updated_time, name) VALUES (1, 1, 1, 0, '2019-07-14 13:40:58.690413', '2019-07-14 13:40:58.690477', 'Python');

INSERT INTO luffy_course_category(id, orders, is_show, is_delete, created_time, updated_time, name) VALUES (2, 2, 1, 0, '2019-07-14 13:41:08.249735', '2019-07-14 13:41:08.249817', 'Linux');

INSERT INTO luffy_course(id, orders, is_show, is_delete, created_time, updated_time, name, course_img, course_type, brief, level, pub_date, period, attachment_path, status, students, sections, pub_sections, price, course_category_id, teacher_id) VALUES (1, 1, 1, 0, '2019-07-14 13:54:33.095201', '2019-07-14 13:54:33.095238', 'Python开发21天入门', 'courses/alex_python.png', 0, 'Python从入门到入土&&&Python从入门到入土&&&Python从入门到入土&&&Python从入门到入土&&&Python从入门到入土&&&Python从入门到入土&&&Python从入门到入土&&&Python从入门到入土&&&Python从入门到入土&&&Python从入门到入土&&&Python从入门到入土&&&Python从入门到入土', 0, '2019-07-14', 21, '', 0, 231, 120, 120, 0.00, 1, 1);

INSERT INTO luffy_course(id, orders, is_show, is_delete, created_time, updated_time, name, course_img, course_type, brief, level, pub_date, period, attachment_path, status, students, sections, pub_sections, price, course_category_id, teacher_id) VALUES (2, 2, 1, 0, '2019-07-14 13:56:05.051103', '2019-07-14 13:56:05.051142', 'Python项目实战', 'courses/mjj_python.png', 0, '', 1, '2019-07-14', 30, '', 0, 340, 120, 120, 99.00, 1, 2);

INSERT INTO luffy_course(id, orders, is_show, is_delete, created_time, updated_time, name, course_img, course_type, brief, level, pub_date, period, attachment_path, status, students, sections, pub_sections, price, course_category_id, teacher_id) VALUES (3, 3, 1, 0, '2019-07-14 13:57:21.190053', '2019-07-14 13:57:21.190095', 'Linux系统基础5周入门精讲', 'courses/lyy_linux.png', 0, '', 0, '2019-07-14', 25, '', 0, 219, 100, 100, 39.00, 2, 3);

INSERT INTO luffy_course_chapter(id, orders, is_show, is_delete, created_time, updated_time, chapter, name, summary, pub_date, course_id) VALUES (1, 1, 1, 0, '2019-07-14 13:58:34.867005', '2019-07-14 14:00:58.276541', 1, '计算机原理', '', '2019-07-14', 1);

INSERT INTO luffy_course_chapter(id, orders, is_show, is_delete, created_time, updated_time, chapter, name, summary, pub_date, course_id) VALUES (2, 2, 1, 0, '2019-07-14 13:58:48.051543', '2019-07-14 14:01:22.024206', 2, '环境搭建', '', '2019-07-14', 1);

INSERT INTO luffy_course_chapter(id, orders, is_show, is_delete, created_time, updated_time, chapter, name, summary, pub_date, course_id) VALUES (3, 3, 1, 0, '2019-07-14 13:59:09.878183', '2019-07-14 14:01:40.048608', 1, '项目创建', '', '2019-07-14', 2);

INSERT INTO luffy_course_chapter(id, orders, is_show, is_delete, created_time, updated_time, chapter, name, summary, pub_date, course_id) VALUES (4, 4, 1, 0, '2019-07-14 13:59:37.448626', '2019-07-14 14:01:58.709652', 1, 'Linux环境创建', '', '2019-07-14', 3);

INSERT INTO luffy_course_Section(id, is_show, is_delete, created_time, updated_time, name, orders, section_type, section_link, duration, pub_date, free_trail, chapter_id) VALUES (1, 1, 0, '2019-07-14 14:02:33.779098', '2019-07-14 14:02:33.779135', '计算机原理上', 1, 2, NULL, NULL, '2019-07-14 14:02:33.779193', 1, 1);

INSERT INTO luffy_course_Section(id, is_show, is_delete, created_time, updated_time, name, orders, section_type, section_link, duration, pub_date, free_trail, chapter_id) VALUES (2, 1, 0, '2019-07-14 14:02:56.657134', '2019-07-14 14:02:56.657173', '计算机原理下', 2, 2, NULL, NULL, '2019-07-14 14:02:56.657227', 1, 1);

INSERT INTO luffy_course_Section(id, is_show, is_delete, created_time, updated_time, name, orders, section_type, section_link, duration, pub_date, free_trail, chapter_id) VALUES (3, 1, 0, '2019-07-14 14:03:20.493324', '2019-07-14 14:03:52.329394', '环境搭建上', 1, 2, NULL, NULL, '2019-07-14 14:03:20.493420', 0, 2);

INSERT INTO luffy_course_Section(id, is_show, is_delete, created_time, updated_time, name, orders, section_type, section_link, duration, pub_date, free_trail, chapter_id) VALUES (4, 1, 0, '2019-07-14 14:03:36.472742', '2019-07-14 14:03:36.472779', '环境搭建下', 2, 2, NULL, NULL, '2019-07-14 14:03:36.472831', 0, 2);

INSERT INTO luffy_course_Section(id, is_show, is_delete, created_time, updated_time, name, orders, section_type, section_link, duration, pub_date, free_trail, chapter_id) VALUES (5, 1, 0, '2019-07-14 14:04:19.338153', '2019-07-14 14:04:19.338192', 'web项目的创建', 1, 2, NULL, NULL, '2019-07-14 14:04:19.338252', 1, 3);

INSERT INTO luffy_course_Section(id, is_show, is_delete, created_time, updated_time, name, orders, section_type, section_link, duration, pub_date, free_trail, chapter_id) VALUES (6, 1, 0, '2019-07-14 14:04:52.895855', '2019-07-14 14:04:52.895890', 'Linux的环境搭建', 1, 2, NULL, NULL, '2019-07-14 14:04:52.895942', 1, 4);

5.配置uwsgi文件

1)进行uwsgi服务配置,内容如下
>: vim /home/project/luffyapi/luffyapi.xml

<uwsgi>
   # 这里的172.18.0.3通过dockers insepct python 获取的ip地址
   <socket>172.18.0.3:9090</socket> <!-- 内部端口,自定义 --> 
   <chdir>/home/luffy/</chdir> <!-- 项目路径 -->            
   <module>Luffy.wsgi</module>  <!-- luffyapi为wsgi.py所在目录名--> 
   <processes>4</processes> <!-- 进程数 -->     
   <daemonize>uwsgi.log</daemonize> <!-- 日志文件 -->
</uwsgi>

6.先跑一下

python manage_.py runserver 0.0.0.0:9090
-------------------------------------------------------------
Performing system checks...

System check identified no issues (0 silenced).
January 21, 2021 - 10:22:14
Django version 2.2.2, using settings 'Luffy.settings.pro'
Starting development server at http://0.0.0.0:9090/
Quit the server with CONTROL-C.

跑起来了,但是我们外部是无法访问的,因为没有映射端口

7.将容器打包成镜像

7.1docker export [容器ID|容器名称]>[压缩包名称]

docker export python>luffy.tar

7.2docker import [压缩包名称] [镜像名称:Tag]

docker import luffy.tar luffy:v1

image-20210121103534453

8 测试新镜像

image-20210122150440628

docker run -dit --name python --network luffy -p9090:9090 -v /docker_test/nginx/static:/home/luffy/Luffy/static luffy:v1 /bin/bash

docker exec -it python /bin/bash


1)因为已经挂载了静态文件配置所以我们只需要收集就好了
#记得根据setting/pro.py下静态文件路径配置

2)完成静态文件迁移
>: python /home/luffy/manage_.py collectstatic

# 找到路径 并运行
python /home/luffy/manage_.py runserver 0.0.0.0:9090
-------------------------------------------------------------------------
Performing system checks...

System check identified no issues (0 silenced).
January 21, 2021 - 10:42:21
Django version 2.2.2, using settings 'Luffy.settings.pro'
Starting development server at http://0.0.0.0:9090/
Quit the server with CONTROL-C.

# 起来后我们访问一下后台
[ip地址]:9090/xadmin/

image-20210121104934732

9.uwsgi启动

uwsgi -x /home/luffy/luffyapi.xml

五、nginx反向代理Vue和Django

nginx(不放在容器里)

5.1安装Nginx

1)前往用户根目录
>: cd ~

2)下载nginx1.13.7
>: wget http://nginx.org/download/nginx-1.13.7.tar.gz

3)解压安装包
>: tar -xf nginx-1.13.7.tar.gz

4)进入目标文件
>: cd nginx-1.13.7

5)配置安装路径:/usr/local/nginx
>: ./configure --prefix=/usr/local/nginx

6)编译并安装
>: make && sudo make install

7)建立软连接:终端命令 nginx
>: ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx

8)删除安装包与文件:
>: cd ~
>: rm -rf nginx-1.13.7
>: rm -rf nginx-1.13.7.tar.xz

9)测试Nginx环境,服务器运行nginx,本地访问服务器ip
>: nginx
>: 服务器绑定的域名 或 ip:80

5.2配置文件构建

4)去向Nginx配置目录,备份配置,完全更新配置:填入下方内容
>: vim /usr/local/nginx/conf/nginx.conf


events {
    
    
    worker_connections  1024;
}
http {
    
    
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    server {
    
    
        listen 80;
        server_name  127.0.0.1; # 改为自己的域名,没域名修改为127.0.0.1:80
        charset utf-8;
        location / {
    
    
            root /docker_test/nginx/html; # html访问路径
            index index.html; # html文件名称
            try_files $uri $uri/ /index.html; # 解决单页面应用刷新404问题
        }
    }
     # 新增的server
    server {
    
    
        listen 9000;
        server_name  127.0.0.1; # 改为自己的域名,没域名修改为127.0.0.1:80
        charset utf-8;
        location / {
    
    
           include uwsgi_params;
           uwsgi_pass 172.18.0.3:9090;  # 端口要和uwsgi里配置的一样
        }
# 新增的配置静态文件
        location /static {
    
    
            alias /docker_test/nginx/static;
        }
    }
}

5.3启动

nginx -s reload
nginx 

image-20210122171317668

猜你喜欢

转载自blog.csdn.net/A1L__/article/details/112994325