1,python程序准备
在linux主机的/tmp/pythontest
路径下创建一个test.py
程序文件,
程序内容很简单
就是一句打印
print('hello world, docker')
2,再准备一个Dockerfile文件
这个Dockerfile也是放在主机linux中的/tmp/pythontest
路径下,文件名就叫做dockerfile,
Dockerfile文件内容具体长这样
FROM python:3.8
WORKDIR /app
COPY test.py /app/
CMD ["python", "test.py"]
- 解释:
FROM python:3.8
:指定使用 Python 3.8 作为基础镜像。
WORKDIR /app
:设置容器工作目录为 /app,且这个路径是容器内部的,不是外部主机linux上的。
COPY test.py /app/
:将你的 Python 程序文件(在当前目录下)复制到容器的 /app 目录中。
CMD ["python", "test.py"]
:指定容器启动时执行的命令,即运行 Python 程序。
在同一个目录下,将上述 Python 程序保存为 your_program.py。
注意:
Dockerfile文件没有后缀,名字要含有“dockerfile”字样,你取名为别的会报错
命令约定全部使用大写,如RUN,ADD,FROM
第一条命令必需是FROM,作用是指定在哪个基础镜像上创建镜像
3,制作镜像
还是在这个/tmp/pythontest
路径中执行这条命令,因为无论你选择将 Dockerfile 放在哪里,确保在构建 Docker 镜像时,从包含 Dockerfile 文件的目录进行操作
docker build -t testimage .
在/tmp/pythontest
该目录中构建一个名叫testimage
的Docker 镜像。
- 还有一点需要注意的是,这条命令后面一定要加一个空格和一个点,不然会报错。这个点就是指当前Dockerfile 文件所在目录,或者你也可以指定Dockerfile 的绝对路径
这是正在制作镜像的过程中,时间还挺久的,想不到就这么一句python程序也要制作这么久。。。。
4 查看制作好的镜像
docker images
发现本地镜像库里面已经有了一个testimage的镜像了。
- 有一个疑问我没搞明白,为什么就这么一句python语句,制作出来的镜像这么大???996M,真离谱啊,是不是它直接把pyhon3.8这个镜像下载下来,然后再加上一句我的那句test.py????
解释
制作出来的 Docker 镜像大小不仅仅取决于 Python 程序的大小,还可能受到以下因素的影响:
- 基础镜像:你使用的基础镜像可能本身就比较大。
- 依赖库:即使你的 Python 程序只有一句,但是可能依赖了一些较大的库。
- 缓存:构建过程中可能会产生一些缓存文件。
- 中间文件:构建过程中可能会创建一些中间文件。
为了减小 Docker 镜像的大小,你可以尝试以下方法:
- 选择较小的基础镜像。
- 清理不必要的依赖库。
- 定期清理构建缓存。
- 优化 Dockerfile,删除不必要的步骤。
5,运行这个镜像,
那就要启动一个容器出来,在这个容器中来运行这个testimage
镜像
docker run -it --name test_container testimage
-it
:表示以交互模式运行容器。
--name test_container
:为容器指定一个名称,就叫test_container
。
testimage
:是你制作的镜像的名称。
执行完后,就立马输出了python程序的结果了。
因为我这个程序特别简单,执行完一次就结束了,所以执行docker ps
命令(显示在运行中的容器),发现是没有test_container
的。
所以执行docker ps -a
命令(显示本机器中所有的容器),发现是test_container
的。
6 ,思考
我想,如果我这python程序写成一个for无限循环,那这个容器就会一直运行了把。
或者这个python程序写成一个真实的APP服务程序,那也一样的,那这个容器就会一直运行了把。
- 然后另外就是,这里可以想到,假如我用java写了一个交友APP的服务程序,如果在传统条件下,我会把它放在一台物理机中去运行,且这台物理机的相关环境也要设置成符合这个交友APP能够正常运行的环境,然后让用户去访问这台机器。
- 如果这时候我还想做一个在线看视频app的服务程序,也放在这台物理机中的话,就会出现问题的,因为交友APP和刷视频app运行环境肯定不会100%一模一样,那就无法兼顾这两个APP了。
- 那我又要去买第二台物理机,用来运行这个刷视频APP。
- 但是,这样就很亏了呀,一台物理机就运行一个服务程序,太浪费了。
- 以前的做法是,尽量删减物理机的硬件成本,比如CPU换一般的,硬盘就挂个10块以下,不要太多不然很浪费,内核也就搞个够用就行。
- 你要是能批量买很多服务器,那服务器厂家是愿意为你自定义配置的,但是如果你就买那么几台子,服务器厂家才懒得鸟你呢。
- 人家生产服务器都是按照统一规格批量生产的,你爱买不买,你物理机使用率底下关我服务器生产厂家鸟事??
- 所以这时候docker就出来了。
- 在这篇文章中,我对这个
print(’hello world, docker‘)
简单的python程序,利用python:3.8
这个基础镜像,构建了一个专门来运行print(’hello world, docker‘)
的镜像和容器。 - 换句话说,我还想为我用java写的交友程序,利用java相关的一些基础镜像,构建一个专门来运行java写的交友程序的镜像和容器。
- 以此类推,这样我就只需要一台物理机就够啦。
- 一台物理机上面运行多个docker就能满足我的所有需求了,还不浪费。
- 听懂掌声