本次部署是把2个项目、mysql、redis、uwsgi封装在一个容器中,ngnix封装在一个容器中
实际应用中最好是:
这样才能方便以后增加服务器以提升性能
部署流程主要如下:
1、安装docker,自己找度娘要教程
2、拉取centos7的镜像到本地
3、启动容器,并进入容器
4、拷贝项目代码、数据库备份文件、环境包requirements.txt到容器中
5、在容器中安装mysql,并且创建数据库,恢复备份文件
6、安装redis
7、搭建项目需要运行的环境
8、修改程序的相关配置
9、安装uwsgi并启动
10、新启动一个centos7容器安装ngnix,并配置好
11、提交保存镜像
docker pull centos
注:镜像直接到https://hub.docker.com/搜索
docker run -d -it --privileged -p 805:80 -p 5002:5000 -p 8001:8000 -p 10027:22 -p 20002:3306 --name centos-iqiyi -e LANG=zh_CN.utf8 centos /usr/sbin/init
说明:
–privileged /usr/sbin/init 这两行主要解决容器中使用systemctl去启动服务时出现D_Bus错误的问题
-d: 后台运行
-it: 组合使用,创建一个伪终端
-p: 端口映射,本机端口:容器端口
–name: 容器名,(需要注意命名规范,可自己定义 ,only [a-zA-Z0-9][a-zA-Z0-9_.-])
-e:防止乱码,编码格式
-p 20002:3306 是给mysql数据库的,如果需要外界访问mysql数据库,就映射端口,否则不需要,这里就没有映射redis数据库的端口,因为外界不需要访问
最后跟上下载下来的镜像名
docker常用命令:
# 查看当前docker 中哪些容器正在运行
docker ps
# 查看当前docker 中哪些容器正在运行 包括已经终止的
docker ps -a
# 第一次初始化启动的时候,使用run,后来都是用start
docker start id
# 启动后,再次进入:
docker exec -it id /bin/bash
# 重启
docker restart id
# 停止
docker stop id
# 删除 注意:删除前需要停止镜像
docker rm id
进入容器
docker exec -it 7ed9c6fbf986 /bin/bash
sudo docker cp /Users/liheng/Desktop/iqiyi.zip 7ed9c6fbf986:/
# /Users/liheng/Desktop/iqiyi.zip:本地文件目录
# 7ed9c6fbf986:容器id
# /:拷贝到根目录
从主机复制到容器sudo docker cp host_path containerID:container_path
从容器复制到主机sudo docker cp containerID:container_path host_path
1、安装支持ZIP的工具
yum install -y unzip zip
2、解压iqiyi.zip
unzip iqiyi.zip
注:压缩一个zip文件的方法:zip 文件名.zip 文件夹名称或文件名称
3、解压缩后发现中文乱码,分别执行以下三个命令
yum -y install kde-l10n-Chinese && yum -y reinstall glibc-common
localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
export LC_ALL=zh_CN.utf8
依次执行以下语句:
yum install -y wget
wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
yum -y install mysql57-community-release-el7-10.noarch.rpm
yum install -y mysql-server
systemctl start mysqld.service
systemctl status mysqld.service
查看root原始密码:
grep "password" /var/log/mysqld.log
# 如果以上语句无法查看,则打开mysqld.log,直接搜索password查看密码
获得初始密码后,第一件事就是要重新设置root密码,否则什么事情也做不了,因为MySQL强制要求必须重新设置root密码。
mysql -uroot -p
# 输入原始密码
# 修改密码
mysql>ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!'; # 把MyNewPass4!修改为你要设置的新密码
mysql>use mysql;
mysql>update user set host = ‘%’ where user = ‘root’;
mysql>select host, user from user;
mysql>exit
vi /etc/my.cnf
# 在[mysqld]下面添加:
sql_mode=""
# 重启
systemctl restart mysqld.service
上传moviespider.sql_.zip到/iqiyi/ 目录下
sudo docker cp /Users/liheng/Downloads/moviespider.sql_.zip 7ed9c6fbf986:/iqiyi
解压
unzip moviespider.sql_.zip
# 进入mysql,创建数据库:
mysql> create database iqiyi charset=utf8;
use iqiyi
# 导入数据
source /iqiyi/moviespider.sql
参考链接:https://www.cnblogs.com/zuidongfeng/p/8032505.html
注:下载redis时,下载在/usr/local目录下,然后解压安装
1、安装python3
2、安装pip3
yum install openssl-devel -y
yum install zlib-devel -y
wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-19.6.tar.gz#md5=c607dd118eae682c44ed146367a17e26
tar -zxvf setuptools-19.6.tar.gz
cd setuptools-19.6
sudo python setup.py build
sudo python setup.py install
wget --no-check-certificate https://pypi.python.org/packages/source/p/pip/pip-8.0.2.tar.gz#md5=3a73c4188f8dbad6a1e6f6d44d117eeb
tar -zxvf pip-8.0.2.tar.gz
cd pip-8.0.2
python setup.py build
sudo python setup.py install
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
3、导入环境包requirements.txt
先拷贝requirements.txt到容器内的iqiyi文件夹,方法同上面拷贝文件的方法
cd /iqiyi
pip3 install -r requirements.txt
发现报错:
Flask-MySQLdb0.2.0 mysqlclient1.3.14 删除掉以上这2个,才能正确导入
在2个程序中,分别修改config.py中的数据库用户名密码,因为你在你电脑上安装的和在服务器上面的密码是不一致的
然后在程序入口修改app.run(),需要添加host和prot这2个内容,才能指定启动和外网访问
app.run(host=‘0.0.0.0’,prot=8000)
至于设置哪个端口,要看当前这个docker开放了什么映射端口,并且无占用才可以
pip3 install uwsgi
# 注意!安装后使用uwsgi命令会显示无此命令,此时需要建立软连接
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
在iqiyi文件夹创建一个flaskconfig文件夹,所有项目的配置文件全在这里面
创建iqiyi.ini的配置文件
[uwsgi]
#uwisi启动程序所使用的地址和端口
http=0.0.0.0:5000
#记录pid,方便停止和重启服务
pidfile=/tmp/uwsgi.pid
#项目所在路径
chdir=/iqiyi/爱奇艺电影/
#flask程序启动文件
wsgi-file=爱奇艺电影.py
#使用主进程
master=true
#多站点
vhost=true
#flask里面启动Application变量名
callable=app
#进程数
processes=4
#线程数
threads=2
manage-script-name = true
touch-reload = /iqiyi/爱奇艺电影/
创建iqiyi_backstage.ini的配置文件
[uwsgi]
#uwisi启动程序所使用的地址和端口
http=0.0.0.0:8000
#记录pid,方便停止和重启服务
pidfile=/tmp/uwsgi.pid
#项目所在路径
chdir=/iqiyi/iqiyi_backstage/
#flask程序启动文件
wsgi-file=iqiyi_backstage.py
#使用主进程
master=true
#多站点
vhost=true
#flask里面启动Application变量名
callable=app
#进程数
processes=4
#线程数
threads=2
manage-script-name = true
touch-reload = /iqiyi/iqiyi_backstage/
编写一下停止uwsgi的脚本stop.sh,如果不用停止脚本,就要一个个的查杀进程,很麻烦
#!/bin/sh
NAME="uwsgi"
if [ ! -n "$NAME" ];then
echo "no arguments"
exit;
fi
echo N A M E < / s p a n > I D < s p a n c l a s s = " t o k e n o p e r a t o r " > = < / s p a n > < s p a n c l a s s = " t o k e n v a r i a b l e " > < s p a n c l a s s = " t o k e n v a r i a b l e " > ‘ < / s p a n > < s p a n c l a s s = " t o k e n f u n c t i o n " > p s < / s p a n > − e f < s p a n c l a s s = " t o k e n o p e r a t o r " > ∣ < / s p a n > < s p a n c l a s s = " t o k e n f u n c t i o n " > g r e p < / s p a n > < s p a n c l a s s = " t o k e n s t r i n g " > " < s p a n c l a s s = " t o k e n v a r i a b l e " > NAME ID=`ps -ef | grep " NAME</span>ID<spanclass="tokenoperator">=</span><spanclass="tokenvariable"><spanclass="tokenvariable">‘</span><spanclass="tokenfunction">ps</span>−ef<spanclass="tokenoperator">∣</span><spanclass="tokenfunction">grep</span><spanclass="tokenstring">"<spanclass="tokenvariable">NAME" | grep -v “$0” | grep -v “grep” | awk '{print KaTeX parse error: Expected 'EOF', got '}' at position 9: 2}̲'ID
echo “#############杀死已存在进程#####################”
for id in I D < / s p a n > < s p a n c l a s s = " t o k e n k e y w o r d " > d o < / s p a n > < s p a n c l a s s = " t o k e n f u n c t i o n " > k i l l < / s p a n > − 9 < s p a n c l a s s = " t o k e n v a r i a b l e " > ID do kill -9 ID</span><spanclass="tokenkeyword">do</span><spanclass="tokenfunction">kill</span>−9<spanclass="tokenvariable">id
echo “kill $id”
done
echo “#############################################”
对stop.sh进行赋值权限
chmod 777 stop.sh
# 使用uwsgi的Emperor —— 多应用部署
uwsgi --emperor /iqiyi/flaskconfig/ -d my.log
# 也可以每个应用依次启动,依次启动时可以再ini配置文件中配置log文件,参考美多商城部署
uwsgi --ini /iqiyi/flaskconfig/iqiyi_backstage.ini
uwsgi --ini /iqiyi/flaskconfig/iqiyi.ini
启动容器
docker run -d -it --privileged -p 806:806 -p 808:808 --name centos-iqiyi-ngnix -e LANG=zh_CN.utf8 centos /usr/sbin/init
进入容器
docker exec -it fcd4c8ad55dc /bin/bash
安装ngnix,参考:https://www.cnblogs.com/kaid/p/7640723.html
注:
# 在/usr/local目录下执行下载,否则可能无法编译
# 使用wget命令下载前要先安装wget
yum install -y wget
打开ngnix的配置文件
vi /usr/local/nginx/conf/nginx.conf
修改配置文件:
······此处省略······
http {
······此处省略······
upstream iqiyi_backstage {
# 此处需为uwsgi服务器所在ip地址
server 192.168.0.107:8001;
}
upstream iqiyi {
# 此处需为uwsgi服务器所在ip地址
server 192.168.0.107:5002;
}
······此处省略······
server {
listen 808;
server_name localhost;
location / {
# 请求转发到多个uwsgi服务器
proxy_pass http://iqiyi;
}
}
server {
listen 806;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
#root html;
#index index.html index.htm;
# 请求转发到多个uwsgi服务器
proxy_pass http://iqiyi_backstage;
}
······此处省略······
启动ngnix
cd /usr/local/nginx/sbin
./nginx
修改配置文件后重新启动ngnix
./nginx -s reload
Upstream 主要用来做负载均衡
负载均衡其实就是在upstream 当中加入多一条server信息,nginx会自动进行选择转发,上面只加一条。
其中 location 是定义路由,如果使用location = / 是属于精准匹配,不加 = 就相当于正则匹配 proxy_pass 转发服务到哪里, 后面拼接一定要加上http:// 否则也是不成功的,这里要注意,缩进无所谓,能看明白就行,但语法千万不能错,一个单词错就没法启动了。
1、保存:docker commit 容器id 自定命名,保存自定义名时最好保存格式为:账户名/镜像名 ,方便上传时不需要再更改
docker commit 7ed9c6fbf986 nengliudian/centos-iqiyi-uwsgi
docker commit fcd4c8ad55dc nengliudian/centos-iqiyi-ngnix
2、登录docker login
一般如果在软件中已经登录,这里可以不用登录了,可以当成验证是否成功登录check一下
3、如果是第一次准备上传镜像需要先到 hub.docker.com中登录创建一个镜像仓库
4、上传自定镜像
首先查看一下本地的镜像有哪些
docker images
5、上传镜像
# docker push 镜像名:tags
docker push nengliudian/centos-iqiyi-ngnix:latest
docker push nengliudian/centos-iqiyi-uwsgi:latest
出现进度条,就成功了,等待就可以
我们可以通过save命令将镜像打包成文件,拷贝给别人使用
docker save -o ./centos-iqiyi-uwsgi.tar nengliudian/centos-iqiyi-uwsgi
在拿到镜像文件后,可以通过load方法,将镜像加载到本地
docker load -i ./centos-iqiyi-uwsgi.tar
以后项目迁移到任何操作系统下通吃