专业编程基础技术教程

网站首页 > 基础教程 正文

Docker容器命令之commit和export docker multistage

ccvgpt 2024-10-17 08:48:31 基础教程 8 ℃

介绍

在生产环境和测试环境下,使用Docker进行应用程序的容器化部署时,我们经常需要对容器进行备份和恢复操作。备份容器可以保证数据的安全性,而恢复操作可以帮助我们快速恢复出现问题的容器。Docker提供了docker export和docker commit两种方式。

docker export: 这个命令将一个正在运行或已停止的容器的文件系统打包为一个压缩的 tar 文件,但不保留历史记录和元数据。它不包含容器的运行时状态、进程、环境变量等信息,只包含容器的文件系统快照。使用 docker export 创建的 tar 文件可以在其他 Docker 环境中通过 docker import 命令导入为镜像。导入后的镜像没有与原始容器相同的历史记录和元数据。

Docker容器命令之commit和export docker multistage

docker commit: 这个命令将容器的当前状态保存为一个新的镜像,并保留历史记录和元数据。它将容器的文件系统更改、进程状态等保存到新的镜像中。使用 docker commit 创建的镜像可以直接用作基于此镜像的新容器的基础。镜像中包含容器的文件系统和运行时状态。

两者的主要区别:

(1)docker commit 导出的镜像包含容器的完整文件系统和运行时状态,可以直接用作基于此镜像的新容器的基础。

(2)docker export 导出的 tar 文件只包含容器的文件系统快照,不包含容器的运行时状态或元数据。需要使用 docker import 将其导入为镜像后才能使用。

因此,如果您需要保留容器的完整状态并将其作为基础创建新容器,可以使用 docker commit。如果只需要容器的文件系统快照,并将其在其他 Docker 环境中导入为镜像,可以使用 docker export 和 docker import 组合。

docker commit用法

[root@docker-operation ~]# docker commit --help

Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

Create a new image from a container's changes

Aliases:

docker container commit, docker commit

Options:

-a, --author string Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")

-c, --change list Apply Dockerfile instruction to the created image

-m, --message string Commit message

-p, --pause Pause container during commit (default true)

docker export用法

[root@docker-operation ~]# docker export --help

Usage: docker export [OPTIONS] CONTAINER

Export a container's filesystem as a tar archive

Aliases:

docker container export, docker export

Options:

-o, --output string Write to a file, instead of STDOUT

docker import用法

[root@docker-operation ~]# docker import --help

Usage: docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

Import the contents from a tarball to create a filesystem image

Aliases:

docker image import, docker import

Options:

-c, --change list Apply Dockerfile instruction to the created image

-m, --message string Set commit message for imported image

--platform string Set platform if server is multi-platform capable

docker commit操作效果

具体操作效果如下:

说明:测试centos-ssh镜像安装vi后备份和恢复效果。

# 下载pull cenos-ssh

[root@docker-operation ~]# docker pull jdeathe/centos-ssh

Using default tag: latest

latest: Pulling from jdeathe/centos-ssh

ac9208207ada: Pull complete

1cde45171c62: Pull complete

c063da263f82: Pull complete

f20f3b11e67b: Pull complete

Digest: sha256:808153e5a72a4e0e0683a4c445bb8b3bb5f6c01cba5ee3eb5cc059ea3bd565c8

Status: Downloaded newer image for jdeathe/centos-ssh:latest

docker.io/jdeathe/centos-ssh:latest

# 查看下载的centos images

[root@docker-operation ~]# docker images|grep centos-ssh

jdeathe/centos-ssh latest f47765d0cf63 4 years ago 228MB

# 启动centos-ssh容器

[root@docker-operation ~]# docker run -d --name centos-ssh -p 32768:22 jdeathe/centos-ssh

f484f494f0432cb190ce85faa7be9a252aaf9e706b6aa7793d66720f9abe97d9

# 查看容器运行情况

[root@docker-operation ~]# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

f484f494f043 jdeathe/centos-ssh "/usr/bin/supervisor…" 36 seconds ago Up 35 seconds (healthy) 0.0.0.0:32768->22/tcp, :::32768->22/tcp centos-ssh

