使用 Docker Compose 可以更方便地管理多个容器,特别是在需要同时运行多个服务(例如 FastAPI 应用程序和数据库服务)时。以下是一个详细的步骤指南,帮助你创建一个 docker-compose.yml
文件,并定义你的服务。
Step-by-Step Guide to Using Docker Compose
1. 安装 Docker Compose
首先,确保你已经安装了 Docker Compose。可以通过以下命令检查是否已安装:
bash
复制
docker-compose --version
如果尚未安装,可以按照 Docker 官方文档 的说明进行安装。
2. 创建 docker-compose.yml
文件
在你的项目根目录下创建一个 docker-compose.yml
文件。这个文件将定义你的服务、网络和卷。
以下是一个示例 docker-compose.yml
文件,包含 FastAPI 应用程序和一个 PostgreSQL 数据库服务:
yaml
复制
version: '3.8'
services:
app:
build: . # 指定使用当前目录下的 Dockerfile 构建镜像
ports:
- "8000:8000" # 映射端口,将宿主机的 8000 端口映射到容器的 8000 端口
environment:
- DATABASE_URL=postgresql://user:password@db:5432/mydatabase # 设置环境变量
depends_on: # 确保在启动 app 之前先启动 db 服务
- db
db:
image: postgres:13 # 使用官方的 PostgreSQL 13 镜像
environment:
- POSTGRES_USER=user # 数据库用户名
- POSTGRES_PASSWORD=password # 数据库密码
- POSTGRES_DB=mydatabase # 数据库名称
ports:
- "5432:5432" # 映射数据库端口(可选,仅在需要从宿主机访问数据库时使用)
volumes:
- db_data:/var/lib/postgresql/data # 数据库数据卷,用于持久化数据
volumes:
db_data: # 定义一个卷,用于存储数据库数据
3. 解释 docker-compose.yml
文件的内容
-
version
:-
指定 Docker Compose 文件的版本。
3.8
是一个常用的版本,支持大多数功能。
-
-
services
:-
定义了两个服务:
app
和db
。 -
app
服务:-
build
: 指定使用当前目录下的Dockerfile
构建镜像。 -
ports
: 将宿主机的 8000 端口映射到容器的 8000 端口。 -
environment
: 设置环境变量,例如数据库连接字符串。 -
depends_on
: 确保在启动app
服务之前先启动db
服务。
-
-
db
服务:-
image
: 使用官方的 PostgreSQL 13 镜像。 -
environment
: 设置 PostgreSQL 的环境变量,包括用户名、密码和数据库名称。 -
ports
: 将宿主机的 5432 端口映射到容器的 5432 端口(可选,仅在需要从宿主机访问数据库时使用)。 -
volumes
: 使用一个卷来持久化数据库数据。
-
-
-
volumes
:-
定义了一个卷
db_data
,用于存储数据库数据,确保数据在容器重启后不会丢失。
-
4. 启动服务
在项目根目录下运行以下命令来启动服务:
bash
复制
docker-compose up
-
这将根据
docker-compose.yml
文件中的定义构建镜像并启动容器。 -
默认情况下,
docker-compose up
会以交互模式运行,你可以在终端中看到日志输出。
如果你想在后台运行服务,可以使用以下命令:
bash
复制
docker-compose up -d
5. 验证服务
-
打开浏览器并访问
http://localhost:8000
,你应该能够看到 FastAPI 应用程序正在运行。 -
如果需要从宿主机访问数据库,可以使用工具(如 pgAdmin 或 psql)连接到
localhost:5432
,用户名为user
,密码为password
。
6. 停止服务
当你不再需要运行服务时,可以使用以下命令停止并移除容器:
bash
复制
docker-compose down
-
这将停止所有服务并移除容器和网络。
-
如果你希望保留数据卷,可以不使用
down
命令,而是使用docker-compose stop
来停止服务。
7. 额外提示
-
环境变量文件:
-
如果你的环境变量较多,可以将它们放在一个
yaml.env
文件中,然后在docker-compose.yml
中使用env_file
指令加载。例如:复制
app: build: . ports: - "8000:8000" env_file: - .env # 加载 .env 文件中的环境变量 depends_on: - db
-
-
自定义网络:
-
如果需要更复杂的网络配置,可以在
yamldocker-compose.yml
中定义自定义网络。例如:复制
version: '3.8' services: app: build: . ports: - "8000:8000" networks: - mynetwork db: image: postgres:13 networks: - mynetwork networks: mynetwork: driver: bridge
-
通过以上步骤,你可以使用 Docker Compose 管理多个容器,轻松运行 FastAPI 应用程序和数据库服务。