为什么Docker容器名称的末尾会有一个随机数?

时间:2018-11-15 19:46:34

标签: docker docker-compose containers

我有一个docker-compose.yml文件,如下所示(一部分):

version: '3.5'
services:
    framework:
    image: ${DOCKER_REGISTRY}/gme/fmk:${COMPOSE_PROJECT_NAME}
    build: ./fmk
    ports:
      - "2020:2020"
      - "2025:2025"
      - "4999:4999"
    volumes:
      - ${FOLDER_ENV}/workspace/logs/framework:/var/log/gcti
      - ${FOLDER_ENV}/..:/usr/local/genesys/gsg_qaart

我得到的是:

vagrant@docker:/repos/gsg_qaart/docker$ docker-compose ps
]              Name                             Command               State                                             
Ports
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
callback_framework_1_df361f67842c   /bootstrap.sh                    Up      0.0.0.0:2020->2020/tcp, 0.0.0.0:2025->2025/tcp, 0.0.0.0:4999->4999/tcp, 5432/tcp

您可以看到名称很奇怪,它应该是“ callback_framwork_1”,为什么末尾会有一个随机数?

顺便说一句,我正在使用:

vagrant@docker:/repos/gsg_qaart/docker$ docker -v
Docker version 18.09.0, build 4d60db4
vagrant@docker:/repos/gsg_qaart/docker$ docker-compose -v
docker-compose version 1.23.1, build b02f1306

谢谢。

3 个答案:

答案 0 :(得分:5)

编辑。

此更改已在v1.23.2中恢复


因此,撰写v1.23 https://github.com/docker/compose/releases/tag/1.23.0

发生了重要变化
  

Compose在此创建的容器的默认命名方案   版本已从project_service_index更改为   project_service_index_slug,其中slug是   随机生成的十六进制字符串。请确保更新   脚本在升级之前会相应地依赖旧的命名方案。

因此,如果要使用确定性的容器名称,请使用

services:
    framework:
        container_name: framework

答案 1 :(得分:0)

我无法对容器名称进行硬编码,并且希望能够从任何目录运行。所以我最终删除了部分名称:

docker exec -it $(docker ps --format='{{.Names}}' | grep server) bash

答案 2 :(得分:0)

请注意,其他答案/问题排查是有效/正确的,但是尽管docker-compose如何还原了该问题,但我还是想为使用docker-compose提供一些思路。在使用docker-compose服务时,有一个很好的实践值得强调。

我个人的想法是docker-compose,试图改变其工具的使用方式。我在github上阅读了一些暗示这一点的内容,但这是在阅读了他们的一些开发人员反馈后,特别是以下github issue on the slugs的反馈。

使用docker-compose的内部服务机制

我试图概括一下,因为以下示例可能并不完全适用于您的设置,但是它们仍然应该有所帮助。由于您已经在使用docker-compose,因此使用通过docker网络和docker-compose提供的服务发现优于通过容器名称进行硬编码访问。

使用docker-compose时,将创建由1 .. *容器组成的服务。在您的示例中,服务framework是使用1个容器callback_framework_1_df361f67842c创建的。

从另一个Docker容器中访问服务/ Docker容器中的代码

服务可以用于DNS /网络而不是容器名称,即在<protocol>://<host>:<port>/<endpoint>被用作container name的{​​{1}}处,<host>也可以用于容器用作service name(例如在docker网络上的另一个容器内执行ping操作):

<host>

vs

ping <service>
ping framework

以上ping均有效。 Docker负责与适当容器的联网,此外,当有多个容器组成服务时,Docker还负责对容器的负载平衡请求。

通过服务从主机访问容器,即从脚本运行docker命令

如果您有从主机执行的脚本,也可以使用docker-compose代替docker命令:

ping <container-name>
ping callback_framework_1_df361f67842c

vs

docker-compose exec <service> sh
docker-compose exec framework sh

docker-exec默认为第一个容器,但是当有多个容器组成docker服务时,可以使用docker exec -it <container-name> sh docker exec -it callback_framework_1_df361f67842c sh 标志寻址目标容器。有关更多详细信息,请参见docker-compose exec documentation