dockerfile 简单搭建 和 supervisor 进程管理工具

发布于:2025-06-14 ⋅ 阅读:(18) ⋅ 点赞:(0)

dockerfile 简单搭建 和 supervisor 进程管理工具

构建nginx+centos镜像

1.创建目录
[root@docker-200 ~]#mkdir /www.yuchaoit.cn/test_dockerfile/nginx_base/

2.准备配置文件,如yum文件
cd /www.yuchaoit.cn/test_dockerfile/nginx_base/

curl -o ./Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o ./epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo

[root@docker-200 /www.yuchaoit.cn/test_dockerfile/nginx_base]#ls
Centos-7.repo  Dockerfile  epel-7.repo


3.写Dockerfile,必须是大写开头的名字,以及看好位置
cat > Dockerfile <<'EOF'
FROM centos:7.9.2009
RUN rm -rf /etc/yum.repos.d/*
ADD *.repo /etc/yum.repos.d/
RUN yum makecache fast \
&& yum install nginx -y \
&& yum clean all
EXPOSE 80
CMD ["nginx","-g","daemon off;"]
EOF

# 提示,RUN的写法,是为了降低镜像体积,删除缓存

4.最终目录结果
[root@docker-200 /www.yuchaoit.cn/test_dockerfile/nginx_base]#ls
Centos-7.repo  Dockerfile  epel-7.repo

构建python3+ flask 镜像

动态代码的镜像环境

xx程序给你一套flask代码,需要你测python3

python,AI系统,本地开发,调试的时候,开发用的ubuntu ,英伟达GPU驱动,官网找的资料ubuntu驱动下载,apt安装

*.rpm

*.deb

  • python3 解释器

  • 安装该项目的模块

from flask import Flask

from redis import Redis

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


pip3 install flask

pip3 instlal redis




先启动redis数据库

flask代码,要能识别一个主机名解析,redis > redis机器的ip > ip:6379

--link 

先启动redis数据库
[root@docker-200 /py3-docker]#docker run -d --name redis redis 

# 待会去看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)



# 2依赖文件,都是开发给你提供好的,直接基于这个文件装,就可以安装所有项目所需的模块


[root@docker-200 /py3-docker]#ls
requirements.txt  run-flask.py
[root@docker-200 /py3-docker]#cat requirements.txt 
flask
redis




2. 准备运行环境的构建,Dockerfile,
# 都是交互式编译操作
# 脚本化部署操作,思考,非交互式
# 输入-y  修改配置文件  ,手动输入,vim去修改
# sed



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"]


# 构建
[root@docker-200 /py3-docker]#docker build -t t1-flask-redis .


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




在这里插入图片描述

小结

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

学习supervisor进程管理工具

# 你的容器,是包裹着你的应用进程的一个程序,前台运行的程序
# 进程管理工具,实现进程pid检测,进程挂了自动重启
# 一次性管理多个进程
# 一个后端应用,nginx+后端,


# 俩容器,redis容器,

#  nginx + flask 容器
# 加上supervisor进程管理工具,检测到容器内的应用进程挂了,自动重启该应用进程


改造flask容器,dockerfile

nginx和flask进程,再同一个容器,它俩进程,同时用supervisor去管理


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


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


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


源码文件
[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模块依赖文件
[root@docker-200 /nginx-flask]#cat requirements.txt 
flask
redis
# 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;



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

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

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


# 最终的物料

[root@docker-200 /nginx-flask]#ll
total 20
-rw-r--r-- 1 root root 816 Sep  5 23:38 Dockerfile
-rw-r--r-- 1 root root 115 Sep  5 23:25 nginx_flask.conf
-rw-r--r-- 1 root root 435 Sep  5 23:29 nginx_flask.ini
-rw-r--r-- 1 root root  29 Sep  5 23:30 requirements.txt
-rw-r--r-- 1 root root 366 Sep  5 23:25 run-flask.py
[root@docker-200 /nginx-flask]#
[root@docker-200 /nginx-flask]#


# 构建镜像,运行容器
# 先运行redis数据库,后端要读
[root@docker-200 /nginx-flask]#docker run --name my-redis  -d redis
29e91a3f37409bfc4f1f0593f23f9b4afea8f31925fc5730e3c51682aa21e6f0
[root@docker-200 /nginx-flask]#


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

[root@docker-200 /nginx-flask]#docker build -t nginx-flask-redis .


# 查看镜像构建层关系,运行业务容器,查看请求走向
[root@docker-200 /nginx-flask]#docker history nginx-flask-redis:latest 


# 启动镜像,运行supervisord进程,顺带启动后端的nginx,flask
[root@docker-200 /nginx-flask]#docker run -d -p 80:80  --name my-nginx-flask-redis   nginx-flask-redis:latest 
9807962a74ae01d9ed8c152ea8c4ecedf188d5ede7e0e510fc37e51bd42371a3
[root@docker-200 /nginx-flask]#
[root@docker-200 /nginx-flask]#
[root@docker-200 /nginx-flask]#docker port my-nginx-flask-redis 
80/tcp -> 0.0.0.0:80
80/tcp -> :::80
[root@docker-200 /nginx-flask]#

# 进入容器内,查看进程关系,明确supervisor是nginx,flask的父亲进程
[root@docker-200 /nginx-flask]#docker exec -it my-nginx-flask-redis  bash
[root@9807962a74ae opt]# ps -ef


# 再看supervisor管理的进程配置文件,以及日志的信息
[root@9807962a74ae supervisor]# ls /etc/supervisord.d/
nginx_flask.ini
[root@9807962a74ae supervisor]# cat /etc/supervisord.conf 

# 查看进程管理信息
# 登录supervisor,交互式管理进程
[root@9807962a74ae supervisor]# supervisorctl -c /etc/supervisord.conf    

# 非交互式管理进程

[root@9807962a74ae supervisor]# supervisorctl -c /etc/supervisord.conf   status all
my-flask                         RUNNING   pid 9, uptime 0:09:38
my-nginx                         RUNNING   pid 101, uptime 0:00:52
[root@9807962a74ae supervisor]# 
[root@9807962a74ae supervisor]# 
[root@9807962a74ae supervisor]# 
[root@9807962a74ae supervisor]# 
[root@9807962a74ae supervisor]# supervisorctl -c /etc/supervisord.conf   stop my-nginx
my-nginx: stopped
[root@9807962a74ae supervisor]# 
[root@9807962a74ae supervisor]# supervisorctl -c /etc/supervisord.conf   start all     
my-nginx: started
[root@9807962a74ae supervisor]# supervisorctl -c /etc/supervisord.conf   status all
my-flask                         RUNNING   pid 9, uptime 0:10:11
my-nginx                         RUNNING   pid 134, uptime 0:00:09
[root@9807962a74ae supervisor]# 


# stop all 批量重启一组进程


# 演示supervisor的进程自动重启高级作用

[root@9807962a74ae opt]# supervisorctl -c /etc/supervisord.conf status all 
my-flask                         RUNNING   pid 157, uptime 0:00:11
my-nginx                         RUNNING   pid 158, uptime 0:00:11
[root@9807962a74ae opt]# 



# 确认是代码链接的redis主机名的问题。
# flask应用容器,得从主机名,链接redis容器
#  redis容器名(主机名), prod-redis
# 和你代码一致。


# 调试通过后,记录下文档,确认上线标准。


# 1.先启动redis数据库
# 添加配置文件等,启动redis,是否要端口映射,数据卷映射,主机名等定制。

[root@docker-200 ~]#
[root@docker-200 ~]#docker run -d --name prod-redis   redis
144c6a281bd6c4f7cd67fc99b8131677e8f51117e459194133e3e597395f1808
[root@docker-200 ~]#
[root@docker-200 ~]#
[root@docker-200 ~]#docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS        PORTS      NAMES
144c6a281bd6   redis     "docker-entrypoint.s…"   2 seconds ago   Up 1 second   6379/tcp   prod-redis
[root@docker-200 ~]#
[root@docker-200 ~]#


# 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.检查运行日志的映射关系



# 5.收工回家睡觉,上线完毕。


[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]#