当前位置: 首页 > news >正文

Linux下docker运行python

前言

本机开发环境众多,python版本都好多个,虽然可以通过conda管理多个虚拟环境,但还是不能像容器那样进行进程间的隔离。于是打算试下docker下运行python,而且生产环境很多时候也是用容器来跑应用,环境统一、方便扩容。

云服务器选择

搞个低配版云服务器,做点开发测试啥的非常方便,主要是云服务器支持外网访问。

但是这里还涉及到一个操作系统的选择,windows系统可以傻瓜式操作,但是安装完系统十几个G的磁盘空间就没了,windows系统确实太大了,那还是云服务器厂商给系统瘦身了,自己电脑安装下来都大几十G,根本hold不住。当然因为windows自带操作界面,系统大也是必然。

Linux系统在这方面就很有优势了,不过就是需要命令行操作。我直接选了带docker的镜像,磁盘才占用了3-5个G。而且Linux系统本身对CPU、内存的消耗也更少,这样可以把更多的性能留给应用程序。

于是,我选择了Linux。接下来就是在Linux的世界里探索一番了

实操过程

环境说明

目前我已经有ubuntu+docker的镜像(这个是在初始化云服务器的时候就可以选择对应的镜像,当然初始只有ubuntu系统,手动安装docker也还好)

大体思路

1、先拉取一个python基础镜像

2、然后通过dockerfile构建镜像,安装相关包,同时设置工作目录到宿主机(方便运行程序,而且容器重启了文件也不会丢)

3、运行py文件

docker镜像构建

1、首先拉取一个python3.10的基础镜像(3.10兼容性比较好,不高不低刚刚好)

docker pull python:3.10

2、编写或生成requirements.txt

在需要部署到docker容器的python程序目录cmd执行,自动生成requirements.txt

pip freeze > requirements.txt

不过这样生成出来好多都是python已经安装的包,so也可以自己手动维护requirements.txt 

3、编写dockerfile

Linux远程后默认路径是home/ubuntu(注:ubuntu即登录用户)

在home/ubuntu下新建app目录,后续dockerfile、requirements.txt就都放这里

dockerfile内容如下

FROM python:3.10
WORKDIR /app
ADD requirements.txt /app
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
CMD ["python","start.py"]

dockerfile内容解释:

From python:3.10:python:3.10就是我上面pull的镜像名

WORKDIR /app:设置容器的工作目录,注:这里/app为容器目录

ADD requirements.txt /app:把requirements.txt添加到/app下,后面pip install要用到

RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple:运行pip install安装需要的包,-i后面的地址,是使用清华大学的pip源来安装,这样下载速度会很快

CMD ["python","start.py"]:相当于运行:python start.py,注意CMD和方括号之间要有空格

4、相关文件准备

如上CMD命令可以看到有个start.py,这个就是我要测试运行的py程序,里边是运行一个flask程序,显示hello world。所以我需要把start.py放到Linux下某个路径,docker run的时候,将容器的/app目录映射到Linux下路径即可

5、build构建新的python镜像

docker build -t python3.10:01 .

6、运行测试镜像

docker run -id --name=python3.10-test01 python3.10:01 /bin/sh

7、进入测试容器执行命令

docker exec -it -u 0 python3.10-test01  /bin/sh

接下来就可以直接在容器内执行命令,比如pip list,看看是不是已经pip install成功了,或者手动python xx.py去测试

正式运行docker容器

如上容器测试没问题,那么这个镜像应该就问题不大了

docker run -id -v /home/ubuntu/app/py_test_01:/app -p 1080:5000 --name=python3.10-test02 python3.10:01

这里,-v参数,指定了容器目录/app到Linux目录的映射,这样在上面CMD 命令执行python start.py就可以在/home/ubuntu/app/py_test_01下找到start.py文件了(因此上面也是要把start.py文件放这个目录)

-p参数,指定了Linux宿主机、容器的端口映射,在这里Linux宿主机通过1080即可访问docker容器部署的python web程序

docker logs python3.10-test02

通过docker logs 容器id或name,即可查看日志信息,看看有没报错啥的 

没啥问题的话,就可以成功访问到hello world

一点补充

其实第一个容器没啥用,可以删除掉,主要用来做测试了,实际用的是第二个容器(容器要起作用,就得开放端口)

再一个云服务器资源宝贵,平时看不需要的镜像就可以删除

遇到的问题

1、无法pull镜像

需要将当前用户添加到docker用户组,然后重启docker,重新远程

2、如何方便拷贝文件

我使用了WinSCP,可以图形化界面操作,有点类似ftp的操作,非常方便

相关文章:

  • uniApp使用uview对vuex的二次封装实现全局变量
  • 【Spring Boot 源码学习】ConditionEvaluationReport 日志记录上下文初始化器
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • 【ZZULIOJ】1030: 判断直角三角形(Java)
  • easyexcel-获取文件资源和导入导出excel
  • Unity进阶之路(2)UI Toolkit
  • vue项目引入微信sdk: npm install weixin-js-sdk --save报错
  • v-text 和v-html
  • CSS属性排序的插件和包
  • redis之主从复制、哨兵模式
  • Makefile:条件判断和循环的使用(十)
  • Ubuntu Desktop 安装有道词典
  • 鸿蒙手机cordova-plugin-camera不能拍照和图片不显示问题
  • 蓝桥杯备考
  • Python 正则表达式(re)
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • Consul Config 使用Git做版本控制的实现
  • JWT究竟是什么呢?
  • mysql 5.6 原生Online DDL解析
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • OSS Web直传 (文件图片)
  • 关于springcloud Gateway中的限流
  • 模型微调
  • 自动记录MySQL慢查询快照脚本
  • Python 之网络式编程
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • 组复制官方翻译九、Group Replication Technical Details
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​卜东波研究员:高观点下的少儿计算思维
  • #QT(智能家居界面-界面切换)
  • (¥1011)-(一千零一拾一元整)输出
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (JS基础)String 类型
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (十)T检验-第一部分
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)【Hibernate总结系列】使用举例
  • (转)母版页和相对路径
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .NET CLR基本术语
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .net和jar包windows服务部署
  • .net开发时的诡异问题,button的onclick事件无效
  • .NET中 MVC 工厂模式浅析
  • ??在JSP中,java和JavaScript如何交互?
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解