day104 容器部署应用--supervisor改造

day104 容器部署应用--supervisor改造

构建一个python3+flask 镜像

动态代码镜像环境

yzk程序员 给了我flask的代码,需要你去部署python3

AI系统,本地开发,测试的时候,开发用了ubuntu,英伟达GPU的驱动,官网的资料都是ubuntu的驱动的下载,apt安装。

  • 我们cnetos*.rpm要改为 *.deb, Ubuntu系列

  • python的解释器

  • 安装项目的模块

现在都是交互式编译操作

脚本化的部署,思考,非交互式

如: 输入-y,修改配置的文件

# 安装模块
from flask import Flask
from redis import Redis、

# 需要安装2个python的模块,flask,python去读取redis的数据,redis

pip install flask
pip install redis 

先启动reids的数据库

# 先启动redis的数据库
--link

[root@docker-100 py-docker]# docker run -d --name redis redis 
9aef2a3a4661a7a0d1956a98540fb01535e0aa5724c2d92fd82a293f2f193dfd

# 等一下去看redis的信息
[root@docker-100 py-docker]# docker exec -it redis bash 

启动flask 去链接,读取redis

1. 准备源码
本地准备,git pull

#coding:utf-8  ----> 这个是支持中文

from flask import Flask
from redis import Redis

app = Flask(__name__)
redis = Redis(host='redis', port=6379)

@app.route('/')
def hello():
    count = redis.incr('hits')
    return 'linux0224 learn docker ,没毛病 , this page has been visited {} times\n'.format(count)

if __name__ == "__main__":
    app.run(host="0.0.0.0",port=8999, debug=True)
    
# 这里的port端口映射根据你的Docker的暴露的端口
-------------------------------------------------------
2. 准备环境的构建,Dockerfile









# 2依赖文件,都是开发给你提供好的,直接基于这个文件,就可以安装所有的项目所需要的模块。其实就是一个文件
[root@docker-100 py-docker]# cat requirements.txt 
flask
redis 


-----------------------------------------------------------
3.写Dockerfile,必须是大写开头的名字,以及看好位置
FROM centos:7.6.1810
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo;
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo;

WORKDIR /opt
ADD .  .

RUN yum makecache fast \
&& yum install python3 python3-devel python3-pip -y \
&& python3 -m pip install    -i https://mirrors.aliyun.com/pypi/simple --upgrade pip \
&& pip3 install      -i https://mirrors.aliyun.com/pypi/simple -r  ./requirements.txt 



EXPOSE 8999
CMD ["python3","run-flask.py"]


# 这里的是先配置yum源
# 把当前的所有的文件放到工作的目录中
# 最后的命令失去下载 当前requirements文件下的内容,也就是上面的模块。


----------------------------------------
# 构建
[root@docker-100 py-docker]# docker build -t t1-flask-redis .

# 我们先进来看看对不对
[root@docker-100 py-docker]# docker run -it t1-flask-redis bash
[root@05132bd6e299 opt]# ls
Dockerfile  requirements.txt  run-flask.py
[root@05132bd6e299 opt]# 



# 启动flask要去链接,读取redis
docker run -d -P --name flask-redis-app   --link=redis t1-flask-redis

# 这里的命令是 后端的启动,以及 -P的随机的端口 --name起个名字

小结 python 应用的容器,读写redis的代码,部署的过程。


学习supervisor进程管理工具

1, 你的容器,是包裹着你的应用进程的一个程序,前台运行的程序

2,进程管理工具,实现进程pid的检测,进程挂了自动的重启

3,一次性管理多个进程

4,一个后端的应用,nginx + 后端

改造flask容器,dockerfile

# nginx 和 flask进程在同一个容器,它两进程,同时用supservisor去管理。

1. 准备物料,nginx的配置文件

前端访问问后端的入口,80端口

cat > nginx_flask.conf << "EOF"
server {
	listen 80;
	server_name _;
	location / {
	proxy_pass http://127.0.0.1:8999;
	}
}

EOF


===========================================

2,源码的文件
[root@docker-200 /nginx-flask]#cat run-flask.py 
#coding:utf-8
from flask import Flask
from redis import Redis

app = Flask(__name__)
redis = Redis(host='redis', port=6379)

@app.route('/')
def hello():
    count = redis.incr('hits')
    return 'linux0224 learn docker ,没毛病 , this page has been visited {} times\n'.format(count)

if __name__ == "__main__":
    app.run(host="0.0.0.0",port=8999, debug=True)
[root@docker-200 /nginx-flask]#


------------------------------------------

# supervisor 的配置文件(本质上就是帮你去执行启动xx程序的一个工具而已)

cat > nginx_flask.ini <<'EOF'
[program:my-nginx]
command=nginx -g 'daemon off;'
autostart=true
autorestart=true
startsecs=5
redirect_stderr=true
stdout_logfile_maxbytes=20MB
stdout_logfile_backups=20
stdout_logfile=/var/log/supervisor/nginx.log

[program:my-flask]
command=python3  /opt/run-flask.py
autostart=true
autorestart=true
startsecs=5
redirect_stderr=true
stdout_logfile_maxbytes=20MB
stdout_logfile_backups=20
stdout_logfile=/var/log/supervisor/flask.log
EOF
--------------------------------------------

#python 的依赖模块
镜像要保持简洁所以需要安装什么就安装什么

cat requirements.txt 
flask
redis
requests
ipython

----------------------------------------------
# 所有的物料
[root@docker-100 nginx-flask]# ll
total 16
-rw-r--r-- 1 root root 115 May 21 14:50 nginx_flask.conf
-rw-r--r-- 1 root root 435 May 21 14:51 nginx_flask.ini
-rw-r--r-- 1 root root  29 May 21 14:52 requirements.txt
-rw-r--r-- 1 root root 366 May 21 14:50 run-flask.py




