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

**URL:** <https://www.isharkfly.com/t/docker-iris/16115>\
**Category:** 数据库\
**Tags:** iris\
**Created:** [August 8, 2024, 3:56pm UTC](https://www.isharkfly.com/t/docker-iris/16115 "2024-08-08T15:56:00Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![honeymoose](https://www.isharkfly.com/user_avatar/www.isharkfly.com/honeymoose/32/20796_2.png) [@honeymoose](https://www.isharkfly.com/u/honeymoose)\
**Post date:** [August 8, 2024, 3:56pm UTC](https://www.isharkfly.com/t/docker-iris/16115/1 "2024-08-08T15:56:01Z")

</div>

![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/5/5b5eeca5e67e04fbf3195b7a28186ed49674d619.png)

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

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

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

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

```

 ![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/c/ca77d315f0052528bdac83b611917d084a9bc061.png)

```auto
#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 命令列出正在运行的容器的详细信息：

```auto
docker ps

```

 ![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/6/6ec14809602df507e48b96af952b184cccbf1c22.png)

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

```auto
docker exec -it iris-comm iris session iris

```

 ![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/e/e143063282eb1b0bb91da995e84cd57147a6d0f3.png)

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

 ![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/0/078f916f2b08fade4fe582a6070170a55577819f.png)

要查看global的值，请导航到管理门户 (demo | demo)  
[http://localhost:52773/csp/sys/exp/%25CSP.UI.Portal.GlobalList.zen?$NAMESPACE=USER](http://localhost:52773/csp/sys/exp/%25CSP.UI.Portal.GlobalList.zen?%24NAMESPACE=USER&SQL=0)

 ![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/1/173b31e3bf294f6fc0000e6ae76ed66b2e04127e.png)  
要查看值，请点击 View 选项  
 ![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/0/0b3a1b85f3a92b5e9b3a98288240e4ead438a9ab.png)

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

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

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

```auto
# 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

```

 ![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/4/47eaa88ed16e9a3c5b103bbcd6a10b1c0e17d77b.png)

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

 ![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/2/2425c2cacb5435a101e35ac0afa412ac4fd86627.png)

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

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 命令：

```auto
docker volume create irisVol

```

 ![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/b/b947a3ada97fc88d1ccb031f6cbbe91cbdebe539.png)  
irisVol volume is created.

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

下面是检查卷的 docker 命令：

```auto
$ docker volume inspect irisVol

```

 ![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/4/44500fc37ee69a5ca3c1a4e6ea16e70e06f86bec.png)

具名卷默认在此路径下创建：  
_/var/lib/docker/volumes//\_data._

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

```auto
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值，我们将检查它是否会持续存在

 ![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/2/2aabfa34b93931ce5eacd69e75b74b06e44070fa.png)

停止并移除容器

 ![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/9/93e47c99ee7860430d881c5ee76ec403d2805d35.png)

重新创建容器

 ![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/2/2577fc9f8dc86406736a35336bdf201e139e79e4.png)

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

 ![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/5/520585b4ee635683590823fc659edad8c42762f8.png)

很好！ Docker 保留了 IRIS 数据

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

```auto
$ docker container inspect iris-comm

```

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

 ![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/d/de93b3cedf9dff9eeeef46cfe26bc30e183b65af.png)  
使用已挂载的卷完成此流程时，有两个关键点需要掌握：

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

感谢阅读！

原文链接：[在 Docker 容器中长期保留 IRIS 数据 | InterSystems Developer Community | InterSystems](https://cn.community.intersystems.com/post/%E5%9C%A8-docker-%E5%AE%B9%E5%99%A8%E4%B8%AD%E9%95%BF%E6%9C%9F%E4%BF%9D%E7%95%99-iris-%E6%95%B0%E6%8D%AE)