# 进入centsos-ssh容器,yum安装vi

[root@docker-operation ~]# docker exec -it centos-ssh /bin/bash

[root@f484f494f043 /]# vi test.log

bash: vi: command not found

[root@f484f494f043 /]# yum install -y vi

Loaded plugins: fastestmirror, ovl, versionlock

Determining fastest mirrors

epel/x86_64/metalink | 12 kB 00:00:00

* base: mirrors.cqu.edu.cn

* centos-sclo-rh: mirrors.cqu.edu.cn

* centos-sclo-sclo: mirrors.cqu.edu.cn

* epel: mirrors.aliyun.com

* extras: mirrors.cqu.edu.cn

* updates: mirrors.cqu.edu.cn

base | 3.6 kB 00:00:00

centos-sclo-rh | 3.0 kB 00:00:00

centos-sclo-sclo | 3.0 kB 00:00:00

epel | 4.3 kB 00:00:00

extras | 2.9 kB 00:00:00

ius | 1.3 kB 00:00:00

updates | 2.9 kB 00:00:00

(1/10): base/7/x86_64/group_gz | 153 kB 00:00:00

(2/10): centos-sclo-rh/x86_64/primary_db | 3.4 MB 00:00:00

(3/10): centos-sclo-sclo/x86_64/primary_db | 300 kB 00:00:00

(4/10): extras/7/x86_64/primary_db | 253 kB 00:00:00

(5/10): epel/x86_64/group | 399 kB 00:00:00

(6/10): epel/x86_64/updateinfo | 1.0 MB 00:00:00

(7/10): updates/7/x86_64/primary_db | 27 MB 00:00:00

(8/10): epel/x86_64/primary_db | 8.7 MB 00:00:00

(9/10): ius/x86_64/primary | 40 kB 00:00:02

(10/10): base/7/x86_64/primary_db | 6.1 MB 00:00:03

ius 159/159

Excluding 6 updates due to versionlock (use "yum versionlock status" to show them)

Resolving Dependencies

--> Running transaction check

---> Package vim-minimal.x86_64 2:7.4.160-5.el7 will be updated

---> Package vim-minimal.x86_64 2:7.4.629-8.el7_9 will be an update

--> Finished Dependency Resolution

Dependencies Resolved

===============================================================================================================================================================================================================

Package Arch Version Repository Size

===============================================================================================================================================================================================================

Updating:

vim-minimal x86_64 2:7.4.629-8.el7_9 updates 443 k

Transaction Summary

===============================================================================================================================================================================================================

Upgrade 1 Package

Total download size: 443 k

Downloading packages:

Delta RPMs disabled because /usr/bin/applydeltarpm not installed.

vim-minimal-7.4.629-8.el7_9.x86_64.rpm | 443 kB 00:00:00

Running transaction check

Running transaction test

Transaction test succeeded

Running transaction

Updating 2:vim-minimal-7.4.629-8.el7_9.x86_64 1/2

Cleanup : 2:vim-minimal-7.4.160-5.el7.x86_64 2/2

Verifying : 2:vim-minimal-7.4.629-8.el7_9.x86_64 1/2

Verifying : 2:vim-minimal-7.4.160-5.el7.x86_64 2/2

Updated:

vim-minimal.x86_64 2:7.4.629-8.el7_9

Complete!

[root@f484f494f043 /]# whereis vi

vi: /usr/bin/vi

[root@f484f494f043 /]# vi centos_vi.log

[root@f484f494f043 /]# cat centos—?i.log

This is test centos vi tools!!!!:

# 停止centos-ssh容器并备份

# 建议执行commit前,必须从容器中退出,可以不停止容器。

[root@docker-operation ~]# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

f484f494f043 jdeathe/centos-ssh "/usr/bin/supervisor…" 11 minutes ago Up 11 minutes (healthy) 0.0.0.0:32768->22/tcp, :::32768->22/tcp centos-ssh

[root@docker-operation ~]# docker stop centos-ssh

centos-ssh

[root@docker-operation ~]# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

f484f494f043 jdeathe/centos-ssh "/usr/bin/supervisor…" 11 minutes ago Exited (0) 1 second ago centos-ssh

