在 Docker 上运行 Metabase
为了获得快速、可靠和安全的部署,避免自托管带来的工作或隐藏成本,请查看 Metabase 云。
Metabase 通过 Dockerhub 提供官方 Docker 镜像,可用于在任何运行 Docker 的系统上进行部署。
如果你想在 Docker 上升级你的 Metabase 版本,请查看这些 升级说明。
开源版本快速入门
使用此快速入门在本地运行 Metabase 开源版本。有关在生产环境中运行 Metabase 的说明,请参见下文 在生产环境中运行 Metabase。
假设你已安装并运行 Docker,请获取最新的 Docker 镜像
docker pull metabase/metabase:latest
然后启动 Metabase 容器
docker run -d -p 3000:3000 --name metabase metabase/metabase
默认情况下,这将启动一个在端口 3000 上运行的 Metabase 服务器。
可选:要查看开源 Metabase 初始化时的日志,请运行
docker logs -f metabase
启动完成后,你可以通过以下地址访问你的开源 Metabase:https://127.0.0.1:3000
。
要在不同的端口(例如端口 12345)上运行你的开源 Metabase
docker run -d -p 12345:3000 --name metabase metabase/metabase
Pro 或 企业版快速入门
如果你拥有 许可证令牌,用于 Metabase Pro 或企业版,并且想在本地运行 Metabase,请使用此快速入门。有关在生产环境中运行 Metabase 的说明,请参见下文 在生产环境中运行 Metabase。
假设你已安装并运行 Docker,请获取最新的 Docker 镜像
docker pull metabase/metabase-enterprise:latest
然后启动 Metabase 容器
docker run -d -p 3000:3000 --name metabase metabase/metabase-enterprise
默认情况下,这将启动一个在端口 3000 上运行的 Metabase 服务器。
可选:要查看 Metabase 初始化时的日志,请运行
docker logs -f metabase
启动完成后,你可以通过以下地址访问你的 Pro 或 企业版 Metabase:https://127.0.0.1:3000
。
要在不同的端口(例如端口 12345)上运行你的 Pro 或 企业版 Metabase
docker run -d -p 12345:3000 --name metabase metabase/metabase-enterprise
生产环境安装
Metabase 自带一个嵌入式 H2 数据库,它使用文件系统来存储自身的应用程序数据。这意味着,如果你删除容器,你将丢失你的 Metabase 应用程序数据(你的问题、仪表板、集合等等)。
如果你想在生产环境中运行 Metabase,你需要将你的应用程序数据存储在一个 生产就绪的数据库 中。
一旦你为 Metabase 准备好了一个数据库(如 Postgres)来存储其应用程序数据,你所需要做的就是向 Metabase 提供连接信息和凭据,以便 Metabase 可以连接到它。
在生产环境中运行 Docker
假设你通过运行以下命令设置了一个 Postgres 数据库
createdb metabaseappdb
无需添加任何表;Metabase 将在启动时创建这些表。并且假设可以通过 my-database-host:5432
主机名 name
用户名和 password
密码访问该数据库。
这是一个告诉 Metabase 使用该数据库的 Docker 命令示例
docker run -d -p 3000:3000 \
-e "MB_DB_TYPE=postgres" \
-e "MB_DB_DBNAME=metabaseappdb" \
-e "MB_DB_PORT=5432" \
-e "MB_DB_USER=name" \
-e "MB_DB_PASS=password" \
-e "MB_DB_HOST=my-database-host" \
--name metabase metabase/metabase
请记住,Metabase 将从你的 Docker 容器内部连接,因此请确保:a) 你正在使用完全限定的主机名,或者 b) 你已在容器的 /etc/hosts file
文件中设置了正确的条目。
迁移到生产环境安装
如果你已经使用默认的应用程序数据库 (H2) 运行 Metabase,并且想使用生产就绪的应用程序数据库而不丢失你的应用程序数据(你的问题、仪表板等),请参阅 从 H2 迁移到生产数据库。
Docker compose YAML 文件示例
这是一个用于运行 Metabase 并使用 PostgreSQL 数据库 metabaseappdb
的 docker-compose.yml
文件示例
version: "3.9"
services:
metabase:
image: metabase/metabase:latest
container_name: metabase
hostname: metabase
volumes:
- /dev/urandom:/dev/random:ro
ports:
- 3000:3000
environment:
MB_DB_TYPE: postgres
MB_DB_DBNAME: metabaseappdb
MB_DB_PORT: 5432
MB_DB_USER: metabase
MB_DB_PASS: mysecretpassword
MB_DB_HOST: postgres
networks:
- metanet1
healthcheck:
test: curl --fail -I https://127.0.0.1:3000/api/health || exit 1
interval: 15s
timeout: 5s
retries: 5
postgres:
image: postgres:latest
container_name: postgres
hostname: postgres
environment:
POSTGRES_USER: metabase
POSTGRES_DB: metabaseappdb
POSTGRES_PASSWORD: mysecretpassword
networks:
- metanet1
networks:
metanet1:
driver: bridge
额外的 Docker 维护和配置
- 自定义 Metabase Jetty 服务器
- Docker 特定的环境变量
- 设置 Java 时区
- 复制应用程序数据库
- 挂载映射的文件存储卷
- 如果你停止了容器,如何恢复你的配置
- 添加外部依赖项或插件
- 使用 Docker Secrets 隐藏敏感参数
- 故障排除
- 继续设置
自定义 Metabase Jetty 服务器
你可以通过在 Docker 运行命令中设置环境变量来使用来自 自定义 Metabase Jetty Web 服务器 的任何自定义设置。
Docker 特定的环境变量
除了标准的自定义设置外,还有两个 Docker 特定的环境变量 MUID
和 MGID
,它们用于设置 Metabase 在 Docker 容器中运行时使用的用户和组 ID。这些设置使得在主机和容器之间共享文件(例如应用程序数据库)时,可以匹配文件权限。
以下是如何使用由你的账户拥有并存储在你的主目录中的数据库文件的方法
docker run -d -v ~/my-metabase-db:/metabase.db --name metabase -e MB_DB_FILE=/metabase.db -e MUID=$UID -e MGID=$GID -p 3000:3000 metabase/metabase
设置 Java 时区
最好将你的 Java 时区设置为与你希望所有报告显示的的时区一致。你可以通过简单地指定 JAVA_TIMEZONE
环境变量来实现这一点,Metabase 启动脚本会拾取这个变量。例如
docker run -d -p 3000:3000 \
-e "JAVA_TIMEZONE=US/Pacific" \
--name metabase metabase/metabase
复制应用程序数据库
容器中应用程序数据库的默认位置是 /metabase.db/metabase.db.mv.db
。你可以使用以下命令将此目录从容器中复制出来(将 CONTAINER_ID
替换为实际的容器 ID 或名称,如果你命名了容器,则为 metabase
)
docker cp CONTAINER_ID:/metabase.db ./
数据库内容将保留在名为 metabase.db 的目录中。
挂载映射的文件存储卷
为了在容器外部持久化你的数据,并使其在容器启动之间可用,我们可以在容器内挂载一个本地文件路径。
docker run -d -p 3000:3000 \
-v ~/metabase-data:/metabase-data \
-e "MB_DB_FILE=/metabase-data/metabase.db" \
--name metabase metabase/metabase
当你启动容器时,Metabase 将使用位于 ~/metabase-data/metabase.db
的数据库文件(MB_DB_FILE
),而不是其默认位置。并且我们将该文件夹从本地文件系统挂载到容器中。
如果你停止了容器,如何恢复你的配置
如果你之前使用本地数据库运行并配置了 Metabase,然后停止了容器,那么你的数据仍然会存在,除非你使用 docker rm
命令删除了容器。要恢复你之前的配置
1. 使用 docker ps -a
命令查找已停止的容器。它看起来会像这样
docker ps -a | grep metabase
ca072cd44a49 metabase/metabase "/app/run_metabase.sh" About an hour ago Up About an hour 0.0.0.0:3000->3000/tcp metabase
02e4dff057d2 262aa3d0f714 "/app/run_metabase.sh" 23 hours ago Exited (0) 23 hours ago pedantic_hypatia
0d2170d4aa4a 262aa3d0f714 "/app/run_metabase.sh" 23 hours ago Exited (0) 23 hours ago stoic_lumiere
一旦你确定了包含你的配置的已停止容器,请从最左列中保存容器 ID 以进行下一步。
2. 使用 docker commit
从包含你的配置的已停止容器创建一个新的自定义 Docker 镜像。
docker commit ca072cd44a49 mycompany/metabase-custom
sha256:9ff56186de4dd0b9bb2a37c977c3a4c9358647cde60a16f11f4c05bded1fe77a
3. 使用 docker run
运行你的新镜像,以再次启动并运行。
docker run -d -p 3000:3000 --name metabase mycompany/metabase-custom
430bb02a37bb2471176e54ca323d0940c4e0ee210c3ab04262cb6576fe4ded6d
您应该能恢复您之前配置的 Metabase 安装。如果这不是您预期的那个,请尝试另一个已停止的容器并重复这些步骤。
添加外部依赖项或插件
要添加外部依赖 JAR 文件(例如 Oracle 或 Vertica JDBC 驱动程序或第三方 Metabase 驱动程序),您需要
- 在您的主机系统中创建一个
plugins
目录,并且 - 绑定该目录,使其作为路径
/plugins
对 Metabase 可用(使用--mount
或-v
/--volume
)。
例如,如果您的主机系统上有一个名为 /path/to/plugins
的目录,您可以使用 --mount
选项使其内容对 Metabase 可用,如下所示
docker run -d -p 3000:3000 \
--mount type=bind,source=/path/to/plugins,destination=/plugins \
--name metabase metabase/metabase
请注意,Metabase 将使用此目录来提取默认 Metabase 发行版捆绑的插件(例如各种数据库(如 SQLite)的驱动程序),因此 Docker 必须具有对其的读取和写入权限。
使用 Docker Secrets 隐藏敏感参数
为了使您的连接参数不被明文显示,您可以使用 Docker Secrets 将所有参数放入文件中,以便 Docker 可以在启动容器之前读取它们并将它们加载到内存中。
这是一个示例 docker-compose.yml
文件,用于启动带有 secrets 的 Metabase Docker 容器以连接到 PostgreSQL 数据库。
除了这个示例 yml 文件之外,您还需要创建两个文件
db_user.txt
db_password.txt
这些文件应与 docker-compose.yml
位于同一目录下。将 db_user
放入 db_user.txt
文件,并将 db_password 放入 db_password.txt
文件。
请注意具有 secret 的环境变量上的 “_FILE”
version: "3.9"
services:
metabase:
image: metabase/metabase:latest
container_name: metabase
hostname: metabase
volumes:
- /dev/urandom:/dev/random:ro
ports:
- 3000:3000
environment:
MB_DB_TYPE: postgres
MB_DB_DBNAME: metabase
MB_DB_PORT: 5432
MB_DB_USER_FILE: /run/secrets/db_user
MB_DB_PASS_FILE: /run/secrets/db_password
MB_DB_HOST: postgres
networks:
- metanet1
secrets:
- db_password
- db_user
healthcheck:
test: curl --fail -I https://127.0.0.1:3000/api/health || exit 1
interval: 15s
timeout: 5s
retries: 5
postgres:
image: postgres:latest
container_name: postgres
hostname: postgres
environment:
POSTGRES_USER_FILE: /run/secrets/db_user
POSTGRES_DB: metabase
POSTGRES_PASSWORD_FILE: /run/secrets/db_password
networks:
- metanet1
secrets:
- db_password
- db_user
networks:
metanet1:
driver: bridge
secrets:
db_password:
file: db_password.txt
db_user:
file: db_user.txt
我们目前支持以下 环境变量 用作 secrets
MB_DB_USER
MB_DB_PASS
MB_DB_CONNECTION_URI
MB_EMAIL_SMTP_PASSWORD
MB_EMAIL_SMTP_USERNAME
MB_LDAP_PASSWORD
MB_LDAP_BIND_DN
为了使 Metabase 容器能够读取文件并将内容用作 secret,环境变量名称需要附加 “_FILE”,如上所述。
故障排除
请参阅故障排除指南中的“运行 Metabase”。
继续设置
现在您已经安装了 Metabase,是时候设置它并将其连接到您的数据库了。
阅读其他Metabase 版本的文档。