在docker中运行python程序

摘要:

       本文仅涉及docker的基础使用。主要介绍如何在docker容器内运行python程序,以及一些相关问题及解决方法,例如:如何让容器启动后自动运行程序?如何二次修改镜像,如何进行文件挂载?如何将镜像上传至dockerhub?......        

      本文涉及到与DockerHub/DockerDesktop相关的一些操作需要搭梯子。。。

1,编写Dockerfile制作镜像

       为了在docker容器中运行python程序,首先要编写Dockerfile.txt文件,并以此来制作镜像。一般的我们将Dockerfile文件放置在python项目根目录下,如下图所示:

在docker中运行python程序_第1张图片

一个简单的Dockerfile文件内容是这样的:

  1. FROM python:3.7-slim

  2. WORKDIR /work

  3. COPY . /work

  4. RUN pip install --no-cache-dir -r requirements.txt

  5. # 如果不能自动运行请尝试加上:RUN chmod +x main.py

  6. CMD ["python", "main.py"]

第一行表示使用python:3.7-slim为基础镜像(可以在dockerhub中找到,dockerhub是一个存放镜像的云仓库,类似于github)。

第二行表示在docker容器根目录下创建一个名为work的工作目录。

第三行表示将本机当前目录下的内容复制到容器工作目录。

第四行使得创建容器时自动安装项目依赖,本例中我们安装numpy。

                             在docker中运行python程序_第2张图片

第五行使得容器启动后自动运行main.py。另外如果加了这句指令仍不能自动运行,请尝试加上我注释的代码RUN chmod +x main.py授予权限。

       编写好Dockerfile后开始制作镜像。首先运行DockerDesktop程序(请事先安装),之后在终端打开项目文件。

在docker中运行python程序_第3张图片

 可以看到python项目内容以及我们编写的Dockerfile正在此目录内。使用如下指令构建镜像:

docker build -t <镜像名称> . -f Dockerfile.txt

在docker中运行python程序_第4张图片

可以使用docker images指令查看存在镜像的信息,可以看到我们新创建的镜像

 2,使用镜像创建容器

        如果需要进行数据卷挂载,需在这里进行。通俗的讲,数据卷挂载就是将容器中的一个文件(夹)和本机中的一个文件(夹)关联起来。例如容器中有一个文件夹A,本机中有一个文件夹B。那么B中内容同步在A中,容器内可见;容器中对A文件夹的内容进行修改也会同步在B文件夹,在本机可见。我们以挂载两个文件夹(input,output)分别用作程序输入输出为例。

使用如下指令构建容器(方括号指令可选)

docker run [--rm] [--name <容器名称>] [-v <本机文件夹路径>:<容器文件夹路径>] <镜像名称>

--rm 使得容器为一次性容器,程序运行结束后容器退出并销毁。如果需要容器后仍存在,请删除。

--name <容器名称> 是给容器命名,不添加系统会自动生成名称。

-v 进行数据卷挂载

当然还有很多其他的参数可选,如有需要请查阅官方文档。

容器启动后自动运行main.py,相应的本机挂载的文件夹中出现输出结果。

 
  
  1. #main.py内容

  2. import os

  3. import numpy as np

  4. print('hello docker')

  5. print(np.zeros((3,3)))

  6. files=os.listdir('/input')

  7. with open('/output/temp.txt','w',encoding='utf-8') as f:

  8. for i in files:

  9. f.writelines([i+'\n'])

在docker中运行python程序_第5张图片

       可以看到容器启动后确实自动运行了main.py脚本。由于使用了--rm,所以程序运行结束后容器退出并销毁!

3,交互式运行容器/镜像修改

       如果需要修改一个已有镜像,需要用该镜像创建一个容器并在该容器中进行修改,最后将该容器保存为一个新镜像。

3.1 编辑

用如下指令交互式启动容器(启动容器运行bash终端):

docker run -it <镜像名称> /bin/bash

注意,这里一定不能使用--rm,因为我们需要使用该容器创建新镜像。

       启动容器并进入bash终端后的过程就像是操作Linux命令行(docker容器就像是丐版Linux)。初始位于我们创建的工作目录下。

可以退到根目录看到整个文件系统全貌,其中就有我们创建的work工作目录。

在docker中运行python程序_第6张图片

如果需要查看/修改某一文件我们需要借助nano工具,用如下指令下载(也可使用apt-get):

 
  
  1. apt update #更新软件源

  2. apt install nano #安装

例如我想要查看main.py,那么进入所在目录后使用nano main.py即可。

在docker中运行python程序_第7张图片

在如上界面可进行文件内容的编辑。

在容器中可以使用Linux指令进行各种操作,包括下载其他三方包,编辑文件(如上)等。

       哦对了,有时可能需要上传新文件(夹)至容器,这需要在容器外操作。先使用exit退出容器,然后使用如下指令复制文件(夹)到容器内。

docker cp <需上传的文件本机路径> <容器ID/容器名>:<文件上传位置(容器中路径)>

在docker中运行python程序_第8张图片

       哦,补充一下,这里的路径格式和前面的不太一样,前面是Linux格式的,无所谓啦,直接复制文件路径粘贴即可。我之前好像是用Windows格式遇到过错才改为Linux格式,不过这次试又好了。。。

       其中容器ID或容器名可通过docker ps -a(查看所有容器)查看,或借助DockerDesktop提供的图形界面。上图中的docker start gracious_antonelli重新启动了容器,gracious_antonelli是容器名,docker exec -it gracious_antonelli交互式进入容器。

3.2保存

在容器中修改好镜像后使用exit退出容器,使用如下指令将该容器保存为一个新镜像:

docker commit <容器名> <新镜像名>

       使用新镜像启动容器发现程序不能自动运行了!这是因为前面交互式启动容器时设置成了容器启动后运行bash终端。我是这样解决的:以该镜像为基础镜像创建新镜像(编写新dockerfile并创建镜像)。

 
  
  1. FROM docker_test

  2. CMD ["python", "main.py"]

 docker build -t <新镜像名> . -f 

4,将镜像上传至DockerHub

首先要在DockerHub创建一个仓库:

在docker中运行python程序_第9张图片

 在docker中运行python程序_第10张图片

 在docker中运行python程序_第11张图片

之后使用如下指令上传镜像,请确保你的DockerDesktop处于登录状态:

 
  
  1. docker tag <待上传镜像名> :

  2. docker push :

在docker中运行python程序_第12张图片

在docker中运行python程序_第13张图片

 5,从DockerHub拉取镜像

 使用如下指令拉取镜像:

docker pull :

在docker中运行python程序_第14张图片

可以按此方法拉取DockerHub上公开的其他镜像进行使用。

       Docker功能非常丰富,还有很多高级用法,本文只介绍了最最最基础的一部分,更深入的学习请参考官方文档。

你可能感兴趣的:(docker,python,容器)