docker项目部署python+uWSGI+nginx+mysql+redis

这两天要把python项目部署到gongan内网,下面来简要记录一下这次部署遇到的各种问题。由于内网不能上网,遇到的各种问题不能截图或者直接复制粘贴,只能是部分零零散散的手机拍照
由于内网不能访问互联网,导致好多依赖和环境不能安装,所有就选择来用docker部署项目
1,先下载centos7版本的docker离线安装包。到时候跟打包好的镜像一起拷贝到内网
ps:互联网的文件放到内网很麻烦,有2个U盘,通过专门的渠道把文件放到内网上,后续数据传输将通过ftp服务器传输。

2,把python、uWSGI、requirements.txt打包成docker镜像
在flask项目根目录下创建Dockerfile

FROM alpine:3.9
WORKDIR /app
COPY ./requirements.txt /app
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g'  /etc/apk/repositories && \
    apk update && \
    apk add python3 py3-pip python3-dev git gcc g++ linux-headers libstdc++ libffi-dev&& \
    apk add uwsgi-python3 tzdata libxml2-dev libxslt-dev openssl-dev && \
    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone && \
    pip3 install --index-url=http://mirrors.aliyun.com/pypi/simple/  --trusted-host mirrors.aliyun.com -r requirements.txt && \
    apk del py3-pip python3-dev git tzdata gcc g++ linux-headers && \
    cd / && \
    rm -rf /app  ~/.cache/pip /var/cache/apk/*

在当前Dokcerfile目录下运行:docker build -t balz:20191111 .
导出镜像:docker save balz:20191111 > balz.tar

3,分别下载nginx、mysql、redis的镜像,直接docker pull 就能下载,centos7宿主机先安装docker,之后docker load 加载镜像
docker images 查看镜像

4,docker运行mysql容器

docker run -d -p 3306:3306 
--restart=always 
-e MYSQL_ROOT_PASSWORD="root" 
-e MYSQL_USER="myroot" 
-e MYSQL_PASSWORD="myroot" 
--name mysql 
-v /var/lib/mysql:/var/lib/mysql 
-v /etc/mysql/conf.d/mysql.conf:/etc/mysql/conf.d/mysql.conf mysql:latest

# -v /var/lib/mysql:/var/lib/mysql 
把宿主机的目录挂载到容器的/var/lib/mysql目录下,把mysql的数据放在宿主机的目录下

# -v /etc/mysql/conf.d/mysql.conf:/etc/mysql/conf.d/mysql.conf
把宿主机的配置文件挂载到容易的/etc/mysql/conf.d配置文件,宿主机修改配置文件可以影响到容器的配置文件

docker ps #查看容器是否运行
docker logs mysql #查看是否运行成功
docker exec -it mysql bash #进入mysql容器里面
exit#退出容器
docker stop mysql #停止容器
docker rm mysql #删除容器
docker restart mysql #重新启动mysq镜像
# python项目配置mysql
DB_CONFIG = {
     'user': 'youname',
     'password': 'youpwd',
     'host': '127.0.0.1', #应该改成mysql容器的地址172.17.0.5
     'port': 3306,
     'db': 'youdb',
     'charset': 'utf8',
}

此时我犯的错误导致python程序链接不了mysql
原因:python配置文件中链接mysql的地址是:127.0.0.1
对策:应该要写mysql运行容器中的地址:172.17.0.5
docker inspect --format '{{ .NetworkSettings.IPAddress }}' node1 # 查看容器id或者名称

5,docker运行redis容器

# 启动redis命令
docker run
-p 6379:6379 
--name redis 
--restart=always 
-v /etc/redis/redis.conf:/etc/redis/redis.conf 
-v /var/lib/redis/:/data 
-d redis
# docker redis镜像数据默认存储在容器的/data目录下,

# 如需访问容器,可使用
docker exec -it redis bash
redis-cli
# 或直接使用redis-cli访问容器内redis
docker exec -it redis redis-cli
docker run -it redis:alpine redis-cli -h 172.17.0.1
# 注意,这个是容器运行的ip,可通过 docker inspect redis_s | grep IPAddress 查看
# 查看活跃的容器
docker ps
# 如果没有 myredis 说明启动失败 查看错误日志
docker logs myredis
# 查看 myredis 的 ip 挂载 端口映射等信息
docker inspect myredis
# 查看 myredis 的端口映射
docker port myredis
# session
DEFAULT_REDIS = {
    'host': '172.17.0.1', # 此处应该填写redis容器运行的ip
    'port': 6379,
    'db': 1,
}

5,docker运行nginx容器

# 启动容器
docker run -d --name nginx nginx
# 启动临时容器,把目录找到
docker exec -it nginx bash # 进入容器里面,找到配置目录
# 拷贝容器里的配置文件到宿主机
docker cp nginx:/etc/nginx ./ # 把nginx中的配置文件复制到当前目录(当前目录/etc/nginx)

# 再次启动nginx容器
docker run --name nginx 
-p 80:80 
--restart=always 
-v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro #配置文件
-v /var/log/nginx:/var/log/nginx  #日志
-v /var/http/dist:/usr/share/nginx #静态资源
-d nginx

要注意的是:-v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
在宿主机的/etc/nginx/nginx.conf直接写nginx的配置

因为这两句include并不会真正加载到容器里
# include /etc/nginx/conf.d/*.conf;
# include /etc/nginx/sites-enabled/*;

改nginx配置文件之前,找到nginx容器里静态文件路径

docker exec -it nginx bash # 进入容器里面,找到nginx加载静态文件目录:
发现目录为:/usr/share/nginx
exit # 退出nginx容器

在宿主机的/etc/nginx/nginx.conf写配置文件

# 只截取里部分
server {
    listen 80; #这里我只监听的80端口
    server_name (nginx容器的ip);
    root /usr/share/nginx; # 刚开始写宿主机的静态路径/var/http/dist/ 一直加载不了,后面改成nginx容器中的静态路径/usr/share/nginx就ok
    location /css{
        alias /usr/share/nginx/css; 
    }
    location /fonts{
        /usr/share/nginx/fonts;
    }
   ...
}

此时访问127.0.0.1:8080可以正常加载页面里,这是该启动python

6,docker运行python
cd /home/data/youapp/ 进入到你代码目录
编写uwsgi.ini配置文件

[uwsgi]
module=web:app
callable=app
master=true
processes=3
chmod-socket=666
logfile-chmod=644
socket=127.0.0.1:5050
enable-threads=true
logto=%(chdir)/uwsgi/uwsgi.log

启动python

docker run -d --name balz 
-v $PWD:/app -p 0.0.0.0:5050:5050  balz:20191111 uwsgi --plugin=python3  --ini uwsgi.ini 

docker大法好,但各种细节真的要注意
注意项目代码中mysql,reids配置要写容器内的ip

你可能感兴趣的:(docker项目部署python+uWSGI+nginx+mysql+redis)