文章
· 八月 7 阅读大约需 5 分钟

在 Docker 容器中长期保留 IRIS 数据

默认情况下,在容器内创建的所有文件都存储在可写的容器层上。 这意味着:

  • 当容器消失时,数据将不会持续存在,并且如果另一个进程需要数据,很难将数据从容器中取出。
  • 容器的可写层与运行容器的主机紧密耦合。 你无法轻易将数据移动到其他地方。
  • 写入容器的可写层需要存储驱动程序来管理文件系统。 存储驱动程序使用 Linux 内核提供联合文件系统, 与使用直接写入主机文件系统的数据卷相比,这种额外的抽象会降低性能。

 

为了演示 docker 容器的默认行为,我们使用以下命令运行容器:

docker run -d --name iris-comm -p 1972:1972 -p 52773:52773 -e IRIS_PASSWORD=demo -e IRIS_USERNAME=demo intersystemsdc/iris-community:latest

 

#docker run command to create and start the container
docker run 
#-d -an option used to start container in deattach mode
-d 
#name of the container
--name iris 
#-p -an option is used to map the ports
-p 1972:1972 
-p 52773:52773 
#-e -an option to set environment variable
-e IRIS_USERNAME=demo
-e IRIS_PASSWORD=demo
#base image
intersystemsdc/iris-community:latest

运行以下 docker 命令列出正在运行的容器的详细信息:

docker ps

使用以下 docker 命令连接到 IRIS 终端:

docker exec -it iris-comm iris session iris

我们将使用“DockerVolume” 将一些数据保存到 IRIS global中

要查看global的值,请导航到管理门户 (demo | demo)
http://localhost:52773/csp/sys/exp/%25CSP.UI.Portal.GlobalList.zen?$NAMESPACE=USER
 
要查看值,请点击 View 选项

现在,重新创建容器来检查 IRIS 数据是否仍然存在。

为了重新创建容器,我们必须停止并移除容器。

下面的 docker 命令将停止、移除并重新创建容器。 

# Stop the container
docker stop iris-comm

# Remove the container
docker rm iris-comm

# Create the container
docker run -d --name iris-comm -p 1972:1972 -p 52773:52773 -e IRIS_PASSWORD=demo -e IRIS_USERNAME=demo intersystemsdc/iris-community:latest



连接到 IRIS 终端并检查之前保存的global的值

重新创建容器后,数据不可用。

Docker 为容器提供了多种存储数据的选项,允许根据不同的使用场景进行灵活性和定制化调整。 主要选项如下:

  • 1

    卷存储在由 Docker 管理的主机文件系统的部分中(Linux 上为 /var/lib/docker/volumes/)。 非 Docker 进程不应修改文件系统的这一部分。 卷是 Docker 中保留数据的最佳方式。 创建卷时,它会存储在 Docker 主机上的目录中。 将卷挂载到容器中时,这个目录就是挂载到容器中的目录。 这与绑定挂载类似,不同之处在于卷由 Docker 管理,并且与主机的核心功能隔离。 挂载卷时,它可能具名,也可能匿名。 匿名卷被赋予随机名称,该名称保证在给定的 Docker 主机中是唯一的。 就像具名卷一样,即使我们移除使用它们的容器,匿名卷也会保留下来,除非你在创建容器时使用 --rm 标志,在这种情况下匿名卷将被销毁。如果创建多个使用匿名卷的容器,则每个容器都会创建自己的卷。 匿名卷不会自动在容器之间重用或共享。 要在两个或多个容器之间共享匿名卷,必须使用随机卷 ID 挂载匿名卷。 卷还支持使用卷驱动程序,这允许你将数据存储在远程主机或云提供商等位置。  
  • 2- 绑定挂载

    绑定挂载可以存储在主机系统上的任何位置。 Docker 主机或 Docker 容器上的非 Docker 进程可以随时修改它们。 与卷相比,它的功能有限。 使用绑定挂载时,主机上的文件或目录将挂载到容器中。 文件或目录由其在主机上的完整路径引用。 文件或目录不需要已经存在于 Docker 主机上。 如果它尚不存在,则会按需创建。 绑定挂载速度很快,但需要主机的文件系统具有可用特定目录结构。 如果是在开发新的 Docker 应用程序,不妨改用具名卷。 你不能使用 Docker CLI 命令直接管理绑定挂载。  
  • 3- tmpfs

    Docker 还支持在主机内存中存储文件的容器。 此类文件不会被保留。 如果你是在 Linux 上运行 Docker,tmpfs 挂载将用于在主机的系统内存中存储文件。 如果你是在 Windows 上运行 Docker,具名管道将用于在主机的系统内存中存储文件。 容器可以在生命周期内使用它来存储非持久状态或敏感信息。 例如,在内部,Swarm 服务使用 tmpfs 挂载将机密挂载到服务的容器中。

使用 Docker 卷在 Docker 容器中长期保留 IRIS 数据

Docker 卷使用起来简单直接。 只需要在运行容器时创建一个卷并指定卷名称

下面是创建名为 irisVol 的新卷的 docker 命令:

docker volume create irisVol


irisVol volume is created.

注意:在容器中使用卷之前,我们不一定需要创建卷。 如果指定的卷名称尚不存在,Docker 将自动创建卷。

下面是检查卷的 docker 命令:

$ docker volume inspect irisVol

具名卷默认在此路径下创建:
/var/lib/docker/volumes/<name>/_data.
 

输入之前用于运行容器的命令,但添加 irisVol 卷选项

docker run -d --name iris-comm -p 1972:1972 -p 52773:52773 -e IRIS_PASSWORD=demo -e IRIS_USERNAME=demo --mount source=mvol,target=/usr/irissys/mgr/user/ intersystemsdc/iris-community:latest

--mount source=mvol,target=/usr/irissys/mgr/user/:

  • 这个选项会将卷挂载到容器。
  • source=mvol specifies the name of the Docker volume to use.
  • target=/usr/irissys/mgr/user/ specifies the directory inside the container where the volume will be mounted. 请注意,这是存储 IRIS 用户数据库的容器目录。


连接到 IRIS 终端并设置一个global值,我们将检查它是否会持续存在

停止并移除容器

重新创建容器

再次连接到 IRIS 终端并检查global ^DockerVolume 值

很好! Docker 保留了 IRIS 数据


我们也可以使用以下命令检查卷详细信息:

$ docker container inspect iris-comm

这个命令的结果很长,但请注意 Mounts 区域包含有关卷的信息,此卷是最初运行时挂载的容器。

使用已挂载的卷完成此流程时,有两个关键点需要掌握:

  • 卷存在于容器的分层文件系统之外。 这意味着在可写容器层中操作文件时,它们不包含在通常的写时复制过程中。
  • 你可以在主机上操作文件,并通过已挂载的卷将这些更改无缝传播到正在运行的容器中。 对于将运行时环境容器化但挂载开发中代码的开发者来说,这是一种流行的技术。 通过这种方式,你可以使用主机编辑代码,并将更改传播到正在运行的容器中,而无需重建或重启计算机。

感谢阅读!

讨论 (0)0
登录或注册以继续