docker创建镜像并打包成tar

需求:现有一个py文件,一个能联网的linux系统,一个不能联网的服务器,要把该py文件部署到不能联网的服务器上。

参考链接:docker打包python项目成镜像文件 - 知乎

Docker容器镜像打成tar包 - fs_Dong - 博客园

准备python项目

docker_test
├── Dockerfile
├── myapps
  └── taskassign.py
  └── requirements.txt

各文件内容及含义:

Dockerfile文件 没有后缀名,啥也不加

# 将官方 Python 运行时用作父镜像

FROM python:3.9

# 将工作目录设置为 /

WORKDIR ./

# 将当前目录内容复制到位于 / 中的容器中

ADD . .

# 安装 requirements.txt 中指定的任何所需软件包

RUN pip install -r requirements.txt

# 如果你觉得环境配置的时候pip库太慢,在Dockerfile文件里面加入下面语句,从阿里云下载

#RUN pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

# 定义环境变量

ENV NAME World

# 在容器启动时运行 app.py

CMD ["python", "./myapps/taskassign.py"]

#CMD ["python","./BP_hand_writing.py","worker","-l","info"]     ##faust程序worker启动命令
  • FROM python:3.7

FROM <基础镜像>。所谓定制镜像,那一定是以一个镜像为基础。FROM 指令用来指定以哪个镜像作为基础镜像生成新的镜像。这里我们将官方Python的3.7版本镜像作为基础镜像。

  • WORKDIR ./docker_demo

WORKDIR <工作目录路径> 。 使用 WORKDIR 指令可以来指定镜像中的工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录。

  • ADD . .

ADD <源路径> <目标路径>。使用ADD指令可以将构建上下文目录中的源路径目录复制镜像内的 <目标路径> 位置。第一个参数“.”代表Dockerfile所在的目录,即python项目docker_test下所有的目录(不包括docker_test自身)。第二个参数“.”代表镜像的工作目录docker_test。所以该行命令会将python项目docker_test目录下的所有文件复制到镜像的docker_test目录下。这样docker镜像中就拥有了一份docker_test python项目。

  • RUN pip install -r requirements.txt

RUN 指令是用来执行命令行命令的。这里直接安装requirements.txt 中指定的任何所需软件包。

  • CMD["python","./myapps/taskassign.py"]

CMD 指令是容器启动命令,这里是在容器启动时通过python运行 taskassign.py。值得注意的是./目录指的是当前工作目录即docker_test

requirements.txt不要放在Dockerfile同一目录下,放到myapps里

requirements.txt是Python运行环境配置,可以在你当前目录下键入:

pip freeze > requirements.txt

也可以直接自己写,例:

Numpy==1.21.2

生成Docker镜像

在dockerfile所在的目录下运行。

sudo docker build -t demo:v1 .

我们利用build指令生成镜像,-t 参数指定了最终镜像的名字为demo:v1。如果注意,会看到 docker build 命令最后有一个 . 。 . 表示当前目录,这里是指将Dockerfile所在的当前目录作为构建上下文目录。注意:不清楚构建上下文目录含义的同学可以返回编写Dockerfile小节,查看ADD . .指令中对构建上下文目录的描述。

运行Docker容器

sudo docker run demo:v1

我们用docker run运行容器 ,终端显示 hello docker 表示容器运行成功

打包镜像成tar文件

拉取镜像(如果不能连网)

docker pull 镜像名称

注意:docker pull tomcat为例子,若不指定版本,则拉取最新版本,指定版本:docker pull tomcat8.5.9

首先查看下现有要打tar包的容器

docker ps -a
# 如果不能运行 出现permission denied,在代码前加sudo,以下同
sudo docker ps -a

docker创建镜像并打包成tar_第1张图片

接下来用commit参数进行保存镜像, -a 提交人的姓名  -m “提交内容”,格式如:docker  commit  -a  -m  现有容器ID     保存后的名称:版本号

docker commit -a "tmf"   -m "tmf-web" 7740db56288a    tmf-web:v20191123

接下来查看下镜像是否出现:

docker images

docker创建镜像并打包成tar_第2张图片

 然后save参数进行打包,格式如:docker save -o  要打镜像包名称     镜像

docker save -o tmf-web20191123.tar tmf-web:v20191123

最后使用ls查看文件是否存在

[root@tbds-10-157-8-7 ~]# ls
tmf-web20191123.tar
[root@tbds-10-157-8-7 ~]# 

之后在磁盘中查找tar文件,若文件被锁定,无权限,可修改文件权限:

参考文献:Linux修改文件权限为777_wangchuang2017的博客-CSDN博客_修改权限为777

chmod 777 文件名

chmod 777 tmf-web20191122.tar

你可能感兴趣的:(docker,linux,运维)