文章目录
- 1、熟悉一下命令
- 2、使用Dockerfile在本地创建镜像
- 3、基于镜像创建并启动容器
- 4、修改镜像中文件
- 5、将容器打包为镜像
- 6、将镜像导入并进行使用
- 7、容器打包为镜像的另一种打包方式(export)
- 8、说一下docker export + docker import和docker commit的区别
1、熟悉一下命令
1.1 重新启动已存在的容器
docker start 容器名
1.2 关闭一个正在运行的容器
docker stop 容器名
1.3 查看正在运行的容器
docker ps # 是看有哪些容器在运行
docker ps -a # 是看总共有哪些容器
1.4 创建镜像
docker build -t <镜像名称>:<标签> <Dockerfile路径>
参数说明
-t <镜像名称>:<标签>
:指定创建的镜像名称和标签(版本)。例如,demo:v1。如果不指定标签,默认会使用 latest。
<Dockerfile路径>
:指定 Dockerfile 所在的路径,一般是当前目录 .
1.5 基于镜像创建并启动新的容器实例,随机定义容器名称
docker run 镜像名
上面的命令来基于镜像创建并启动一个新容器时,如果没有手动指定容器名称,Docker 会自动为新容器分配一个随机的名称。这个名称通常由两个部分组成,例如 focused_tesla 或 angry_bardeen,它们是随机组合的两个词。
可以通过以下方式查看新创建的容器名称:
docker ps -a
这条命令会显示所有容器的列表(包括正在运行的和已停止的),其中会显示容器的名称。
1.6 基于镜像创建并启动新的容器实例,并自定义容器名称
如果你希望为新容器指定一个特定的名称,可以使用 --name 选项,例如:
docker run --name 容器名 镜像名
这样,创建的容器名称就会是 容器名
。
1.7 从主机往容器复制文件
docker cp <本地主机文件路径> <容器ID>:/path/to/destination
1.8 从容器复制文件到主机
docker cp <容器ID>:/path/to/file <本地主机目标路径>
1.9 打包镜像为tar包
docker save ID > [path].tar
[path]指定存放的路径(自己主机上)。打包完成可以在D盘下看到多了一个tar包,这就是装好环境的docker镜像。
1.10 列出本地所有的Docker镜像
列出的内容包括:镜像的仓库名称、标签、镜像ID、创建时间以及大小等信息。
docker images
1.11 根据docker容器的改变创建一个新的docker镜像
见第5节
1.12 列出本地所有的Docker镜像
包括镜像的仓库名称、标签、镜像ID、创建时间以及大小等信息。
docker images
2、使用Dockerfile在本地创建镜像
2.1 先得有一个python项目
(1)以爬虫项目为例,首先创建一个爬虫代码,代码文件名为demo.py
import requests
reponse = requests.get(url="www.baidu.com")
print(reponse.text)
(2)在上面的文件夹下,执行下面命令,
conda create -n pachong python=3.12
conda activate pachong
pip install requests
pip freeze > requirements.txt
在当前目录终端,使用pip freeze > requirements.txt
命令将项目依赖库进行导出。命令执行完成后会生成一个叫requirements.txt的文件,文件内的内容如下:
certifi==2024.8.30
charset-normalizer==3.4.0
idna==3.10
requests==2.32.3
setuptools==75.1.0
urllib3==2.2.3
wheel==0.44.0
(3)编写Dockerfile文件
FROM python:3.12
# 将当前目录.添加到code文件夹下
ADD . /code
# 设置工作目录
WORKDIR /code
# # 设置时区为东八区(中国标准时间)
# RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone
# 安装依赖
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 设置容器启动时运行的命令
CMD ["python", "app.py"]
(4)创建镜像
打开cmd终端,进入Python项目目录,运行
docker build -t demo:v1 .
构建镜像,成功界面如下
在构建镜像的过程中也会出现一些问题,比如:
这种原因是在拉取镜像的时候网站用站用不了,需要更换国内的镜像网站。参考:Docker 配置国内镜像源
给docker添加:
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://dockerhub.azk8s.cn",
"https://mirror.ccs.tencentyun.com",
"https://registry.cn-hangzhou.aliyuncs.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.m.daocloud.io",
"https://noohub.ru",
"https://huecker.io",
"https://dockerhub.timeweb.cloud"
]
}
可以暂时解决该问题。
在docker中查看到创建的镜像,如下:
也可以用docker images
查看镜像有哪些
3、基于镜像创建并启动容器
现在有一个已经创建好的demo镜像,执行
docker run -d --name=container1 demo:v1
此时会基于镜像demo创建并启动新的容器实例,并自定义容器名称为container1,在写镜像的时候得写上镜像的版本,方可执行成功。(这里没加标签默认是latest,如果你之前创建镜像的时候使用了其他标签,需要加上 :[标签],要不然系统会找不到镜像。)
使用docker ps -a
查看刚才创建的容器
4、修改镜像中文件
4.1 发现镜像中文件有错
在Docker Desktop中点击容器名,执行了一下,在Logs中发现报错:
此时我们有了修改镜像中文件的需求,我们就来学一学怎么修改镜像中文件。
解决容器中文件有错误的思路:
(1)在主机上改好一个能正常运行的文件,复制到容器中,覆盖掉容器中的原文件
(2)
4.2 从主机复制文件到容器
命令:
docker cp D:\project_cv\5 app-docker\app.py a06b229d8fe82470e0d01299bfc51a56ad9bdfa3343daa98584a37e1d950b4de:/code/
出错,原因是文件路径中包含了空格,而 Docker 命令无法正确解析带空格的路径。需要对路径中的空格进行处理,可以用双引号或反斜杠(\)来处理路径中的空格。
因此使用双引号包裹文件路径
,即可成功
方法有很多(目的就是消除目录中有空格的问题):
1、用双引号包裹文件路径
2、用反斜杠转义空格
3、切换到目标目录再执行(即先到5 app-docker目录下)运行
docker cp app.py a06b229d8fe82470e0d01299bfc51a56ad9bdfa3343daa98584a37e1d950b4de:/code/
复制完文件,运行容器,执行结果如下:
5、将容器打包为镜像
5.1 导出容器为镜像
这会将容器保存为一个新镜像,镜像名定义为exportiso:v1
docker commit 容器ID 镜像名称:标签
docker desktop中显示也多了一个镜像
5.2 保存镜像为文件
docker save 镜像名称:标签 -o 文件名.tar
5.3 docker打包容器与虚拟环境的对比
6、将镜像导入并进行使用
把容器导出为镜像文件之后,传输给别人进行使用,
当别人拿到你传输的镜像文件后,他们一般会对这个文件进行以下操作,以便在他们的环境中使用:
6.1 加载镜像文件
把镜像的tar包发送给别人,其他人使用,别人通过
docker load -i 文件名.tar
镜像会被导入到他们的Docker镜像库中。加载完成后,可以通过docker images
命令查看镜像是否成功导入
6.2 使用镜像运行容器
导入镜像,加载完成后,别人可以直接用这个镜像创建并运行一个新的容器。
docker run -it 镜像名称:标签
或
docker run -it ID
镜像名称:标签
和 镜像 ID
的主要区别在于它们引用镜像的方式不同,但执行结果通常是一样的。
镜像启动一个新容器,环境和你当时保存的状态一致。
如果镜像包含了一个应用程序(如Web服务),运行时会启动该程序。
6.3 修改镜像或容器
根据实际需求,别人可能会在你的基础镜像上进行修改,例如:
增加新的应用或配置;
优化或调试镜像;
安装额外的依赖库。
6.4 部署到环境中
根据用途,别人可能会将镜像部署到不同的环境中,例如:
本地环境:用于本地测试或开发。
服务器:将镜像部署到生产环境,运行实际的服务。
集群环境:在Kubernetes等容器编排平台中运行。
操作命令(在Docker中运行):
docker run -d --name 容器名称 -p 端口映射 镜像名称:标签
docker run -d --name myapp -p 8080:80 myimage:latest
6.5 清理或归档
在使用完成后,别人可能会选择清理未使用的镜像,或者将镜像归档保存以便后续使用:
删除镜像:
docker rmi 镜像名称:标签
备份镜像:
别人可以将镜像再次导出为文件,用于备份:
docker save -o 新文件名.tar 镜像名称:标签
把容器打包成镜像,类似于深度学习中对虚拟环境的打包,但封装的范围更广,不仅包括软件依赖,还包括操作系统和运行状态,适合需要强隔离性和一致性的场景。在深度学习领域,结合容器技术可以进一步提升项目的可移植性和环境一致性,是一种更加现代化的实践方式。
6.6 还有一种导出镜像为tar包的方式(docker save)
适用于简单操作,直接知道镜像 ID 的情况。直接导出镜像为tar包
docker save ID > [path].tar
[path]指定存放的路径(自己主机上)。打包完成可以在D盘下看到多了一个tar包,这就是装好环境的docker镜像。
更适合常规操作,尤其是当你需要保存特定名称和标签的镜像时。
支持多个镜像同时保存:
docker save myapp:latest mydb:1.0 -o myimages.tar
两种镜像打包方式共同点:
作用相同: 两者都用于将 Docker 镜像保存为一个 tar 文件。
结果相同: 生成的 tar 文件内容是一致的,包含镜像的所有层(layers)、元数据(metadata)等。
可移植性: 生成的 tar 文件可以在其他机器上通过 docker load 导入。
适用场景: 都适用于备份、传输镜像到离线环境等场景。
7、容器打包为镜像的另一种打包方式(export)
docker export
作用:
用于导出容器的文件系统为一个 tar 包。
仅包含文件系统内容,不包含元数据。
优点:
生成的文件较小,因为去掉了 Docker 镜像中的元数据和历史层。
适合文件系统的备份或迁移。
缺点:
导出的 tar 文件不能直接用来运行容器。
如果需要重新运行,需要通过 docker import 导入为镜像,元数据需要手动补充。
典型场景:
想要备份容器的文件系统,供后续分析或迁移使用:
docker export 容器ID > export.tar
将 tar 文件导入为镜像:
docker import export.tar 新镜像名称:标签
例如:
docker export 3cce9c908216 > exportsso.tar #导出容器
将导出的.tar文件,执行import命令导入
骚操作是:将tar包进行拆分,然后合并,拆分操作参考:docker 导出镜像、导出容器操作
不拆分的话,直接导入
cat new_export.tar |docker import - exportsso:2.0 #导入文件,生成镜像
参考:Docker 打包Python项目详细教程(Windows)
8、说一下docker export + docker import和docker commit的区别
这两种方式都是从容器出发
docker commit 是保存容器为镜像的简单方式,而 docker export + docker import 更适合备份和文件系统迁移场景,但需要手动处理元数据,使用灵活性更高。
so 我觉着还是直接用docker commit
最好!