背景

不知不觉中,我们已经完成了所有的编程工作。接下来,我们需要把 Python 程序 做 容器化 (Docker)部署。

思考

考虑到项目的实际情况,“持久化天气”的功能将会是一个独立的功能模块发布(用户可选)。因此,个人觉得没有必要放到项目总体的 docker-compose 里面去统一处理, 那么我们可以将它作为一个单独的 docker container 来部署:通过 docker run 的方式运行 docker container; 并启动 python 程序。

Python 程序 容器化

我们将通过2中不同的方式来部署我们的python程序。

我们首先需要了解 docker run 命令, 更为详细的说明请参考官网:https://docs.docker.com/engine/reference/run/

$ docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

关于OPTION部分,我们要做到以下几个方面:

1. 容器的运行方式:前台进程或后台进程

为了方便演示,我选择了前台方式运行,这样能直接看到程序输出的log. (也可以 以后台形式运行 -d, 然后运行其他docker命令来查看log信息)

# foreground
docker run -it # background
docker run -itd

2. 挂载点

根据业务需要,我们在读取FTP上面的每个文件后,需要在本地做一个备份。然而,docker容器的大小默认为:10GB。 考虑到日后的维护(文件过多导致container size 超限),我们通过建立 volumn, 将文件保存在本地硬盘上,以防止容器的大小超过限制。

# docker run -it --name myweather -v /home/ct/WeatherDocker:/usr/src/app

3. 启动python程序: CMD or ENTRYPOINT

3.1 以 CMD 的方式启动 python 程序

# docker run -it --name myweather -v /home/ct/WeatherDocker:/usr/src/app algtest:v1. /bin/bash -c "python /usr/src/app/MainEntry.py current"

3.2 以 ENTRYPOINT 的方式启动 python 程序

docker run -it --name myweather -v /home/ct/WeatherDocker:/usr/src/app --entrypoint /bin/bash  algtest:v1. 
-c "python /usr/src/app/MainEntry.py query 201807010000 201808010000"

请注意: 这里 ENTRYPOINT 只是指定的是运行python的terminal (/bin/bash), python 的参数则是由 CMD 传递的!! docker官方的说明如下:

The ENTRYPOINT of an image is similar to a COMMAND because it specifies what executable to run when the container starts, but it is (purposely) more difficult to override. The ENTRYPOINT gives a container its default nature or behavior, so that when you set anENTRYPOINT you can run the container as if it were that binary, complete with default options, and you can pass in more options via the COMMAND.

如上所示,我们在 container 里面启动了查询数据的python程序,结果如下:

总结

补充一个地方:以 docker container 启动 python 程序时,链接数据库的IP和Port 不再是本机IP(127.0.0.1)和 默认端口(3306),应该是 docker 网络中 的 IP与 Port 设置.。。。 文字描述有点拗口,请大家看截图

我们可以看到,我这里的 containers, 都在docker 默认的网络 bridge中。 test- MySQL 是 MySQL数据库;myweather 是 承载 python 程序的 容器。

那么,我们要链接MySQL数据库是的IP和Port 应该是什么呢?

从上图中,我们其实已经可以看到,docker container之间的通信在默认情况下走的是bridge网络,因此,MySQL数据库的IP应该是172.17.0.2 或者 “本机真实IP”,端口为3307(LZ自己启动MySQL数据库是时修改的)

~~OK,感谢大家的收看,欢迎积极留言讨论!!

关于容器与宿主局的时间同步

由于在制作 docker image 的时候没有注意时区,所以到时 docker container 里面的时区是默认值(UTC)。

解决办法是在 docker run 的时候, 设置 --env TZ=Asia/Shanghai

# docker run -it --name myweather --env TZ=Asia/Shanghai -v /home/ct/Siemens/WeatherDocker:/usr/src/app algtest:v1. /bin/bash -c "python /usr/src/app/MainEntry.py current"

