docker-compose.yml
文件定义的项目命名空间通常指的是 Docker Compose 为每个项目创建的一组资源(如容器、网络和卷)所使用的前缀。这个命名空间是由项目的上下文路径(通常是包含 docker-compose.yml
文件的目录名称)和可能的自定义项目名称组合而成。
如何查看项目命名空间
默认情况下:
- 基于目录名称:默认情况下,Docker Compose 使用包含
docker-compose.yml
文件的目录名作为项目命名空间。例如,如果你有一个名为my_project
的文件夹,那么所有生成的容器、网络和卷都会以前缀my_project_
开头。
自定义项目名称:
- 通过命令行参数指定:你可以使用
-p
或--project-name
参数来指定一个自定义的项目名称。例如:
docker-compose -p my_custom_project up -d
这将使所有生成的资源以前缀 my_custom_project_
开头。
- 环境变量设置:你也可以通过设置
COMPOSE_PROJECT_NAME
环境变量来改变默认的项目命名空间。例如:
export COMPOSE_PROJECT_NAME=my_custom_project
docker-compose up -d
查看项目命名空间的方法:
- 列出所有容器:运行
docker ps
或docker container ls
命令,查看容器名称。它们通常会以<project_name>_service_name_<number>
的格式显示。 - 列出所有网络:运行
docker network ls
命令,查找带有项目名称前缀的网络。 - 列出所有卷:运行
docker volume ls
命令,查找带有项目名称前缀的卷。
底层原理
当 Docker Compose 解析 docker-compose.yml
文件时,它会根据上述规则确定项目的命名空间,并据此创建相应的资源。具体来说:
- 容器名称:每个服务启动时,Docker Compose 会为它创建一个或多个容器,这些容器的名字将包含项目命名空间和服务名称。
- 网络配置:如果在
docker-compose.yml
中定义了自定义网络,Docker Compose 会创建一个新的网络,并为其分配一个带有项目命名空间前缀的名字。 - 卷管理:对于任何声明的卷,Docker Compose 同样会给它们加上项目命名空间前缀,确保它们不会与其他项目的卷混淆。
- 依赖关系:Docker Compose 使用项目命名空间来解析服务间的依赖关系,确保正确的启动顺序和服务间通信。
示例代码和详细注释
假设我们有一个简单的 PHP Web 应用程序和 MySQL 数据库的组合,并且我们想让它们通过 Docker Compose 来管理和部署。
目录结构
my_php_app/
├── docker-compose.yml
├── php/
│ └── Dockerfile
└── web/
└── index.php
index.php
内容(简化版)
<?php
// 连接MySQL数据库并查询一条记录
$host = getenv('DB_HOST') ?: 'db_service'; // 注意这里使用的是环境变量或自定义的服务名称作为主机名
$username = 'user';
$password = 'password';
$database = 'mydb';
try {
$pdo = new PDO("mysql:host=$host;dbname=$database", $username, $password);
$stmt = $pdo->query("SELECT 'Hello from MySQL!' AS message");
$row = $stmt->fetch(PDO::FETCH_ASSOC);
echo $row['message'];
} catch (PDOException $e) {
die("Could not connect to the database: " . $e->getMessage());
}
?>
php/Dockerfile
内容
# 使用官方 PHP 镜像作为基础镜像,包含 PHP-FPM 和 MySQL 扩展
FROM php:7.4-fpm
# 安装 MySQL 扩展
RUN docker-php-ext-install pdo pdo_mysql
# 设置工作目录
WORKDIR /var/www/html
# 将当前目录下的所有文件复制到容器中的 /var/www/html 目录
COPY ../web ./
# 暴露容器的9000端口,用于PHP-FPM通信
EXPOSE 9000
docker-compose.yml
内容
version: '3'
services:
web_service: # 自定义的服务名称,表示Web服务器
build: ./php
volumes:
- ./web:/var/www/html
ports:
- "8080:80"
networks:
- my_custom_network
depends_on:
- db_service
db_service: # 自定义的服务名称,表示数据库
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: mydb
MYSQL_USER: user
MYSQL_PASSWORD: password
volumes:
- db_data:/var/lib/mysql
networks:
- my_custom_network
networks:
my_custom_network:
volumes:
db_data:
启动应用并查看项目命名空间
在项目根目录下执行以下命令来启动所有服务,并创建自定义桥接网络:
# 构建镜像并启动容器,创建自定义桥接网络
docker-compose up -d
# 查看正在运行的容器及其命名空间
docker ps
# 查看与项目相关的网络
docker network ls | grep my_php_app
# 查看与项目相关的卷
docker volume ls | grep my_php_app
总结
docker-compose.yml
文件定义的项目命名空间是 Docker Compose 创建资源时使用的前缀,默认情况下基于包含该文件的目录名称。你可以通过命令行参数或环境变量自定义项目名称。了解项目命名空间可以帮助你更好地组织和管理 Docker 资源,防止不同项目之间发生冲突。