--------------------------------------------------
# 对dockerfile的修改,包裹nginx,supervisor,flask三的程序
cat > Dockerfile <<'EOF'
FROM centos:7.6.1810
#RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo;
#RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo;

RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo


WORKDIR /opt

COPY requirements.txt /opt/
COPY run-flask.py  /opt

RUN yum makecache fast \
&& yum install python3 python3-devel python3-pip -y \
&& python3 -m pip install    -i https://mirrors.aliyun.com/pypi/simple --upgrade pip \
&& pip3 install      -i https://mirrors.aliyun.com/pypi/simple -r requirements.txt \
&& yum install supervisor nginx -y

COPY nginx_flask.ini /etc/supervisord.d/

COPY nginx_flask.conf /etc/nginx/conf.d/

RUN sed -i 's/nodaemon=false/nodaemon=true/g' /etc/supervisord.conf


EXPOSE 8999
EXPOSE 80
VOLUME /var/log/supervisor/

CMD ["/usr/bin/supervisord","-c","/etc/supervisord.conf"]

EOF

---------------------------------------------------
1. 他这里yum源的安装
2. 工作的目录  /opt
3. 把当前目录下的所有的文件 放到/opt下
4.安装所需要的环境,
5,复制这些文件到指定的目录下。
6,修改个配置文件,改为前台运行。
7,暴露端口,
8,运行的命令。

# supervisor默认启动程序,是后台运行,但是docker的特性,要求,容器内进程,必须前台运行,因此修改supervisor配置文件

# EXPOSE 也是主动声明,告诉别人,以及docker这个镜像,运行容器后,应该暴露的端口是多少

#  -p 8999:8999  -p 80:80
#  -P 

最终的物料

[root@docker-100 nginx-flask]# ll
total 20
-rw-r--r-- 1 root root 1007 May 21 14:58 Dockerfile
-rw-r--r-- 1 root root  115 May 21 14:50 nginx_flask.conf
-rw-r--r-- 1 root root  435 May 21 14:51 nginx_flask.ini
-rw-r--r-- 1 root root   29 May 21 14:52 requirements.txt
-rw-r--r-- 1 root root  366 May 21 14:50 run-flask.py

# 构建镜像,运行容器
# 先运行redis数据库,后端需要读取

[root@docker-100 nginx-flask]# docker run -d --name my-redis redis:latest
b11778e165f6d78bab9d95ed202e5162f6ac3100c6ab9b9194b2a9548edc138e


# 构建nginx-flask镜像
# 去掉无用的软件安装步骤,加速的下载

docker build -t nginx-flask-redis .

# 产看镜像的构建层关系,运行业务的容器,查看请求的走向。
docker history nginx-flask-redis:latest 

# 创建容器
docker run -d -p 80:80 --name my-nginx-flask-redis  nginx-flask-redis:latest

# 确认是代码的连接redis的主机名错误
# flask应用容器,从主机名,连接redis容器
# redis容器名(主机名),prod-redis
# 和你的代码一致

报错了

说明了我们呢启动方式的问题

1.启动redis数据库
# 添加配置文件,启动redis,是否端口映射,数据卷的映射,主机名等定制。
[root@docker-200 ~]#docker run -d --name prod-redis   redis

# 2.修改flask的应用代码配置文件

[root@docker-200 /nginx-flask]#cat run-flask.py 
#coding:utf-8
from flask import Flask
from redis import Redis

app = Flask(__name__)
redis = Redis(host='prod-redis', port=6379)

@app.route('/')
def hello():
    count = redis.incr('hits')
    return '上线啦~~~~~给力。linux0224 learn docker ,没毛病 , this page has been visited {} times\n'.format(count)

if __name__ == "__main__":
    app.run(host="0.0.0.0",port=8999, debug=True)
[root@docker-200 /nginx-flask]#



# 3.修改交付的docker镜像
docker build -t prod-nginx-flask-redis .


# 4.运行上线容器
docker run -d -p 80:80 --name prod-nginx-flask --link prod-redis prod-nginx-flask-redis

# 5.检测运行的日志

# 6.完活

# 进入容器内,查看进程的关系,明确supervisor是nginx,flask的父进程
[root@docker-100 nginx-flask]# docker exec -it d73 bash 




[root@1b10ba794e27 opt]# supervisorctl -c /etc/supervisord.conf restart all     
my-flask: stopped
my-nginx: stopped
my-flask: started
my-nginx: started
[root@1b10ba794e27 opt]# 

# 在看看supervisor管理的进程配置文件,以及日志的信息
 ls /etc/supervisord.d/
nginx_flask.ini

# 查看进程管理信息
# 登录supervisor ,交互式管理进程

[root@d738cc17109a supervisord.d]# supervisorctl -c /etc/supervisord.conf

# 非交互式的管理进行的方式
[root@d738cc17109a supervisord.d]# supervisorctl -c /etc/supervisord.conf  status all
my-flask                         RUNNING   pid 9, uptime 1:03:00
my-nginx                         RUNNING   pid 10, uptime 1:03:00


# 比如用supervisor停止配置的my-nginx
supervisorctl -c /etc/supervisord.conf stop my-nginx

# 重启这个服务
supervisorctl -c /etc/supervisord.conf start my-nginx


# 查看各个服务的状态
[root@d738cc17109a supervisord.d]# supervisorctl -c /etc/supervisord.conf status all    
my-flask                         RUNNING   pid 9, uptime 1:14:55
my-nginx                         RUNNING   pid 57, uptime 0:02:06

posted @ 2025-05-21 17:51  国家一级冲浪yzk  阅读(21)  评论(0)    收藏  举报