Docker如何使用Python?Centos上Docker化Jupyter资源异常及进程问询
日常用Docker跑Python程序主要有几种常见方式,我给你捋清楚:
直接用官方镜像快速运行脚本
官方维护了全版本的Python镜像,直接拉取就能用。比如你本地有个test.py脚本,只需两步:- 拉取镜像:
docker pull python:3.11(选你需要的版本) - 挂载本地目录并运行脚本:
docker run --rm -v $(pwd):/app python:3.11 python /app/test.py
这里--rm是容器运行完自动删除,-v把本地当前目录挂载到容器的/app目录,这样容器就能访问你的脚本了。
- 拉取镜像:
自定义Dockerfile构建专属环境
如果你的项目需要特定依赖,直接用官方镜像不够,就写个Dockerfile来构建:
举个简单的例子:# 基础镜像用Python 3.11 FROM python:3.11-slim # 设置工作目录 WORKDIR /app # 先复制依赖文件,利用Docker缓存加快构建 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 复制项目代码 COPY . . # 运行程序 CMD ["python", "main.py"]然后构建镜像:
docker build -t my-python-app .
运行容器:docker run --rm my-python-app启动交互式Python环境
要是想临时测试代码,直接启动交互式容器:docker run -it --rm python:3.11 python
进入后就和本地的Python交互环境一样用,退出后容器自动删除,很方便。
你遇到的情况挺典型的,咱们先拆解核心问题,再给解决方案:
为什么top能看到Python进程,但pgrep查不到?
Docker容器的进程是运行在独立的Linux命名空间里的,宿主机上看到的进程PID是宿主机命名空间的ID,而容器内的进程命令行在宿主机的ps/top里可能会被截断,或者进程名的显示和你预期的不一样。比如Jupyter的内核进程在宿主机上的命令行可能是python -m ipykernel_launcher -f /.../jupyter/kernel-xxx.json,如果你的pgrep -af python没匹配到,大概率是命令行被截断,或者pgrep的匹配规则没覆盖到。
你可以试试这两步确认:
- 在top里记下那个占用资源的Python进程PID,然后用
ps aux | grep <PID>看完整的命令行,就能知道是不是匹配问题。 - 直接进入容器内部查看进程:
docker exec -it <你的容器ID/名称> bash,然后在容器里用pgrep -af python,肯定能看到所有Jupyter相关的Python实例——毕竟并行任务的子进程都是在容器内部fork出来的。
shm-size参数和资源占用的关系
你设置的shm-size是给容器的共享内存分区/dev/shm扩容的,Jupyter用multiprocessing这类并行库时确实会用到共享内存,但这个参数本身不会导致进程不可见,也不会直接引发资源占用过高,只是避免共享内存不足导致任务报错。
解决服务器运行缓慢的方案
给容器设置资源限制
启动容器时直接加上CPU和内存限制,避免单个容器把宿主机资源吃光:docker run --cpus 2 --memory 4g --shm-size 4g -p 8888:8888 jupyter/notebook这里
--cpus 2限制容器最多用2个CPU核心,--memory 4g限制最多用4G内存,根据你的服务器配置调整就行。排查容器内的具体任务
进入容器后用top或者htop看哪个Python进程占用资源最高,找到对应的Jupyter内核(可以看命令行里的kernel ID),然后在Jupyter界面里终止那个占用资源的任务。用Docker自带的工具监控资源
不用依赖宿主机的top,直接用docker stats <容器ID/名称>就能实时查看容器的CPU、内存、磁盘IO使用情况,数据更准确,也不用管命名空间的问题。
内容的提问来源于stack exchange,提问作者0xmax

