docker-compose服务名称和容器名称区别

需求及结论

在docker-compose文件一般书写如下:

version: '3.8'
x-logging: &default-logging
  options:
    max-size: "200m"
    max-file: "5"
  driver: json-file
x-environment: &default-environment
  TZ: Asia/Shanghai
  LANG: C.UTF-8
services:
  common-redis:
    image: "redis:6.2"
    container_name: "demo35-redis"
    ports:
      - "3535:6379"
    network_mode: demo35
    restart: always
    environment: *default-environment
    logging: *default-logging

networks:
  demo35:
    external: true

其中common-redis是服务名称,demo35-redis是容器名称,一般在使用的时候都写成一样的。

但是由于公司正在开发项目太多,每次都改docker-compose文件的很多地方,比如容器名、服务名这些。非常繁琐,而且容易出错。就在想如果同一台服务器,不同docker-compose文件中服务名称可以一致,容器名称需要同一台服务器唯一。那就可以把容器名称配置成占位符,服务名称不变,减少工作量。

先说结论:上述猜想正确,同一台服务器,容器名称必须唯一,但是服务名称只需要保证同一个docker-compose中唯一即可。但是需要确保两个docker-compose文件在不同目录中。

测试过程

测试的目录结构如下:

docker_test
├── docker35
│   └── docker-compose-demo35.yml
└── docker36
    └── docker-compose-demo36.yml

docker-compose-demo35.yml文件内容:

version: '3.8'
x-logging: &default-logging
  options:
    max-size: "200m"
    max-file: "5"
  driver: json-file
x-environment: &default-environment
  TZ: Asia/Shanghai
  LANG: C.UTF-8
services:
  common-redis:
    image: "redis:6.2"
    container_name: "demo35-redis"
    ports:
      - "3535:6379"
    network_mode: demo35
    restart: always
    environment: *default-environment
    logging: *default-logging

networks:
  demo35:
    external: true

docker-compose-demo36.yml文件内容:

version: '3'
x-logging: &default-logging
  options:
    max-size: "200m"
    max-file: "5"
  driver: json-file
x-environment: &default-environment
  TZ: Asia/Shanghai
  LANG: C.UTF-8
services:
  common-redis:
    image: "redis:6.2"
    container_name: "demo36-redis"
    ports:
      - "3636:6379"
    network_mode: demo36
    restart: always
    environment: *default-environment
    logging: *default-logging

networks:
    demo36:
        external: true

可以看到上述两个文件,服务名称一致,都是common-redis,但是容器名称不一致,分别为demo35-redis和demo36-redis。

启动demo35文件夹下的服务,使用docker-compose -f docker-compose-demo35.yml up -d

启动docker36文件夹下的服务,使用docker-compose -f docker-compose-demo36.yml up -d

查看服务是否正常:

 发现两个服务均正常启动。

服务名称和容器名称的区别

1. 服务名称表示docker-compose中的服务名,如果使用docker-compose start等命令进行操作的时候,指定的是服务名而不是容器名,比如docker-compose start common-redis。服务名称是docker-compose文件唯一的。两个或者多个docker-compose可以不唯一。比如上述两个文件都叫common-redis。docker-compose ps 看到的是服务名称。

2. 容器名称是容器的名字,同一个服务器上只能有一个正常运行的同名容器,我们在docker ps时候看到的是容器名。

 

你可能感兴趣的:(docker,docker,容器,运维)