起因是公司项目部署方式需要更改,准备将项目构建成容器进行容器化部署,但是笔者在实践期间踩了不少坑,特此发文记录,以备下次查看。

第一步:安装docker

1.linux安装docker

centos7安装Docker详细步骤(无坑版教程) - 腾讯云开发者社区-腾讯云 (tencent.com)

windows10+VMWare+Centos7下docker的安装,验证与运行(超详细且持续更新) -配置啦-研发运维人员必备网站 (config.net.cn)

2.windows安装docker

(1)下载安装docker desktop

这里有坑:安装docker desktop之后必须将Hyper-V打开,否则会报错,但是打开Hyper-V之后Vm虚拟机又没法正常使用

同时需要勾选:控制面板-程序和功能-启用或关闭windows功能-勾选Hyper-V以及适用于Linux的Windows子系统

这样才能正常打开docker desktop,正常打开之后可以使用docker --version查看是否安装正常

除此之外还需要修改镜像源

至此安装docker结束

第二步:给项目配置Dockerfile

这里项目使用的flask作为后端,使用tornado作为wsgi服务器启动程序

from tornado.httpserver import HTTPServer
from tornado.wsgi import WSGIContainer
from manage import app
from tornado.ioloop import IOLoop

s = HTTPServer(WSGIContainer(app))
s.listen(5000)  # 监听 5000 端口
IOLoop.current().start()

Dockerfile

FROM python:3
MAINTAINER tinkerbell
COPY requirements.txt ./
EXPOSE 5000
RUN pip install -r requirements.txt -i https://pypi.douban.com/simple
COPY . .
ENV LANG C.UTF-8
CMD ["python", "./server.py"]

简单解释一下参数:
FROM # 指明我们创建的镜像,所依赖的基础镜像,我们这边是python3

MAINTAINER # 维护者信息

COPY # 将宿主机的文件cp到创建的镜像当前路径下

EXPOSE ## 仅仅只是声明端口
帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口

RUN # 你需要在创建镜像之前,需要执行的命令

CMD # 创建容器后执行的第一个命令,一般是启动命令
--------------------------------------------------------------------------------------------------

这里还需要将项目的依赖导出来(需要先安装pipreqs),会在项目根目录下生成一个requirements.txt

pipreqs ./ --encoding=utf8

至此项目方面的准备已完成

第三步:构建镜像并运行

在项目路径下执行,构建镜像

docker build -t theflask:v1 .

查看本地镜像

docker images # 查看镜像

运行

docker run -it --rm -p 5000:5000 flask:v1
# --rm 表示每次退出容器自动删除

除此之外还可以将镜像推送到个人docker hub仓库

需要取注册账号,网址:Docker Hub

1 docker login  # 登录
2 docker tag theflask:v1 tinkerbell1/theflask:v1  # 镜像名 账户名/镜像名
3 docker push tinkerbell1/theflask:v1  # 推送到远程仓库
4 docker pull tinkerbell/theflask:v1  # 从远程仓库拉取镜像
### docker pull [username]/[repository]:[tag]

然后这里就出问题了,无法连接数据库,是因为在项目里笔者数据库配置的还是localhost,所以需要更改为宿主机数据库IP(这里构建的容器是可以和宿主机通信的,所以可以直接访问到宿主机数据可)

ps:这里是有一个坑的:在连接数据库之前是需要将宿主机的数据库设置允许远程访问的,笔者使用的数据库为mysql5.7

以上是基于windows,如果是在linux上构建容器并运行是需要在linux服务器上安装数据库,例如MYSQL的,这里笔者也尝试过,在centos7上安装

至此重新运行容器,项目正常跑起来了~~~~~~~~~~~~~~~~~~~~

后续计划将数据库也进行容器化部署,革命尚未成功,同志容许努力.