如何将Docker容器作为服务重用?

如何将Docker容器作为服务重用?,docker,docker-compose,docker-container,Docker,Docker Compose,Docker Container,我已经为postgres和redis准备了一个运行的容器,用于各种用途。然而,我几个月前就从命令行开始了。现在我正在尝试安装一个新的应用程序,其方法是编写一个docker compose文件,其中包括postgres和redis作为服务 是否可以修改compose文件以指定已经运行的容器?Postgres已经在存储任何数据方面做得很好,我无法想象重用正在运行的redis会是一个问题 我应该重复使用它们吗?我突然想到,我可以为这两者运行多个容器,我不确定这会有什么不利之处(除了混乱的docker

我已经为postgres和redis准备了一个运行的容器,用于各种用途。然而,我几个月前就从命令行开始了。现在我正在尝试安装一个新的应用程序,其方法是编写一个docker compose文件,其中包括postgres和redis作为服务

是否可以修改compose文件以指定已经运行的容器?Postgres已经在存储任何数据方面做得很好,我无法想象重用正在运行的redis会是一个问题

我应该重复使用它们吗?我突然想到,我可以为这两者运行多个容器,我不确定这会有什么不利之处(除了混乱的docker ps输出)

当我将container_name设置为现有容器的名称时,我得到了一个非常典型的错误:

cb7cb3e78dc50b527f71b71b7842e1a1c". You have to remove (or rename) that container to be able to reuse that name.
其次是一些已在使用的端口(5432、6579等)


关于Stackoverflow的其他回答表明,如果我最初从另一个具有完全相同细节的compose文件调用这些服务,我也可以在这里这样做,它将重用它们。但我用来启动它们的命令不知何故从未写入我的bash_历史记录中,因此我甚至不确定详细信息(除了名称、端口和始终重新启动)

您正在寻找docker compose的
外部链接
关键字吗

外部链接
允许您重用已经运行的容器

根据:

此关键字链接到此docker-compose.yml之外甚至compose之外开始的容器,特别是对于提供共享或公共服务的容器。指定容器名称和链接别名(容器:别名)时,外部链接遵循与传统选项链接类似的语义

下面是语法:

external_links:
 - redis_1
 - project_db_1:mysql
 - project_db_1:postgresql

您可能不想继续使用不知道如何创建的容器。但是,好消息是,您应该能够通过使用命令检查容器,来了解如何再次创建容器

$ docker container inspect ID

这将显示所有设置,docker compose特定的设置将位于
Config.Labels
下。对于跨项目的容器重用,您可能会对
com.docker.compose.project
com.docker.compose.service
的值感兴趣,这样,您就可以将它们传递给
docker compose--project name
,并在
docker compose.yaml

中使用它们作为服务的名称。您可以为容器命名。如果没有具有给定名称的容器,则这是第一次运行映像。如果找到命名容器,请重新启动容器。 这样,就可以重用容器。这是我的示例脚本

containerName="IamContainer"
if docker ps -a --format '{{.Names}}' | grep -Eq "^${containerName}\$"; then
  docker restart ${containerName}
else
  docker run --name ${containerName} -d  hello-world
fi

您可以使用
docker inspect CONTAINER\u ID
查看详细信息。所谓“重用”,您的意思是“使用现有数据库的数据”或“使用相同的实例/进程”?@constantingalbun重用容器,而不是其中的数据库。我希望为新的应用程序创建一个新的数据库,使用它自己的用户名/密码。但是相同的实例/过程(容器是Docker上下文中的正确术语,不是吗?)“链接是一个遗留选项。我们建议改用网络。”