python + docker, 实现天气数据 从FTP获取以及持久化(五)-- 利用 Docker 容器化 Python 程序的更多相关文章

  1. python + docker, 实现天气数据 从FTP获取以及持久化(一)

    前情提要 最近项目需要天气数据(预报和历史数据)来作为算法程序的输入. 项目的甲方已经购买了天气数据, 依照他们的约定,天气数据的供应商会将数据以"文本" (.TXT)的方式发到F ...

  2. python + docker, 实现天气数据 从FTP获取以及持久化(二)-- python操作MySQL数据库

    前言 在这一节中,我们主要介绍如何使用python操作MySQL数据库. 准备 MySQL数据库使用的是上一节中的docker容器 “test-mysql”. Python 操作 MySQL 我们使用 ...

  3. python + docker, 实现天气数据 从FTP获取以及持久化(四)-- 数据准备

    前情提要 在之前的文章里,我们已经掌握从FTP上面下载天气数据然后插入到数据库中. 但是如何将我们已有的数据放到生产环境中呢? 思考 首先,我们先简单的理一理现在的情况. 目前: FTP上面已有半个月 ...

  4. python + docker, 实现天气数据 从FTP获取以及持久化(三)-- python获取FTP数据

    前言 经过前面两个小节的介绍,我们已经完成了MySQL数据库的搭建和数据库操作的事宜. 在本小节中,我们需要完成的任务是:使用python从FTP服务其上面获取文本文件. 搭建测试FTP服务器 LZ的 ...

  5. 毕设之Python爬取天气数据及可视化分析

    写在前面的一些P话:(https://jq.qq.com/?_wv=1027&k=RFkfeU8j) 天气预报我们每天都会关注,我们可以根据未来的天气增减衣物.安排出行,每天的气温.风速风向. ...

  6. docker容器化python服务部署(supervisor-gunicorn-flask)

    docker容器化python服务部署(supervisor-gunicorn-flask) 本文系作者原创,转载请注明出处: https://www.cnblogs.com/further-furt ...

  7. C# 解析百度天气数据,Rss解析百度新闻以及根据IP获取所在城市

    百度天气 接口地址:http://api.map.baidu.com/telematics/v3/weather?location=上海&output=json&ak=hXWAgbsC ...

  8. 使用腾讯云无服务器云函数(SCF)分析天气数据

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:李想 无服务器云函数(SCF)是腾讯云提供的Serverless执行环境,也是国内首款FaaS(Function as a Service ...

  9. Docker最全教程——数据库容器化之持久保存数据(十一)

    上一节我们讲述了SQL Server容器化实践(注意,SQL Server现在也支持跨平台),本节将讲述如何持久保存数据,并且接下来将逐步讲解其他数据库(MySql.Redis.Mongodb等等)的 ...

随机推荐

  1. About RFC

    RFC说明 Request For Comments (RFC),是一系列以编号排定的文件,几乎所有的因特网标准都收录在RFC文件之中,如果你想成为网络方面的专家,那么RFC无疑是最重要也是最经常需要 ...

  2. C# 泛型详解---进阶编程(七)

    今天我们来学习在C#的泛型技巧,传统的课本都在讲解什么是泛型,然后列举一大堆代码示例告诉你什么是泛型,今天我们就来聊聊更加本质的东西,我为什么要用泛型?它是来解决什么问题的?底层原理是什么? 简单来说 ...

  3. PyCharm 注释

    1.1 单行注释(行注释) 语法格式: #[空格]说明性文字信息 注:可放一行代码的后面进行说明 添加快捷键:  Ctrl+/ 取消快捷键:  同上 1.2 多行注释(块注释) 语法格式: " ...

  4. Unity3D游戏-愤怒的小鸟游戏源码和教程(一)

    Unity愤怒的小鸟游戏教程 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) AngryEva游戏效果: 1 ...

  5. DoTween可视化编程用法详解

    DoTween可视化编辑 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心创新 ...

  6. zookeeper 官方文档——综述

      Zookeeper: 一个分布式应用的分布式协调服务   zookeeper 是一个分布式的,开源的协调服务框架,服务于分布式应用程序.   它暴露了一系列基础操作服务,因此,分布式应用能够基于这 ...

  7. hdu2085-2086

    hdu2085 模拟 #include<stdio.h> ][]; void fun(){ a[][]=; a[][]=; ;i<=;i++){ a[i][]=*a[i-][]+*a ...

  8. xsl -fo 了解

    XSL-FO是用于格式化XML数据的语言,全称为Extensible Stylesheet Language Formatting Objects(格式化对象的可扩展样式表语言),是W3C参考标准,现 ...

  9. NTLM 了解

    NTLM是NT LAN Manager的缩写,这也说明了协议的来源.NTLM 是 Windows NT 早期版本的标准安全协议,Windows 2000 支持 NTLM 是为了保持向后兼容.Windo ...

  10. poj 2449 Remmarguts' Date(K短路,A*算法)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013081425/article/details/26729375 http://poj.org/ ...