背景
不知不觉中,我们已经完成了所有的编程工作。接下来,我们需要把 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"