在使用 Docker 容器化的数据库时,你通常需要在应用程序的连接字符串中引用 Docker 容器的网络地址。以下是一些常见的场景和示例,展示如何在连接字符串中引用 Docker 容器。
如果你使用 Docker Compose 来管理多个容器,可以通过服务名称来引用容器。Docker Compose 会自动为每个服务创建一个网络别名,这使得服务之间的通信变得非常简单。
docker-compose.yml
假设你有一个使用 PostgreSQL 的应用程序:
version: '3.8'
services:
db:
image: postgres:13
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydatabase
ports:
- "5432:5432"
app:
image: myapp:latest
depends_on:
- db
environment:
DATABASE_URL: "postgresql://user:password@db:5432/mydatabase"
在这个示例中,app
服务可以通过服务名称 db
来引用 PostgreSQL 数据库。连接字符串 postgresql://user:password@db:5432/mydatabase
中的 db
就是 db
服务的名称。
如果你没有使用 Docker Compose,而是手动启动容器,你可以创建一个自定义 Docker 网络,并将容器连接到该网络。
docker network create mynetwork
docker run -d --name mydb --network mynetwork -e POSTGRES_USER=user -e POSTGRES_PASSWORD=password -e POSTGRES_DB=mydatabase postgres:13
docker run -d --name myapp --network mynetwork -e DATABASE_URL="postgresql://user:password@mydb:5432/mydatabase" myapp:latest
在这个示例中,myapp
容器可以通过容器名称 mydb
来引用 PostgreSQL 数据库。连接字符串 postgresql://user:password@mydb:5432/mydatabase
中的 mydb
就是数据库容器的名称。
如果你不想使用 Docker 网络或 Docker Compose,你也可以使用 Docker 主机的 IP 地址和映射的端口来连接到容器。
docker run -d --name mydb -p 5432:5432 -e POSTGRES_USER=user -e POSTGRES_PASSWORD=password -e POSTGRES_DB=mydatabase postgres:13
在 Linux 上,你可以使用 hostname -I
命令获取 Docker 主机的 IP 地址。在 macOS 和 Windows 上,Docker Desktop 提供了一个虚拟网络接口,通常是 host.docker.internal
。
DATABASE_URL="postgresql://user:password@host.docker.internal:5432/mydatabase"
在这个示例中,连接字符串 postgresql://user:password@host.docker.internal:5432/mydatabase
中的 host.docker.internal
是 Docker 主机的网络地址。
以下是一个使用 Docker Compose 的完整示例,展示了如何在连接字符串中引用 Docker 容器:
docker-compose.yml
version: '3.8'
services:
db:
image: postgres:13
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydatabase
ports:
- "5432:5432"
app:
image: myapp:latest
depends_on:
- db
environment:
DATABASE_URL: "postgresql://user:password@db:5432/mydatabase"
app.py
(假设这是一个 Python 应用)import os
import psycopg2
# 从环境变量中获取连接字符串
database_url = os.getenv('DATABASE_URL')
# 连接到数据库
conn = psycopg2.connect(database_url)
# 执行查询
cur = conn.cursor()
cur.execute("SELECT 1")
print(cur.fetchone())
# 关闭连接
cur.close()
conn.close()
通过这些步骤,你可以在连接字符串中引用 Docker 容器,从而使你的应用程序能够与容器化的数据库进行通信。
领取专属 10元无门槛券
手把手带您无忧上云