如何在Linux中备份,恢复和迁移Docker容器
发布时间:2025-05-23 19:49:31 发布人:远客网络
一、如何在Linux中备份,恢复和迁移Docker容器
今天,我们将学习如何快速地对Docker容器进行快捷备份、恢复和迁移。Docker是一个开源平台,用于自动化部署应用,以通过快捷的途径在称之为容器的轻量级软件层下打包、发布和运行这些应用。它使得应用平台独立,因为它扮演了 Linux上一个额外的操作系统级虚拟化的自动化抽象层。它通过其组件cgroups和命名空间利用Linux内核的资源分离特性,达到避免虚拟机开销的目的。它使得用于部署和扩展web应用、数据库和后端服务的大规模构建组件无需依赖于特定的堆栈或供应者。
所谓的容器,就是那些创建自Docker镜像的软件层,它包含了独立的Linux文件系统和开箱即用的应用程序。如果我们有一个在机器中运行着的Docker容器,并且想要备份这些容器以便今后使用,或者想要迁移这些容器,那么,本教程将帮助你掌握在Linux操作系统中备份、恢复和迁移 Docker容器的方法。
我们怎样才能在Linux中备份、恢复和迁移Docker容器呢?这里为您提供了一些便捷的步骤。
首先,为了备份Docker中的容器,我们会想看看我们想要备份的容器列表。要达成该目的,我们需要在我们运行着Docker引擎,并已创建了容器的Linux机器中运行 docker ps命令。
在此之后,我们要选择我们想要备份的容器,然后去创建该容器的快照。我们可以使用 docker commit命令来创建快照。
# docker commit-p 30b8f18f20b4 container-backup
该命令会生成一个作为Docker镜像的容器快照,我们可以通过运行 docker images命令来查看Docker镜像,如下。
正如我们所看见的,上面做的快照已经作为Docker镜像保存了。现在,为了备份该快照,我们有两个选择,一个是我们可以登录进Docker注册中心,并推送该镜像;另一个是我们可以将Docker镜像打包成tar包备份,以供今后使用。
如果我们想要在Docker注册中心上传或备份镜像,我们只需要运行 docker login命令来登录进Docker注册中心,然后推送所需的镜像即可。
# docker tag a25ddfec4d2a arunpyasi/container-backup:test# docker push arunpyasi/container-backup
如果我们不想备份到docker注册中心,而是想要将此镜像保存在本地机器中,以供日后使用,那么我们可以将其作为tar包备份。要完成该操作,我们需要运行以下 docker save命令。
# docker save-o~/container-backup.tar container-backup
要验证tar包是否已经生成,我们只需要在保存tar包的目录中运行 ls命令即可。
接下来,在我们成功备份了我们的Docker容器后,我们现在来恢复这些制作了Docker镜像快照的容器。如果我们已经在注册中心推送了这些Docker镜像,那么我们仅仅需要把那个Docker镜像拖回并直接运行即可。
# docker pull arunpyasi/container-backup:test
但是,如果我们将这些Docker镜像作为tar包文件备份到了本地,那么我们只要使用 docker load命令,后面加上tar包的备份路径,就可以加载该Docker镜像了。
# docker load-i~/container-backup.tar
现在,为了确保这些Docker镜像已经加载成功,我们来运行 docker images命令。
在镜像被加载后,我们将用加载的镜像去运行Docker容器。
# docker run-d-p 80:80 container-backup
迁移容器同时涉及到了上面两个操作,备份和恢复。我们可以将任何一个Docker容器从一台机器迁移到另一台机器。在迁移过程中,首先我们将把容器备份为Docker镜像快照。然后,该Docker镜像或者是被推送到了Docker注册中心,或者被作为tar包文件保存到了本地。如果我们将镜像推送到了Docker注册中心,我们简单地从任何我们想要的机器上使用 docker run命令来恢复并运行该容器。但是,如果我们将镜像打包成tar包备份到了本地,我们只需要拷贝或移动该镜像到我们想要的机器上,加载该镜像并运行需要的容器即可。
二、如何 在Docker窗口中部署PHP开发环境
环境部署一直是一个很大的问题,无论是开发环境还是生产环境,但是 Docker
将开发环境和生产环境以轻量级方式打包,提供了一致的环境。极大的提升了开发部署一致性。当然,实际情况并没有这么简单,因为生产环境和开发环境的配置是完全不同的,比如日志等的问题都需要单独配置,但是至少比以前更加简单方便了,这里以
PHP开发作为例子讲解 Docker如何布置开发环境。
一般来说,一个 PHP项目会需要以下工具:
这是最简单的架构方式,在 Docker发展早期,Docker被大量的滥用,比如,一个镜像内启动多服务,日志收集依旧是按照 Syslog
或者别的老方式,镜像容量非常庞大,基础镜像就能达到 80M,这和 Docker当初提出的思想完全南辕北辙了,而 Alpine Linux
发行版作为一个轻量级 Linux环境,就非常适合作为 Docker基础镜像,Docker官方也推荐使用 Alpine而不是 Debian
作为基础镜像,未来大量的现有官方镜像也将会迁移到 Alpine上。本文所有镜像都将以 Alpine作为基础镜像。
这部分笔者已经在另一篇文章 Docker容器的 Nginx实践中讲解了 Tengine的 Docker实践,并且给出了
Dockerfile,由于比较偏好 Tengine,而且官方已经给出了 Nginx的 alpine镜像,所以这里就用
Tengine。笔者已经将镜像上传到官方 DockerHub,可以通过
<code>docker pull chasontang/tengine:2.1.2_f</code>
获取镜像,具体请看 Dockerfile。
Docker官方已经提供了 PHP的 7.0.7-fpm-alpine镜像,Dockerfile如下:
RUN apk add--no-cache--virtual.persistent-deps\
&& addgroup-g 82-S www-data\
&& adduser-u 82-D-S-G www-data www-data
# 82 is the standard uid/gid for"www-data" in Alpine
#
#
#
ENV PHP_INI_DIR/usr/local/etc/php
RUN mkdir-p$PHP_INI_DIR/conf.d
ENV PHP_EXTRA_CONFIGURE_ARGS--enable-fpm--with-fpm-user=www-data--with-fpm-group=www-data
ENV GPG_KEYS 1A4E8B7277C42E53DBA9C7B9BCAA30EA9C0D5763
ENV PHP_FILENAME php-7.0.7.tar.xz
ENV PHP_SHA256 9cc64a7459242c79c10e79d74feaf5bae3541f604966ceb600c3d2e8f5fe4794
&& apk add--no-cache--virtual.build-deps\
&& curl-fSL"$PHP_FILENAME/from/this/mirror"-o"$PHP_FILENAME"\
&& echo"$PHP_SHA256*$PHP_FILENAME"| sha256sum-c-\
&& curl-fSL"$PHP_FILENAME.asc/from/this/mirror"-o"$PHP_FILENAME.asc"\
&& export GNUPGHOME="$(mktemp-d)"\
&& for key in$GPG_KEYS; do\
gpg--keyserver ha.pool.sks-keyservers.net--recv-keys"$key";\
&& gpg--batch--verify"$PHP_FILENAME.asc""$PHP_FILENAME"\
&& rm-r"$GNUPGHOME""$PHP_FILENAME.asc"\
&& tar-Jxf"$PHP_FILENAME"-C/usr/src\
&& mv"/usr/src/php-$PHP_VERSION"/usr/src/php\
--with-config-file-path="$PHP_INI_DIR"\
--with-config-file-scan-dir="$PHP_INI_DIR/conf.d"\
$PHP_EXTRA_CONFIGURE_ARGS\
#--enable-mysqlnd is included here because it's harder to compile after the fact than extensions are(since it's a plugin for several extensions, not an extension in itself)
#--enable-mbstring is included here because otherwise there's no way to get pecl to use it properly(see )
&& make-j"$(getconf _NPROCESSORS_ONLN)"\
&&{ find/usr/local/bin/usr/local/sbin-type f-perm+0111-exec strip--strip-all'{}'+|| true;}\
scanelf--needed--nobanner--recursive/usr/local\
| awk'{ gsub(/,/,"\nso:",$2); print"so:"$2}'\
| xargs-r apk info--installed\
&& apk add--no-cache--virtual.php-rundeps$runDeps\
COPY docker-php-ext-*/usr/local/bin/
&& if [-d php-fpm.d ]; then\
# for some reason, upstream's php-fpm.conf.default has"include=NONE/etc/php-fpm.d/*.conf"
sed's!=NONE/!=!g' php-fpm.conf.default| tee php-fpm.conf>/dev/null;\
cp php-fpm.d/www.conf.default php-fpm.d/www.conf;\
# PHP 5.x don't use"include=" by default, so we'll create our own simple config that mimics PHP 7+ for consistency
cp php-fpm.conf.default php-fpm.d/www.conf;\
echo'include=etc/php-fpm.d/*.conf';\
echo'error_log=/proc/self/fd/2';\
echo'; if we send this to/proc/self/fd/1, it never appears';\
echo'access.log=/proc/self/fd/2';\
echo'clear_env= no';\
echo'; Ensure worker stdout and stderr are sent to the main error log.';\
echo'catch_workers_output= yes';\
}| tee php-fpm.d/docker.conf\
echo'daemonize= no';\
echo'listen= [::]:9000';\
}| tee php-fpm.d/zz-docker.conf
三、涛思数据库docker删除容器后,宿主机中数据不能用
1、该情况是因为容器删除时也删除了存储数据的文件。
2、当使用Docker删除容器时,通常会同时删除该容器中的所有数据。这是因为容器是一个轻量级的虚拟化环境,在宿主机上使用文件系统的层级结构来存储数据。
3、如果要保留宿主机上的数据,在创建容器时,可以使用数据卷来将容器中的数据存储在宿主机上的指定位置。这样,即使删除容器,数据卷中的数据仍然会保留在宿主机上。