背景
最近docker学的也差不多了。准备使用Dockerfile部署一个Python的flask项目。
前提准备
- 本次部署需要提前去阿里云控制台配置安全组规则,开放一个端口(比如
7000
)用于宿主机和docker容器
中的flask
项目的5000
端口做映射。 - 阿里云ECS防火墙也需要开放
7000
端口。 - 本次部署项目已被打成压缩包存放在AutomatedTestPlatform项目下的Docker目录下。
部署flask项目
编写Dockerfile
# FROM:必须项,必须有一个基镜像,代表当前新镜像是基于哪个镜像的
FROM python:3
# LABEL:用于为镜像添加元数据,元数以键值对的形式指定
LABEL maintainer='1912315910@qq.com'
LABEL description='flask project deploy whit dockerfile'
# WORKDIR:指定工作目录
WORKDIR /usr/src/app
# ADD:自动解压缩压缩包,并copy到工作目录
ADD ./watchlist.tar.gz ./
WORKDIR watchlist/
# RUN:RUN 指令是用来执行命令行命令的
RUN echo 'SECRET_KEY=88da9b29d97e4d33885b59f88600982c\nDATABASE_FILE=data-prod.db' >> ./.env \
&& pip install -i https://pypi.doubanio.com/simple -r requirements.txt \
&& flask initdb
# VOLUME:定义容器数据卷
VOLUME /usr/src/app/watchlist
# EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。
EXPOSE 5000
# CMD:容器启动命令
CMD [ "uwsgi", "--socket", "0.0.0.0:5000", "--protocol=http", "-p", "3", "-w", "watchlist:app"]
# 在当前Docker目录下通过此Dockerfile构建image:docker build -f flask_project_deploy_with_Dockerfile -t watchlist_app .
# 以前台形式启动容器:docker run --name watchlist_app_containter -d -p 7000:5000 watchlist_app
# 查看容器启动服务生成的所有日志:docker logs 已启动容器的ID
# 实时查看容器启动服务的日志(-f:实时查看日志, -t:显示时间戳):docker logs -ft 已启动容器的ID
使用git将项目clone至阿里云ECS下
git clone https://github.com/passerby223/AutomatedTestPlatform.git
使用指定的Dockerfile构建docker镜像
# 进入Docker目录
cd AutomatedTestPlatform/Docker/
# 开始构建docker镜像
docker build -f flask_project_deploy_with_Dockerfile -t watchlist_app .
以前台形式启动docker容器
docker run --name watchlist_app_containter -d -p 7000:5000 watchlist_app
查看docker容器是否启动且正常运行
# docker ps 展示当前正在运行的docker容器
[root@aliyun Docker]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2c8fd60b1efb watchlist_app "uwsgi --socket 0.0.…" 4 seconds ago Up 3 seconds 0.0.0.0:7000->5000/tcp watchlist_app_containter
查看docker容器中启动的服务的所有日志
docker logs 已启动容器的ID
Q.E.D.