目录
一、搭建python环境的镜像
二、导出镜像
使用 docker save 命令
三、导入镜像
使用 docker load 命令
一、搭建python环境的镜像
(1)将项目依赖包导出来到requirements.txt文件中,txt文件名称可以随意写,
pip freeze > requirements.txt
(2)新建文件夹app,
在宿主机(安装docker的机子)上新建一个目录(我的目录在/app),将requirements.txt文件复制进去,requirements.txt文件内容如下:
在app目录下创建Dockerfile文件(文件名必须是Dockerfile,没有后缀),Dockerfile内容以及解释如下:
FROM python:3.9
WORKDIR /app
ADD requirements.txt /app
RUN pip install --upgrade pip
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
FROM python:3.9 # 基于这个基础镜像构建镜像
WORKDIR /app #切换换工作空间
ADD requirements.txt /app # 将python项目依赖包添加到镜像
RUN pip install --upgrade pip # 安装依赖包
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple # 安装依赖包
(3)构建Docker镜像:在项目根目录下执行以下命令构建Docker镜像---》在app目录下执行镜像构建命令,
- -t:镜像名称
- 点(.)表示Dockerfile文件所在的目录
cd app
docker build -t a4-1:5000/xxx/py39_1:py39 .
(4)构建成功后,通过下行命令就会看到一个新的镜像,
docker images
(5)创建一个python容器并查看依赖包是否安装成功,
docker run -id --name=test_env a4-1:5000/xxx/py39_1:py39 /bin/bash
进入容器,并查看我们之前安装过的python第三方库包还在不在,
docker exec -it -u 0 test_env /bin/sh
(6)如果存在没安装上的依赖包可以自行在student_env
容器中安装,
pip install 依赖包==版本 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
可以用“exit”或者“ctrl+p+q”命令,退出容器,
二、导出镜像
使用 docker save 命令
docker save 命令被用来将一个或多个镜像保存到一个 tar 归档文件中。这个命令非常适合于镜像的备份或者将镜像从一个 Docker 环境迁移到另一个 Docker 环境。
命令格式及参数解释
docker save [OPTIONS] IMAGE [IMAGE...]
- [OPTIONS] 可以包含 -o 或 --output,指定保存的文件路径。
- IMAGE [IMAGE...] 指定要保存的镜像名称及其标签。
这个命令将 a4-1:5000/xxx/py39_1:py39
镜像保存为名为 py39_1.tar
的文件。此文件包含了镜像的所有层、标签和元数据,确保了镜像信息的完整性。
docker save -o py39_1.tar a4-1:5000/xxx/py39_1:py39
通过“ls”命令,可以在当前文件夹目录下看到这个压缩包,
三、导入镜像
(1)
使用 docker load 命令
docker load 命令用于加载由 docker save 命令保存的镜像归档文件。这个命令恢复了镜像的所有层、标签和元数据。
命令格式及参数解释:
docker load [OPTIONS]
- [OPTIONS] 可以包含 -i 或 --input,指定要加载的归档文件路径。
接下来,我们将 py39_1.tar
文件传输到测试环境的服务器。在测试环境的服务器上,我们使用 docker load
命令来导入这个镜像。
docker load --input py39_1.tar
执行这个命令后,myapp:latest
镜像会被加载到测试环境的 Docker 中,保留了导出时的所有信息,包括镜像的所有层和元数据。
(2)由于我的docker里面已经有一个这个名称的镜像了,所以在导入镜像时需要重命名。
当你在 Docker 中导入一个镜像,并且在你的系统中已经存在与即将导入的镜像相同名称和标签的镜像时,你有几个选项可以处理这种情况:
- 覆盖现有镜像: 如果你不介意替换已有的镜像,可以直接使用
docker load
导入新镜像,然后让它覆盖现有的标签。需要注意的是,这样做会导致原有的镜像被新的镜像内容替换,但镜像的 ID 会更新。- 重命名新导入的镜像: 如果你想保留现有的镜像并同时使用新的镜像,可以在导入后立即使用
docker tag
为新镜像指定一个不同的标签或仓库名。这样,两个镜像就可以共存,各自有不同的标签。
例如,假设原有的镜像标签为existingimage:latest
,而你导入的镜像也带有相同的标签,你可以这样操作:docker tag existingimage:latest newimage:latest
- 先删除现有镜像: 如果你确定新的镜像应该替换旧的镜像,并且想要彻底移除旧镜像,可以先删除旧镜像然后导入新镜像。这样做需要小心,因为一旦删除镜像,所有依赖于该镜像的容器将无法运行。
docker rmi existingimage:latest docker load < example.tar
- 使用不同的标签导入: 如果可能的话,可以修改镜像的 tar 存档文件,在导入之前重新打标签,这样导入的时候就已经带有新的标签。这通常涉及到修改镜像存档的元数据,可能比较复杂,不过可以用来避免标签冲突。
选择哪种方法取决于你对现有镜像和新镜像的需求,以及你对 Docker 系统的管理策略。通常,为了避免意外覆盖,建议使用第二种方法(重命名新导入的镜像),这样可以保持环境的清晰和安全。
输入下行命令:
docker tag a4-1:5000/yantianzi/py39_1:py39 py39_1:newname
(3)然后查询docker里的镜像,
docker images |grep py39_
OK,成功了。