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

时间:2018-04-11 17:18:55

标签: docker docker-compose docker-container

我已经有一个用于各种事物的postgres和redis的运行容器。但是,几个月前我从命令行启动了这些。现在我正在尝试安装一个新的应用程序,其配方包括写出一个包含postgres和redis作为服务的docker 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上的其他答案表明,如果我最初从具有完全相同细节的另一个撰写文件调用这些服务,我也可以在这里重复使用它并重用它们。但是我用来启动它们的命令在某种程度上从未写入我的bash_history,因此我甚至不确定细节(除名称,端口和重启之外)。

3 个答案:

答案 0 :(得分:3)

您是否在寻找docker-compose的external_links关键字?

external_links允许您重复使用已经运行的容器。

根据docker-compose specification

  

此关键字链接到在此docker-compose.yml之外或甚至在Compose之外启动的容器,尤其是对于提供共享或公共服务的容器。在指定容器名称和链接别名(CONTAINER:ALIAS)时,external_links遵循类似于遗留选项链接的语义。

这是语法:

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

$ docker container inspect ID

这将显示所有设置,docker-compose特定的设置将在Config.Labels下。对于跨项目的容器重用,您会对com.docker.compose.projectcom.docker.compose.service的值感兴趣,以便您可以将它们传递给docker-compose --project-name并将其用作{{1}中的服务名称1}}。