引言
在文章《Windows Docker笔记-在容器中运行项目》中,已经在容器中运行了项目。而且在这个容器中,已经调试好了项目运行的环境。
使用docker,就是为了在项目发布到生产环境时,不用再去安装项目运行的环境,直接丢给现场这个容器中的东西运行就可以了。因为这个容器中已经有了项目运行所有依赖的东西。
那应该怎么操作呢?
首先,容器都是由镜像创建出来的,而镜像可以被拉取使用,可以知道,要想让生产环境直接使用这个OK的容器,就需要将这个容器制作成镜像,然后发布到生产环境,在生产环境中使用docker加载镜像后,用这个镜像创建容器运行,这样就可以得到一模一样的容器。
将容器制作为镜像
在 Docker 中,将一个运行中的容器转换为一个新的镜像,可以通过 docker commit 命令完成。这个过程会将容器的当前状态(包括文件系统和运行时的更改)保存为一个新的镜像,供后续使用。
语法:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
- CONTAINER:容器的 ID 或名称。
- REPOSITORY:目标镜像的仓库名称( 镜像名称或仓库名称必须为小写字母 \color{red}{镜像名称或仓库名称必须为小写字母} 镜像名称或仓库名称必须为小写字母)。
- TAG:目标镜像的标签(可选,默认为 latest)。
命令:docker commit myUbuntu myimage:1.0 # 将容器myUbuntu提交为镜像,镜像名称为myimage,版本设为1.0.
D:\本周未完成工作\docker>docker commit myUbuntu myimage:1.0
sha256:afc574de76d32f7d737eac600c94c43001b71cf72e00be5dbaac528b4574e7c8
D:\本周未完成工作\docker>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myimage 1.0 afc574de76d3 16 seconds ago 471MB
ubuntu latest a04dc4851cbc 11 days ago 78.1MB
D:\本周未完成工作\docker>
上面可以看到已经创建了一个镜像myimage,版本是1.0,大小为471M,因为安装了一些运行环境,所以会变大。
将镜像保存到本地磁盘
创建镜像后,还得将镜像保存为本地的文件,才能发送给生产环境的服务器。
在 Docker 中,如果你想将一个镜像保存到本地文件系统中,可以使用 docker save 命令。这会将镜像保存为一个 .tar 文件,你可以将其存储在本地磁盘上,或者用于在不同机器之间传输镜像。
语法:docker save [OPTIONS] IMAGE [IMAGE...]
- IMAGE:要保存的镜像名称或 ID。
- [OPTIONS]:可选参数,例如指定输出文件名。
案例:
docker save myimage:1.0 > myimage1.0.tar
D:\本周未完成工作\docker>docker save myimage:1.0 > myimage1.0.tar
D:\本周未完成工作\docker>dir
驱动器 D 中的卷是 Data
卷的序列号是 F6F0-A014
D:\本周未完成工作\docker 的目录
2025/02/07 15:42 <DIR> .
2025/02/07 15:39 <DIR> ..
2025/02/07 10:54 16,584 main
2025/02/07 15:32 479,575,552 myimage1.0.tar
2025/01/20 17:34 75,203,584 ubuntu.tar
3 个文件 554,795,720 字节
2 个目录 382,237,663,232 可用字节
D:\本周未完成工作\docker>
可以看到本地当前目录下已经有了myimage1.0.tar镜像文件。
这里先将创建的镜像和容器删除,方便接下来的演示。 \color{red}{这里先将创建的镜像和容器删除,方便接下来的演示。} 这里先将创建的镜像和容器删除,方便接下来的演示。
删除容器
在 Docker 中,删除容器是一个常见的操作,尤其是在开发和测试环境中。Docker 提供了多种方式来删除容器,包括删除单个容器、多个容器,甚至是所有容器。
-
- 删除单个容器
- 语法:docker rm [OPTIONS] CONTAINER
- CONTAINER:容器的 ID 或名称。
- 案例:docker rm myUbuntu # 删除名为myUbuntu的容器
-
- 如果容器正在运行,你需要先停止它,或者使用 -f 选项强制删除
-
案例:docker rm -f myUbuntu # 强制删除正在运行的容器myUbuntu
D:\本周未完成工作\docker>docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
da3b54c08bd5 ubuntu:latest "/bin/bash" 24 hours ago Up 6 hours myUbuntuD:\本周未完成工作\docker>docker rm -f myUbuntu
myUbuntuD:\本周未完成工作\docker>docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESD:\本周未完成工作\docker>
容器已经全部清理干净。
删除镜像
在 Docker 中,删除镜像是一个常见的操作,尤其是在清理不再需要的镜像或节省磁盘空间时。Docker 提供了 docker rmi 和 docker image rm 命令来删除镜像。
-
- 删除单个镜像
- 语法:docker rmi [OPTIONS] IMAGE [IMAGE...]
- IMAGE:镜像的名称或 ID
- 语法:docker image rm [OPTIONS] IMAGE [IMAGE...]
- IMAGE:镜像的名称或 ID
- 案例:
- docker rmi myimage:1.0
- docker image rm myimage:1.0
-
- 强制删除镜像
如果镜像正在被一个或多个容器使用,Docker 会阻止删除该镜像。你可以使用 -f 选项强制删除镜像, 但这会同时删除所有依赖该镜像的容器 \color{red}{但这会同时删除所有依赖该镜像的容器} 但这会同时删除所有依赖该镜像的容器
-
案例:docker rmi -f myimage:1.0
D:\本周未完成工作\docker>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myimage 1.0 afc574de76d3 56 minutes ago 471MB
ubuntu latest a04dc4851cbc 11 days ago 78.1MBD:\本周未完成工作\docker>docker rmi myimage:1.0
Untagged: myimage:1.0
Deleted: sha256:afc574de76d32f7d737eac600c94c43001b71cf72e00be5dbaac528b4574e7c8
Deleted: sha256:9eef925daae57b9aa72b8347d2e48693018ade421a90d489f29193149e387023D:\本周未完成工作\docker>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest a04dc4851cbc 11 days ago 78.1MBD:\本周未完成工作\docker>
- 强制删除镜像
可以看到刚才创建的镜像已经删除了。
docker加载本地镜像文件
如果你想在另一台机器上加载这个 .tar 文件,可以使用 docker load 命令。
命令:docker load < myimage1.0.tar # myimage1.0.tar是刚刚保存到本地的镜像文件
命令:docker load --input myimage1.0.tar # 或者这种也可以
D:\本周未完成工作\docker>docker load --input myimage1.0.tar
f55328183ab2: Loading layer [==================================================>] 398.9MB/398.9MB
Loaded image: myimage:1.0
D:\本周未完成工作\docker>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myimage 1.0 afc574de76d3 About an hour ago 471MB
ubuntu latest a04dc4851cbc 11 days ago 78.1MB
D:\本周未完成工作\docker>
可以看到已经成功加载了本地磁盘的镜像文件到docker中。
创建容器,运行项目
有了镜像,就可以创建容器并运行了,相关命令可以参考文章《Windows Docker笔记-Docker容器操作》和《Windows Docker笔记-在容器中运行项目》。
D:\本周未完成工作\docker>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myimage 1.0 afc574de76d3 About an hour ago 471MB
ubuntu latest a04dc4851cbc 11 days ago 78.1MB
D:\本周未完成工作\docker>docker run -it --name mytest afc574de76d3
root@1ef0d1e4425a:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@1ef0d1e4425a:/# cd /home/test/
root@1ef0d1e4425a:/home/test# ls
main
root@1ef0d1e4425a:/home/test# ./main
2 + 3 = 5
root@1ef0d1e4425a:/home/test# exit
exit
D:\本周未完成工作\docker>docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1ef0d1e4425a afc574de76d3 "/bin/bash" 33 seconds ago Exited (0) 10 seconds ago mytest
D:\本周未完成工作\docker>
上述过程,首先使用镜像myimage创建了一个名为mytest的容器,之后进入容器内后,成功运行了项目,退出容器后,查看容器信息,可以看到容器已经存在,并且停止了。
这样就成功将现有的项目发布到生产环境,而不需要再次配置运行环境就可以运行项目。
上一章:《Windows Docker笔记-在容器中运行项目》
下一章:<>