
使用 .env
文件来启动 WordPress 容器可以通过 Docker Compose 实现,它允许将敏感信息(如数据库密码)或可变配置从 docker-compose.yml
中分离出来,提高安全性和配置灵活性。以下是详细步骤,说明如何在 Docker Compose 中结合 .env
文件启动 WordPress 和 MySQL 容器,延续之前的 MySQL 和 WordPress 配置。
步骤:使用 .env 文件启动 WordPress 容器
1. 创建 .env 文件
在项目目录(包含 docker-compose.yml
的目录)下创建 .env
文件,用于存储环境变量。例如:
# MySQL 配置
MYSQL_ROOT_PASSWORD=rootpassword
MYSQL_DATABASE=wordpress
MYSQL_USER=wordpress_user
MYSQL_PASSWORD=wordpress_password
# WordPress 配置
WORDPRESS_DB_HOST=mysql
WORDPRESS_DB_USER=wordpress_user
WORDPRESS_DB_PASSWORD=wordpress_password
WORDPRESS_DB_NAME=wordpress
- 说明:
- 每个变量为
键=值
格式,不需要引号。 - 这些变量会被 Docker Compose 自动加载,并在
docker-compose.yml
中引用。 - 敏感信息(如密码)存储在
.env
中,避免硬编码在 YAML 文件中。
2. 修改 docker-compose.yml
更新 docker-compose.yml
文件,使用 ${VARIABLE_NAME}
语法引用 .env
文件中的变量。以下是完整的配置文件:
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: mysql_container
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
restart: unless-stopped
networks:
- wp-network
wordpress:
image: wordpress:latest
container_name: wordpress_container
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: ${WORDPRESS_DB_HOST}
WORDPRESS_DB_USER: ${WORDPRESS_DB_USER}
WORDPRESS_DB_PASSWORD: ${WORDPRESS_DB_PASSWORD}
WORDPRESS_DB_NAME: ${WORDPRESS_DB_NAME}
volumes:
- wordpress_data:/var/www/html
depends_on:
- mysql
restart: unless-stopped
networks:
- wp-network
volumes:
mysql_data:
wordpress_data:
networks:
wp-network:
driver: bridge
- 关键点:
environment
字段使用${VARIABLE_NAME}
引用.env
文件中的变量。- 确保变量名与
.env
文件中的键完全一致。 WORDPRESS_DB_HOST: ${WORDPRESS_DB_HOST}
使用服务名mysql
,因为 Docker Compose 的 DNS 解析会将其解析为 MySQL 容器的 IP。
3. 保护 .env 文件
- 文件权限:设置
.env
文件为仅限用户读取,防止未经授权访问:
chmod 600 .env
- 添加到 .gitignore:如果项目使用 Git 版本控制,将
.env
添加到.gitignore
,避免将敏感信息提交到代码仓库:
.env
4. 启动容器
在包含 docker-compose.yml
和 .env
的目录下运行:
docker-compose up -d
- Docker Compose 会自动加载
.env
文件,并将变量注入到mysql
和wordpress
服务的环境变量中。 -d
表示后台运行。
5. 验证启动
- 检查容器状态:
docker-compose ps
确认 mysql_container
和 wordpress_container
都在运行。
- 访问 WordPress:
打开浏览器,访问http://localhost:8080
,完成 WordPress 安装向导。 - 验证 MySQL 连接:
进入 WordPress 容器,测试连接到 MySQL:
docker exec -it wordpress_container bash
mysql -h mysql -u wordpress_user -p
输入 .env
中定义的 wordpress_password
,确认连接成功。
6. 查看环境变量
若需确认容器内是否正确加载了 .env
文件中的变量:
docker exec wordpress_container env
输出会显示 WORDPRESS_DB_HOST
, WORDPRESS_DB_USER
等变量的值。
WordPress 如何使用 .env 文件
- WordPress 容器通过环境变量(如
WORDPRESS_DB_HOST
,WORDPRESS_DB_USER
)连接到 MySQL。这些变量由 Docker Compose 从.env
文件注入。 - 在容器启动时,WordPress 的 PHP 代码读取这些环境变量(通过
getenv()
函数),并在初始化时配置数据库连接。 - Docker Compose 的 DNS 解析确保
WORDPRESS_DB_HOST: mysql
正确解析为 MySQL 容器的 IP 地址(参见之前的网络机制说明)。
进阶配置
默认值和变量替换
若 .env
文件中缺少某些变量,可以在 docker-compose.yml
中提供默认值:
environment:
WORDPRESS_DB_HOST: ${WORDPRESS_DB_HOST:-mysql}
WORDPRESS_DB_NAME: ${WORDPRESS_DB_NAME:-wordpress_default}
${VARIABLE_NAME:-default}
:如果变量未定义,使用默认值。
多个 .env 文件
Docker Compose 支持加载多个环境文件。例如,创建 prod.env
和 dev.env
,然后通过 --env-file
指定:
docker-compose --env-file prod.env up -d
默认情况下,docker-compose
只加载项目目录下的 .env
文件。
环境变量优先级
Docker Compose 按以下优先级加载环境变量:
docker-compose.yml
中的environment
字段。.env
文件中的变量。- 宿主机的 shell 环境变量。
- 默认值(如果使用
${VARIABLE_NAME:-default}
)。
Podman 兼容性
Podman Compose 支持相同的 .env
文件机制。使用与 Docker Compose 相同的 docker-compose.yml
和 .env
文件,运行:
podman-compose up -d
或通过 Podman 的 podman.socket
使用 Docker Compose:
sudo systemctl enable --now podman.socket
export DOCKER_HOST=unix:///run/podman/podman.sock
docker-compose up -d
注意事项
- 安全性:
- 不要将
.env
文件提交到公共仓库。 - 使用强密码,并在生产环境中加密
.env
文件或使用秘密管理工具(如 Docker Secrets 或 HashiCorp Vault)。
- 变量一致性:
- 确保
.env
文件中的变量(如MYSQL_USER
和WORDPRESS_DB_USER
)匹配,防止连接失败。 WORDPRESS_DB_HOST
应始终使用服务名(mysql
),而非 IP 地址,以适应容器 IP 变化。
- 调试:
- 如果 WordPress 无法连接 MySQL,检查日志:
bash docker-compose logs wordpress docker-compose logs mysql
- 确认
.env
文件是否正确加载:bash docker-compose config
- 文件路径:
.env
文件必须位于docker-compose.yml
所在的目录,或通过--env-file
指定路径。
- 生产环境优化:
- 移除 MySQL 的
ports: "3306:3306"
,仅允许 WordPress 通过内部网络访问。 - 使用卷备份和定期导出数据库(参考之前的导出/导入说明)。
总结
- .env 文件:将 MySQL 和 WordPress 的环境变量(如密码、数据库名)存储在
.env
文件中,通过${VARIABLE_NAME}
在docker-compose.yml
中引用。 - 启动流程:运行
docker-compose up -d
,Docker Compose 自动加载.env
,注入变量到容器,WordPress 通过WORDPRESS_DB_HOST: mysql
连接 MySQL。 - 网络机制:WordPress 使用 Docker 的 DNS 解析,通过服务名
mysql
找到 MySQL 容器的 IP。 - 安全与优化:保护
.env
文件,添加健康检查,优化生产环境配置。 - 在 Docker CLI 中,使用
.env
文件可以通过--env-file
选项或结合 shell 环境变量来实现。与 Docker Compose 自动加载.env
文件不同,Docker CLI 需要显式指定.env
文件或手动加载变量到 shell 环境。
通过上述步骤,运行 docker-compose up -d
,访问 http://localhost:8080
,即可启动 WordPress 并连接到 MySQL,完成博客网站配置!