flask后台部署套路(一)
Docker 服务的安装配置
若服务器中已经有 docker 容器了请忽略此处配置讲解(通过简单 docker 命令能否被识别),服务器中 docker 若不存再请看如下:
-
我们决定采用 yum 安装,先更新配置 yum 源头(此处非必须,看情况!)
一般研发在服务器中若安装好了 docker,一般此步操作不需要执行。
用 yum 安装 docker 可以,或者 wget 安装 docker 后再解压也行
下面操作主要是更新 yum 为了安装新版的 docker,而不是很老旧版本的 docker,然后对 yum 库的配置
# yum 更新,过程中一切都是 [yes],这一步极其慢 yum -y update # yum 安装几个必要的包,其中含有设 yum 库的命令 yum install -y yum-utils device-mapper-persistent-data lvm2 # 设置阿里仓库 yum yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
yum 安装 docker-ce,因为老旧版本的才叫 docker 或 docker-engine
# 查看有哪些 docker-ce yum list docker-ce --showduplicates | sort -r # 我选择了 18 年末的一个版本的 docker 安装 yum install docker-ce-18.03.1.ce # 启动 docker 服务 systemctl start docker # 将其加入开机启动 systemctl enable docker # 想看 docker 服务是不是真起来了,通过 ps 命令,要是有列名即使没有容器也不要紧,说明已经起来了 docker ps
-
docker 拉取镜像替换称国内镜像源,使下载镜像速度提升
# 添加镜像源地址 vi /etc/docker/daemon.json
json 内容如下
{ "registry-mirrors" : [ "http://registry.docker-cn.com", "http://docker.mirrors.ustc.edu.cn", "http://hub-mirror.c.163.com" ], "insecure-registries" : [ "registry.docker-cn.com", "docker.mirrors.ustc.edu.cn" ], "debug" : true, "experimental" : true }
-
重启 docker 服务
# 进程 systemctl daemon-reload # docker 服务重启 systemctl restart docker
-
docker弄好了之后需要拉取镜像
docker pull python:alpine3.7
等到镜像拉取完成之后可以使用docker images
来查看
ps: 以下为实验部分为了弄清原理,简单的用了一个临时的容器
docker run -it --rm python:alpine3.7 sh
使用了以上的命令之后,进入到了容器中。
先设置好PIP国内的镜像源
mkdir $HOME/.pip/
# 利用tee命令把下面的配置写入daemon.json
tee $HOME/.pip/pip.conf<<-'EOF'
[global]
trusted-host=mirrors.aliyun.com
index-url=https://mirrors.aliyun.com/pypi/simple
EOF
然后是设置好alpine的源,这里的意思等同是在linux服务器里面,使用yum指令拉取东西的时候会很慢,所以会对yum的镜像源做一个配置,同理也需要对alpine容器内的包管理器做一个镜像源的设置,alpine容器内部的包管理器是使用的apk,以下对apk镜像源设置做一个讲解
注意 : 以下的指令都是作用在容器内的
- 查看容器内部本身的镜像源
cat /etc/apk/repositories
- 设置阿里云的镜像源
echo http://mirrors.ustc.edu.cn/alpine/v3.7/main > /etc/apk/repositories && \
echo http://mirrors.ustc.edu.cn/alpine/v3.7/community >> /etc/apk/repositories
3.同上文的设置yum的镜像源一样,改好配置之后需要重新启动
apk update && apk upgrade
- 在容器内安装pythonFlask的镜像库
python -m pip install -U flask
执行完之后这个时候可以来试一试使用flask run
来执行一下,这个时候会报一个FLASK_APP未设置的错,这个值是一个环境变量,需要我们提前设置好之后才能用flask run
的指令来运行
以下是实验部分
5. 在容器内创建一个test.py文件,并且写入
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "hello world"
@app.route("/abc")
def abc():
return "hello world"
if __name__ == "__main__":
app.run()
创建完了之后如果我们直接使用python test.py就直接启动了这个
6. Xshell另外开一个窗口,进入到这个实验容器
docker ps
docker exec -it 容器id sh
- 用管道命令查询
ps -ef | grep python
注意 因为你上文是采用python加执行文件的形式启动的项目,所以这里就筛选python就可以了。
查询完之后可以看到有一个进程以python的形式运行。
8. 使用curl指令来测试接口
curl: localhost:5000
可能curl工具没有使用apk add curl
命令来安装。
8. 再说说如何用flask run的指令来运行
export FLASK_APP=/test.py
然后就可以直接运行了。
可以重复执行6-7步实验
- 以上部分就是实验完了这个容器,这时候我们做一个镜像,拥有这个容器内的全部功能,需要提前写好配置文件,直接就能生成这个镜像。
- 在
~
目录下生成一个名字为flask的空文件夹 - 写一个pip的配置文件
pip.conf
内容为
[global]
trusted-host=mirrors.aliyun.com
index-url=https://mirrors.aliyun.com/pypi/simple
- 创建一个
Dockerfile
文件,内容为
FROM python:alpine3.7
RUN echo http://mirrors.ustc.edu.cn/alpine/v3.7/main > /etc/apk/repositories && \
echo http://mirrors.ustc.edu.cn/alpine/v3.7/community >> /etc/apk/repositories
RUN apk update && apk upgrade
RUN mkdir /app
RUN mkdir $HOME/.pip/
COPY ./pip.conf $HOME/.pip/
RUN pip install flask
EXPOSE 5000
CMD ["flask","run"]
简单的介绍以下上文的作用
以python:alpine3.7为基础,叠加下面的配置,2-3行,配置镜像源,4行重启加载镜像源,5行在进行内部创建app文件夹,6行 在用户目录下创建一个.pip文件夹,7行copy 当前linux机器下的pip.conf文件到用户目录下的.pip文件夹里面去,8行在镜像内部使用pip指令安装flask,9行 暴露容器内部的5000端口方便后续的端口映射,10行 代表启动这个容器之后,不加任何命令他会主动去运行flask run
这条命令
4. 以上的配置文件写好之后,运行以下指令开始构建镜像。
docker build -t myflask:1.0 .
最后这个.
代表他会去当前目录下的Dockerfile
去编译
5. 到这一步就构建出来了一个和上文实验部分功能一样的镜像了,唯一的差别在于,此时的镜像中是没有test.py的文件的,这是后生成容器的时候把linux宿主机上的文件映射过去。
- 上文构建了一个基础的镜像,这个时候就需要做的是生成容器
- 在
~
目录下创建一个myapp的文件夹 - 进入到文件夹内部,创建一个test.py的文件,内容如下
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "hello world"
@app.route("/abc")
def abc():
return "hello world"
if __name__ == "__main__":
app.run()
- 开始运行,指令如下
docker run --name myapp -d -p 8080:5000 -v /root/myapp:/app -e FLASK_APP=/app/test.py myflask:1.0
对这个指令做一个解释,–nam myapp 这里是给容器取了这么一个名字, -d 容器在后台运行, -p 8080:5000 这里是端口映射,把linux机器上的8080端口映射到容器内的5000端口上,-v 路径映射,把linux下的/root/myapp路径,这个路径就是创建test.py的路径,映射到容器的/app下,-e FLASK_APP=/app/test.py,设置环境变量,最后是镜像的名称加tag
这里可以用docker logs myapp
来查看日志
4. linux机器内部访问,curl localhost:8080 发现访问不了,是因为test.py没有设置端口
5. 把原来的容器停止并且删除
docker stop myapp && docker rm myapp
- 重新启动
docker run --name myapp -d -p 8080:5000 -v /root/myapp:/app -e FLASK_APP=/app/test.py myflask:1.0 flask run -h 0.0.0.0
注意这里容器内部还是使用的flask run的方法来运行的,但是如果在启动命令后加了flask run -h 0.0.0.0
会替代上文的Dockerfile里面配置文件最后那句CMD ["flask","run"]
8. 这样启动之后直接就可以在linux宿主机内使用
curl localhost:8080
来进行访问了