Centos7 + Python + Redis+ Mysql + Uwsgi + Nginx
一、Centos7安装docker
1.1 环境配置
先测试是否下载了docker:查看镜像:docker images
没有下载,就依次执行以下环境的安装
①curl http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
②yum install -y yum-utils device-mapper-persistent-data lvm2
③yum list docker-ce.x86_64 --showduplicates | sort -r
④yum install -y --setopt=obsoletes=0 docker-ce-17.03.2.ce-1.el7.centos.x86_64 docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch
⑤systemctl daemon-reload
systemctl restart docker
systemctl enable docker.service
⑥docker version
docker安装成功。
二、镜像
2.1 配置镜像加速
直接复制阿里云:Docker-hub:https://cr.console.aliyun.com/cn-hangzhou/mirrors
先创建文件夹:mkdir -p /etc/docker
执行:
tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://68rmyzg7.mirror.aliyuncs.com"] } EOF
2.2 镜像加速方法
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
2.3 拉取镜像
从中央仓库中下载镜像到本地
docker pull 镜像名称:版本标签(如:docker pull mysql:5.6)
2.4 查看镜像信息
docker inspect 镜像id 或者 镜像名称:标签
2.5 删除镜像
方法一:先删除依赖镜像的容器:
docker rm 容器id 或者 容器名称
容器id查找:这里docker ps -a 所有容器信息 -q 正在运行的容器ID
再删除镜像docker rmi 镜像id 或者 镜像名称
方法二:强制删除镜像,依赖它的容器会一并删除:
docker rmi 镜像id 或者 镜像名称:版本 -f
2.6 搜索镜像
docker search 镜像名称
三、容器
3.1 创建容器
docker run -it 镜像id 或者 镜像名称:便签
-i 标准输入
-t 伪终端
-d 守护状态运行
--name 命名容器
-p 端口映射(宿主机端口:容器端口)
-P 端口映射(随机端口)
-v 文件挂载 (-v $PWD/redis/conf/redis.conf:/etc/redis/redis.conf)
本地文件/路径:容器文件/路径
不论修改宿主机还是容器内挂载的文件,会同时变化,避免要修改容器中文件内容
而需要安装vim或者复制文件至容器的操作。
-link 容器间通信(--link tesudrm_tsdrm:django_server)
关联的容器名称/id:关联容器服务器地址的别名(自动加载至hosts文件)
3.2 启动容器
docker start 容器id 或 容器名称
3.3 关闭容器
docker stop 容器id 或 容器名称
3.4 进入容器
docker exec -it 容器id 或 容器名称 /bin/bash
3.5 退出容器(后台运行)
Ctrl + p + q
3.6 暂停容器
docker pause 容器id 或者 容器名称(unpause取消暂停)
3.7 查看容器详情
docker inspect 容器id 或 容器名称:版本号
3.8 删除容器
docker rm 容器id 或 容器名称(只删除已经关闭或者退出的容器,-f表示强制)
3.9 复制文件至容器
docker cp 本地命令执行所在相对路径 容器id/名称:/root/(容器绝对路径)
如:docker cp /www/pro_tesu/MySQL/tesudrm.sql 容器ID:/root/
四、配置
4.1 准备的文件目录
mkdir /www/pro_tesu/Redis/{conf,data} -p
mkdir /www/pro_tesu/MySQL/{conf.d,logs,data} -p
mkdir /www/pro_tesu/Nginx/log -p
mkdir /www/pro_tesu/TSDRM
touch /www/pro_tesu/MySQL/conf.d/my.cnf
touch /www/pro_tesu/Nginx/nginx.conf
touch /www/pro_tesu/Redis/conf/redis.conf
编辑my.cnf文件,添加内容:见附件
4.2 MySQL容器
①拉取镜像:docker pull mysql:5.6
②创建容器
docker run \ -p 3307:3306 \ --name tesudrm_mysql \ -v $PWD/MySQL/conf.d:/etc/mysql/conf.d \ -v $PWD/MySQL/logs:/logs \ -v $PWD/MySQL/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=password \ -d mysql:5.6
③拷贝sql文件至容器
前提是先把sql文件上传到/www/pro_tesu/MySQL文件夹下
docker cp /www/pro_tesu/MySQL/tesudrm.sql 容器ID:/root/
如:docker cp /www/pro_tesu/MySQL/tesudrm.sql 1e373b556bc6:/root/
④进入容器
docker exec -it 容器id或名称 /bin/bash 注:容器开启的状态下
cd /root/ 切换到容器的家目录下,ls可以查看是否有sql文件
⑤连接数据库mysql -u root –p回车输入密码即可。
⑥创建数据库
create database tesudrm charset=utf8;
⑦导入数据文件
mysql -uroot -ppassword tesudrm< tesudrm_v2.0.sql
sql数据导入成功。
4.3 redis容器
docker中redis默认无配置文件启动
配置文件redis.conf(根据需求自己配置,参数说明:https://www.cnblogs.com/qq78292959/archive/2013/09/21/3331032.html)
requirepass tesunet
daemonize no
port 6379
编辑redis.conf文件,添加内容:见附件
①拉取镜像
docker pull redis:3.2
②创建容器
docker run \ -p 6378:6379 \ --name tesudrm_redis \ -v $PWD/Redis/conf/redis.conf:/etc/redis/redis.conf \ -v $PWD/Redis/data:/data \ -d redis:3.2 redis-server /etc/redis/redis.conf
五、centos6.8容器下安装python3.6.8
5.1 拉取centOS6.8镜像、创建容器、进入容器
docker pull centos:6.8
docker run -itd centos:6.8 /bin/bash
docker exec -it 容器id bin/bash
5.2 centos容器中安装安装python3.6.8
①上传Python-3.5.4.tgz压缩包至linux上(在指定的自定义路径)
或者直接在linux上:
wegt https://www.python.org/ftp/python/3.5.4/Python-3.5.4.tgz
②docker cp 自定义路径/Python-3.5.4.tgz 容器id:/home/
③tar -zxvf Python-3.5.4.tgz
④cd Python-3.5.4
⑤编译:./configure --prefix=/usr/local/python3 问题:Python3..4安装报错 configure: error: in `/usr/local/python3/Python-3.5.4' configure: error: no acceptable C compiler found in $PATH 解决:缺少gcc编译环境:yum -y install gcc ⑥安装:make && make install ⑦建立软链接 ln -s /usr/local/python3/bin/python3.5 /usr/bin/python3 ln -s /usr/local/python3/bin/pip3.5 /usr/bin/pip3 ⑧查看python3与pip3版本 python3 pip3 –V
问题:pip3 -V : pip3 command not found
解决:
wget --no-check-certificate https://pypi.python.org/packages/26/d1/dc7fe14ce4a3ff3faebf1ac11350de4104ea2d2a80c98393b55c84362b0c/setuptools-32.1.0.tar.gz
tar zxvf setuptools-32.1.0.tar.gz
cd setuptools-32.1.0
python3 setup.py build
python3 setup.py install
wget --no-check-certificate https://pypi.python.org/packages/11/b6/abcb525026a4be042b486df43905d6893fb04f05aac21c32c638e939e447/pip-9.0.1.tar.gz
tar zxvf pip-9.0.1.tar.gz
cd pip-9.0.1
python3 setup.py install
问题:Compression requires the (missing) zlib module.
解决:yum install zlib
⑨上传项目
docker cp /www/pro_tesu/TSDRM容器ID:/root/
从清华大小pip源安装依赖
cd TSDRM
pip3 install –r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
问题:安装依赖的时候,发现安装了之后运行项目python3 manage.py runserver 0.0.0.0:8000,还是会报错,模块没有安装成功
解决:报什么模块没有 执行:pip3 install 模块名==版本号 ,再运行项目,报错,依次执行
如项目一些重要的模块必须安装:pip3 install redis==版本号
pip3 install celery==版本号
pip3 install django-celery==版本号
pip3 install flower==版本号
问题:No module named Cython
解决:pip install Cython
pip install fasttext
5.3 配置uwsgi
①cd TSDRM
②ls
③vi uwsgi.ini
④填写配置参数(见附录)
保存退出
⑥运行uwsgi: uwsgi --ini uwsgi.ini
⑦访问项目:192.168.1.89,执行正确会显示没有样式的页面
问题:在运行uwsgi时: uwsgi:command not found
解决:找到uwsgi的位置: find / -name uwsgi ——>>> /usr/local/python3/bin/uwsgi
建立软链接: ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
输入uwsgi --help 查看是否成功
启动成功: [uwsgi-static] added mapping for /static => /home/personl_blog/static
关闭uwsgi: uwsgi --stop uwsgi.pid
5.4 安装pdf生成软件:wkhtmltopdf
在https://github.com/wkhtmltopdf/wkhtmltopdf/releases/ 下载对应的安装包,在这里我选择:wkhtmltox-0.12.5-1.centos6. x86_64.rpm
rpm -ivh wkhtmltox-0.12.5-1.centos6. x86_64.rpm
测试是否安装成功:
wkhtmltopdf http://www.baidu.com ./test.pdf 注:这里是把百度的首页转成test.pdf文件,保存在当前路径下
安装软件报错:
[root@7f8a11fc9311 home]# rpm -ivh wkhtmltox-0.12.5-1.centos6.x86_64.rpm error: Failed dependencies: fontconfig is needed by wkhtmltox-1:0.12.5-1.centos6.x86_64 freetype is needed by wkhtmltox-1:0.12.5-1.centos6.x86_64 libX11 is needed by wkhtmltox-1:0.12.5-1.centos6.x86_64 libXext is needed by wkhtmltox-1:0.12.5-1.centos6.x86_64 libXrender is needed by wkhtmltox-1:0.12.5-1.centos6.x86_64 libjpeg is needed by wkhtmltox-1:0.12.5-1.centos6.x86_64 libpng is needed by wkhtmltox-1:0.12.5-1.centos6.x86_64 xorg-x11-fonts-75dpi is needed by wkhtmltox-1:0.12.5-1.centos6.x86_64 xorg-x11-fonts-Type1 is needed by wkhtmltox-1:0.12.5-1.centos6.x86_64 解决:通过yum安装以上安装报错的模块 yum install -y fontconfig freetype libX11 libXext libXrender libjpeg libpng xorg-x11-fonts-75dpi xorg-x11-fonts-Type1
5.5 下载中文字体simsun.ttc
下载:http://www.font5.com.cn/font_download.php?id=150&part=1237886897
上传到 linux系统 /usr/share/fonts docker cp /usr/share/fonts /simsun.ttc 容器ID:/usr/share/fonts
5.6 修改项目中数据库的地址
cd TSDRM cd TSDRM vi settings.py
mysql: HOST:172.17.0.3 注:这个ip地址是mysql容器的ip PORT:3306
redis:172.17.0.2 注:这个ip地址是redis容器的ip
6379
5.7 安装静态文件
1、collectstatic命令收集静态文件至项目根目录下:
python manage.py collectstatic
2、注释STATICFILES_DIRS ,解注:STATIC_ROOT
STATIC_URL = '/static/'
SITE_ROOT = os.path.join(os.path.abspath(os.path.dirname(__file__)), '..')
STATIC_ROOT = os.path.join(SITE_ROOT, 'static')
# STATICFILES_DIRS = [
# os.path.join(BASE_DIR, "static")
# ]
5.8 浏览器访问:192.168.1.89
5.9 cmd访问192.168.1.89
六、打包自定义镜像上传阿里云
6.1 先关闭容器:docker stop 容器ID
6.2 基于当前容器重新创建镜像
docker commit -m "描述" -a "root" -p 容器id 镜像名称:版本号
如:docker commit -m "centos6.8_python3.4" -a "root" -p 容器id en_centos:2.2
-p 表示提交时停止容器
-a 提交镜像的作者
-m 提交时的说明文字
6.3 创建阿里云账号
https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
6.4 登录阿里云账号
docker login --username=zgs1121 registry.cn-hangzhou.aliyuncs.com
password:**********
6.5 将镜像上传到阿里云的镜像仓库
docker tag 镜像ID registry.cn-hangzhou.aliyuncs.com/tesu/仓库名(en_centos)
docker push registry.cn-hangzhou.aliyuncs.com/tesu/仓库名(en_centos)
七、下拉自定义镜像并创建项目Django容器
7.1 拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/tesunet/en_centos
7.2 命名镜像
docker tag registry.cn-hangzhou.aliyuncs.com/tesunet/en_centos 新镜像名称
八、django项目容器
8.1 切到项目所在的路径下
cd /www/pro_tesu/
8.2 基于自定义镜像创建容器
docker run -p 8000:8000 \
-v $PWD/TSDRM:/TSDRM \
--link tesudrm_mysql:mysql_server \
--link tesudrm_redis:redis_server \
--name tesudrm_tsdrm \
-itd centos_python\
sh -c 'cd /TSDRM/&&\
uwsgi --ini uwsgi.ini&&\
python3 manage.py celery multi start worker -A TSDRM -l info --logfile=/TSDRM/log/celerylog.log&&\
python3 manage.py celery multi start beat -A TSDRM -l info --logfile=/TSDRM/log/beat.log&&\
python3 manage.py celery -A TSDRM flower -l info'
注:sh -c ‘…’ 表示启动容器时运行的命令,命令结束容器并会自动断开,所以多个命令的最后一个必须在终端一直运行的命令,或者是无限循环。
8.3 进入容器
docker exec -it 容器id bin/bash
8.4 切换到项目路径下
cd TSDRM
8.5 启动uwsgi
uwsgi --ini uwsgi.ini
8.6 运行项目
python3 manage.py runserver 0.0.0.0:80
注:如有模块没有安装,安装模块
8.7 上述项目跑起来了,页面没有样式,需安装静态文件。如果你的自定义镜像中安装了静态文件等,就不需要执行此操作
①切换到项目根路径下: cd TSDRM
②收集静态文件: python3 manage.py collectstatic 注: 收集好的静态文件存放于项目根目录下,名为: static
③查看静态文件: cd static ls
④修改配置文件
注释: STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")]
添加: STATIC_URL = '/static/'
SITE_ROOT = os.path.join(os.path.abspath(os.path.dirname(__file__)), '..')
STATIC_ROOT = os.path.join(SITE_ROOT, 'static')
8.9 访问项目:192.168.1.89
九、运行nginx容器
9.1 拉取镜像
docker pull nginx
9.2 运行容器
运行容器之前先配置好文件,配置文件见附录
cd /www/pro_tesu/
docker run -v $PWD/Nginx/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/Nginx/log:/var/log/nginx \
-v $PWD/TSDRM/static:/static \
--link tesudrm_tsdrm:django_server \
--name tesudrm_nginx \
-d -p 8888:80 nginx
9.3 访问项目
192.168.1.89:8888
另附:启动nginx容器,浏览器访问nginx
9.4 电脑重启后启动容器命令
docker start tesudrm_mysql tesudrm_redis tesudrm_pro tesudrm_nginx
十、附录
10.1 uwsgi.ini配置文件
[uwsgi] #socket=0.0.0.0:8000 配置nginx代理时使用 http=0.0.0.0:8000 chdir=/TSDRM #module=TSDRM.wsgi:application wsgi-file=/TSDRM/TSDRM/wsgi.py master=True process=4 pidfile=/TSDRM/TSDRM-master.pid vacuum=True max-requests=5000 #daemonize=/TSDRM/log/wsgi.log #static-map=/static=/TSDRM/static