目录
摘要:
1,编写Dockerfile制作镜像
2,使用镜像创建容器
3,交互式运行容器/镜像修改
3.1 编辑
3.2保存
4,将镜像上传至DockerHub
5,从DockerHub拉取镜像
摘要:
本文仅涉及docker的基础使用。主要介绍如何在docker容器内运行python程序,以及一些相关问题及解决方法,例如:如何让容器启动后自动运行程序?如何二次修改镜像,如何进行文件挂载?如何将镜像上传至dockerhub?......
本文涉及到与DockerHub/DockerDesktop相关的一些操作需要搭梯子。。。
1,编写Dockerfile制作镜像
为了在docker容器中运行python程序,首先要编写Dockerfile.txt文件,并以此来制作镜像。一般的我们将Dockerfile文件放置在python项目根目录下,如下图所示:
一个简单的Dockerfile文件内容是这样的:
FROM python:3.7-slim
WORKDIR /work
COPY . /work
RUN pip install --no-cache-dir -r requirements.txt
# 如果不能自动运行请尝试加上:RUN chmod +x main.py
CMD ["python", "main.py"]
第一行表示使用python:3.7-slim为基础镜像(可以在dockerhub中找到,dockerhub是一个存放镜像的云仓库,类似于github)。
第二行表示在docker容器根目录下创建一个名为work的工作目录。
第三行表示将本机当前目录下的内容复制到容器工作目录。
第四行使得创建容器时自动安装项目依赖,本例中我们安装numpy。
第五行使得容器启动后自动运行main.py。另外如果加了这句指令仍不能自动运行,请尝试加上我注释的代码RUN chmod +x main.py授予权限。
编写好Dockerfile后开始制作镜像。首先运行DockerDesktop程序(请事先安装),之后在终端打开项目文件。
可以看到python项目内容以及我们编写的Dockerfile正在此目录内。使用如下指令构建镜像:
docker build -t <镜像名称> . -f Dockerfile.txt
可以使用docker images指令查看存在镜像的信息,可以看到我们新创建的镜像
2,使用镜像创建容器
如果需要进行数据卷挂载,需在这里进行。通俗的讲,数据卷挂载就是将容器中的一个文件(夹)和本机中的一个文件(夹)关联起来。例如容器中有一个文件夹A,本机中有一个文件夹B。那么B中内容同步在A中,容器内可见;容器中对A文件夹的内容进行修改也会同步在B文件夹,在本机可见。我们以挂载两个文件夹(input,output)分别用作程序输入输出为例。
使用如下指令构建容器(方括号指令可选)
docker run [--rm] [--name <容器名称>] [-v <本机文件夹路径>:<容器文件夹路径>] <镜像名称>
--rm 使得容器为一次性容器,程序运行结束后容器退出并销毁。如果需要容器后仍存在,请删除。
--name <容器名称> 是给容器命名,不添加系统会自动生成名称。
-v 进行数据卷挂载
当然还有很多其他的参数可选,如有需要请查阅官方文档。
容器启动后自动运行main.py,相应的本机挂载的文件夹中出现输出结果。
#main.py内容
import os
import numpy as np
print('hello docker')
print(np.zeros((3,3)))
files=os.listdir('/input')
with open('/output/temp.txt','w',encoding='utf-8') as f:
for i in files:
f.writelines([i+'\n'])
可以看到容器启动后确实自动运行了main.py脚本。由于使用了--rm,所以程序运行结束后容器退出并销毁!
3,交互式运行容器/镜像修改
如果需要修改一个已有镜像,需要用该镜像创建一个容器并在该容器中进行修改,最后将该容器保存为一个新镜像。
3.1 编辑
用如下指令交互式启动容器(启动容器运行bash终端):
docker run -it <镜像名称> /bin/bash
注意,这里一定不能使用--rm,因为我们需要使用该容器创建新镜像。
启动容器并进入bash终端后的过程就像是操作Linux命令行(docker容器就像是丐版Linux)。初始位于我们创建的工作目录下。
可以退到根目录看到整个文件系统全貌,其中就有我们创建的work工作目录。
如果需要查看/修改某一文件我们需要借助nano工具,用如下指令下载(也可使用apt-get):
apt update #更新软件源
apt install nano #安装
例如我想要查看main.py,那么进入所在目录后使用nano main.py即可。
在如上界面可进行文件内容的编辑。
在容器中可以使用Linux指令进行各种操作,包括下载其他三方包,编辑文件(如上)等。
哦对了,有时可能需要上传新文件(夹)至容器,这需要在容器外操作。先使用exit退出容器,然后使用如下指令复制文件(夹)到容器内。
docker cp <需上传的文件本机路径> <容器ID/容器名>:<文件上传位置(容器中路径)>
哦,补充一下,这里的路径格式和前面的不太一样,前面是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并创建镜像)。
FROM docker_test
CMD ["python", "main.py"]
docker build -t <新镜像名> . -f <Dockerfile.txt本机地址>
4,将镜像上传至DockerHub
首先要在DockerHub创建一个仓库:
之后使用如下指令上传镜像,请确保你的DockerDesktop处于登录状态:
docker tag <待上传镜像名> <DockerHub仓库名>:<tag版本名>
docker push <DockerHub仓库名>:<tag版本名>
5,从DockerHub拉取镜像
使用如下指令拉取镜像:
docker pull <DockerHub仓库名>:<tag版本名>
可以按此方法拉取DockerHub上公开的其他镜像进行使用。
Docker功能非常丰富,还有很多高级用法,本文只介绍了最最最基础的一部分,更深入的学习请参考官方文档。
最后啰嗦一嘴,小心你的C盘,哈哈哈。。。文章来源:https://www.toymoban.com/news/detail-715325.html
文章来源地址https://www.toymoban.com/news/detail-715325.html
到了这里,关于小白入门:如何在docker中运行python程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!