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