起因是公司项目部署方式需要更改,准备将项目构建成容器进行容器化部署,但是笔者在实践期间踩了不少坑,特此发文记录,以备下次查看。
第一步:安装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上安装
至此重新运行容器,项目正常跑起来了~~~~~~~~~~~~~~~~~~~~
后续计划将数据库也进行容器化部署,革命尚未成功,同志容许努力.