[root@docker-operation ~]# docker commit centos-ssh centos-ssh-vi:1.0

sha256:ee058d711294f7c52f6ad9045395761c27812407319f6fd46cacc9df55b45598

[root@docker-operation ~]# docker images |grep centos-ssh-vi

centos-ssh-vi 1.0 ee058d711294 52 seconds ago 542MB

# 基于新的centos-ssh-vi images创建一个容器

[root@docker-operation ~]# docker run -d --name centos-ssh-vi centos-ssh-vi:1.0

9c46b58edfc2bab4be5338a4ddf4d9161502e30e0612251c3c08f44bd87de5de

[root@docker-operation ~]# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

9c46b58edfc2 centos-ssh-vi:1.0 "/usr/bin/supervisor…" 8 seconds ago Up 7 seconds (healthy) 22/tcp centos-ssh-vi

f484f494f043 jdeathe/centos-ssh "/usr/bin/supervisor…" 16 minutes ago Exited (0) 5 minutes ago centos-ssh

# 进入centos-ssh-vi容器,检查vi是否可用

[root@docker-operation ~]# docker exec -it centos-ssh-vi /bin/bash

[root@9c46b58edfc2 /]# whereis vi

vi: /usr/bin/vi

通过以上操作,就可以成功进行docker 容器的备份和恢复。

说明:docker 容器的备份和恢复仅仅局限在本机OS内,若是想将备份images用于其他OS的docker,还需docker save来完成。

docker export和import操作效果

本次操作以centos-ssh容器来完成export和import,以及与commit的区别。操作如下:

# 查看镜像和容器

[root@docker-operation-02 ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

centos-ssh-vi 1.0 ee058d711294 17 minutes ago 542MB

busybox latest beae173ccac6 2 years ago 1.24MB

httpd latest dabbfbe0c57b 2 years ago 144MB

jdeathe/centos-ssh latest f47765d0cf63 4 years ago 228MB

[root@docker-operation-02 ~]# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

9c46b58edfc2 centos-ssh-vi:1.0 "/usr/bin/supervisor…" 17 minutes ago Up 17 minutes (healthy) 22/tcp centos-ssh-vi

f484f494f043 jdeathe/centos-ssh "/usr/bin/supervisor…" 34 minutes ago Up 2 seconds (healthy) 0.0.0.0:32768->22/tcp, :::32768->22/tcp centos-ssh

# export导出centos-ssh-vi容器,如下:

[root@docker-operation-02 ~]# docker export -o "centos-ssh-vi.tar" centos-ssh-vi

[root@docker-operation-02 ~]# ls

anaconda-ks.cfg centos-ssh-vi.tar initial-setup-ks.cfg

# import导入新镜像

[root@docker-operation-02 ~]# docker import --message "import centos-ssh-vi:2.0" centos-ssh-vi.tar centos-ssh-vi:2.0

sha256:6883779f89b8faef4e47ed6ec50fa9b5cbf18ea9e4b7f8cd3515b23713a3c669

[root@docker-operation-02 ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

centos-ssh-vi 2.0 6883779f89b8 14 seconds ago 472MB

centos-ssh-vi 1.0 ee058d711294 29 minutes ago 542MB

busybox latest beae173ccac6 2 years ago 1.24MB

httpd latest dabbfbe0c57b 2 years ago 144MB

jdeathe/centos-ssh latest f47765d0cf63 4 years ago 228MB

# 测试新镜像centos-ssh-vi:2.0是否存在vi工具

[root@docker-operation-02 ~]# docker run -d centos-ssh-vi:2.0 bash

817fd7ee62f4c3e6ace5711a34a50c0959c14032a38cadd620532bdd207aa6a8

# 查看容器状态


截止:docker export和import完成。

docker import镜像运行容器常见错误

(1)错误现象

借用刚刚导入镜像centos-ssh-vi:2.0,如下:

错误现象“docker: Error response from daemon: No command specified.”,如下:

注意:运行导入的镜像的时候必须带command,否则启动报如下错误

查看原有镜像启动时的command,如下:

Tags:

最近发表
标签列表