docker学习---第2步:基于docker打包发布一个python应用

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最好!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饿了就干饭

你的鼓励将是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值