Docker容器里修改的内容重启后还有吗?

在使用Docker进行应用程序容器化的过程中,经常会有这样一个问题:当容器内的内容被修改后,重启容器后是否会保留修改的内容?答案是可能会保留,也可能不会保留,具体取决于容器的存储驱动和数据卷的使用方式。接下来,我们将探讨这个问题,并给出相应的解释和示例代码。

容器存储驱动

Docker容器的存储驱动决定了容器内文件系统的管理方式,不同的存储驱动有不同的特点和行为。常见的存储驱动有overlay2aufsdevicemapper等。其中,overlay2是Docker默认的存储驱动。

overlay2存储驱动

使用overlay2存储驱动时,Docker会在主机的文件系统上创建一个目录,作为容器的根目录。当容器内的文件发生变化时,实际上是在主机文件系统上创建或修改了相应的文件。因此,当容器重启时,这些文件会被保留。

下面是一个示例,展示了在容器内创建文件后,重启容器后文件是否会保留。

首先,我们创建一个名为mycontainer的容器,并运行一个简单的Web服务器:

$ docker run -d --name mycontainer -p 8080:80 nginx

然后,我们进入容器内部,并在/usr/share/nginx/html目录下创建一个文件index.html

$ docker exec -it mycontainer bash
$ echo "Hello, Docker!" > /usr/share/nginx/html/index.html
$ exit

接下来,我们重启容器:

$ docker restart mycontainer

最后,我们通过访问http://localhost:8080来验证文件是否保留。如果能够看到Hello, Docker!的内容,则说明容器内的修改在重启后得到了保留。否则,说明容器内的修改在重启后丢失。

这个示例中,我们使用的是overlay2存储驱动,因此容器内创建的文件在重启后得到了保留。但是,需要注意的是,这种行为并非Docker的通用规则,因为存储驱动的选择和配置可能会因环境而异。

数据卷

在Docker中,数据卷是一种特殊类型的目录,可以绕过容器的文件系统,直接将数据存储在主机上。数据卷的使用方式可以帮助我们解决容器内文件修改重启后丢失的问题。

匿名数据卷

匿名数据卷是最简单的一种数据卷。通过在容器启动时使用-v参数,并指定一个目录,即可创建一个匿名数据卷。

下面是一个示例,展示了在使用匿名数据卷后,在容器内修改的文件在重启后是否仍然存在。

首先,我们创建一个名为mycontainer的容器,并使用匿名数据卷将容器内的/usr/share/nginx/html目录挂载到主机上的/data目录:

$ docker run -d --name mycontainer -p 8080:80 -v /data:/usr/share/nginx/html nginx

然后,我们进入容器内部,并在/usr/share/nginx/html目录下创建一个文件index.html

$ docker exec -it mycontainer bash
$ echo "Hello, Docker!" > /usr/share/nginx/html/index.html
$ exit

接下来,我们重启容器:

$ docker restart mycontainer

最后,我们通过访问http://localhost:8080来验证文件是否保留。如果能够看到Hello, Docker!的内容,则说明容器内的修改在重启后得到了保留。否则,说明容器内的修改在重启后丢失。

这个示例中,我们使用了匿名数据卷将容器内的文件挂载到主机上的目录,因此容器内创建的文件在