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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容