需求及结论
在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时候看到的是容器名。