docker容器如何使用.env文件

使用 .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 文件,并将变量注入到 mysqlwordpress 服务的环境变量中。
  • -d 表示后台运行。

5. 验证启动

  • 检查容器状态
  docker-compose ps

确认 mysql_containerwordpress_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.envdev.env,然后通过 --env-file 指定:

docker-compose --env-file prod.env up -d

默认情况下,docker-compose 只加载项目目录下的 .env 文件。

环境变量优先级

Docker Compose 按以下优先级加载环境变量:

  1. docker-compose.yml 中的 environment 字段。
  2. .env 文件中的变量。
  3. 宿主机的 shell 环境变量。
  4. 默认值(如果使用 ${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

注意事项

  1. 安全性
  • 不要将 .env 文件提交到公共仓库。
  • 使用强密码,并在生产环境中加密 .env 文件或使用秘密管理工具(如 Docker Secrets 或 HashiCorp Vault)。
  1. 变量一致性
  • 确保 .env 文件中的变量(如 MYSQL_USERWORDPRESS_DB_USER)匹配,防止连接失败。
  • WORDPRESS_DB_HOST 应始终使用服务名(mysql),而非 IP 地址,以适应容器 IP 变化。
  1. 调试
  • 如果 WordPress 无法连接 MySQL,检查日志:
    bash docker-compose logs wordpress docker-compose logs mysql
  • 确认 .env 文件是否正确加载:
    bash docker-compose config
  1. 文件路径
  • .env 文件必须位于 docker-compose.yml 所在的目录,或通过 --env-file 指定路径。
  1. 生产环境优化
  • 移除 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,完成博客网站配置!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注