为方便阅读,下面摘录了 Docker Hub
上的指南。可用的 Docker 镜像使用了
官方的 ClickHouse deb 软件包。
Docker pull 命令:
docker pull clickhouse/clickhouse-server
latest 标签指向最新稳定分支的最新发布版本。
22.2 这类分支标签指向对应分支的最新发布版本。
22.2.3 和 22.2.3.5 这类完整版本标签指向对应的发布版本。
head 标签基于默认分支上的最新提交构建。
- 每个标签都可以带有可选的
-alpine 后缀,表示基于 alpine 构建。
- amd64 镜像要求支持 SSE3 指令。
几乎所有 2005 年之后的 x86 CPU 都支持 SSE3。
- arm64 镜像要求支持 ARMv8.2-A 架构,并且
还要求支持 Load-Acquire RCpc 寄存器。该寄存器在 ARMv8.2-A 版本中是可选的,而在
ARMv8.3-A 中则是必需的。Graviton >=2、Azure 和 GCP 实例支持该特性。
不受支持的设备示例包括 Raspberry Pi 4 (ARMv8.0-A) 和 Jetson AGX Xavier/Orin (ARMv8.2-A)。
- 从 ClickHouse 24.11 开始,Ubuntu 镜像使用
ubuntu:22.04 作为基础镜像。它要求 Docker 版本 >= 20.10.10
且包含补丁。作为一种临时变通方案,你也可以
改用 docker run --security-opt seccomp=unconfined,但这会带来安全方面的影响。
docker run -d --name some-clickhouse-server --ulimit nofile=262144:262144 clickhouse/clickhouse-server
默认情况下,ClickHouse 仅可通过 Docker 网络访问。请参见下方的网络部分。
默认情况下,以上启动的服务器实例将以无密码的 default 用户身份运行。
docker run -it --rm --network=container:some-clickhouse-server --entrypoint clickhouse-client clickhouse/clickhouse-server
# 或者
docker exec -it some-clickhouse-server clickhouse-client
有关 ClickHouse 客户端的更多信息,请参阅 ClickHouse 客户端。
echo "SELECT 'Hello, ClickHouse!'" | docker run -i --rm --network=container:some-clickhouse-server buildpack-deps:curl curl 'http://localhost:8123/?query=' -s --data-binary @-
有关 HTTP 接口 的更多信息,请参阅 ClickHouse HTTP Interface。
docker stop some-clickhouse-server
docker rm some-clickhouse-server
预定义的用户 default 默认没有网络访问权限,除非设置了密码,
请参见下文的“如何在启动时创建默认 database 和用户”以及“管理 default 用户”
你可以通过映射特定端口,
使用主机端口将运行在 Docker 中的 ClickHouse 从容器内部暴露出来:
docker run -d -p 18123:8123 -p19000:9000 -e CLICKHOUSE_PASSWORD=changeme --name some-clickhouse-server --ulimit nofile=262144:262144 clickhouse/clickhouse-server
echo 'SELECT version()' | curl 'http://localhost:18123/?password=changeme' --data-binary @-
或者通过 --network=host 让容器直接使用主机端口
(也有助于获得更好的网络性能) :
docker run -d --network=host --name some-clickhouse-server --ulimit nofile=262144:262144 clickhouse/clickhouse-server
echo 'SELECT version()' | curl 'http://localhost:8123/' --data-binary @-
上述示例中的默认用户仅适用于来自 localhost 的请求。
通常,为了实现持久化,你可能需要在容器内挂载以下目录:
/var/lib/clickhouse/ - ClickHouse 存储数据的主要目录
/var/log/clickhouse-server/ - 日志
docker run -d \
-v "$PWD/ch_data:/var/lib/clickhouse/" \
-v "$PWD/ch_logs:/var/log/clickhouse-server/" \
--name some-clickhouse-server --ulimit nofile=262144:262144 clickhouse/clickhouse-server
你可能还需要挂载:
/etc/clickhouse-server/config.d/*.xml - 包含服务器配置调整的文件
/etc/clickhouse-server/users.d/*.xml - 包含用户设置调整的文件
/docker-entrypoint-initdb.d/ - 包含数据库初始化脚本的文件夹 (见下文) 。
ClickHouse 提供一些高级功能,这些功能需要启用若干 Linux 能力。
这些能力是可选的,可通过以下 docker 命令行参数 启用:
docker run -d \
--cap-add=SYS_NICE --cap-add=NET_ADMIN --cap-add=IPC_LOCK \
--name some-clickhouse-server --ulimit nofile=262144:262144 clickhouse/clickhouse-server
更多信息,请参阅“在 Docker 中配置 CAP_IPC_LOCK 和 CAP_SYS_NICE 能力”
该容器为 HTTP 接口开放 8123 端口,为 原生客户端开放 9000 端口。
ClickHouse 使用 “config.xml” 文件进行配置 (文档)
docker run -d --name some-clickhouse-server --ulimit nofile=262144:262144 -v /path/to/your/config.xml:/etc/clickhouse-server/config.xml clickhouse/clickhouse-server
# $PWD/data/clickhouse 应已存在且归当前用户所有
docker run --rm --user "${UID}:${GID}" --name some-clickhouse-server --ulimit nofile=262144:262144 -v "$PWD/logs/clickhouse:/var/log/clickhouse-server" -v "$PWD/data/clickhouse:/var/lib/clickhouse" clickhouse/clickhouse-server
当你使用挂载了本地目录的镜像时,很可能需要指定用户,以保持正确的文件所有权。请使用 --user 参数,并在容器内挂载 /var/lib/clickhouse 和 /var/log/clickhouse-server。否则,镜像会报错并且无法启动。
在启用用户命名空间的情况下,以 root 身份启动服务器会很有用。
为此,请运行:
docker run --rm -e CLICKHOUSE_RUN_AS_ROOT=1 --name clickhouse-server-userns -v "$PWD/logs/clickhouse:/var/log/clickhouse-server" -v "$PWD/data/clickhouse:/var/lib/clickhouse" clickhouse/clickhouse-server
有时,你可能希望在容器启动时创建用户 (默认使用名为 default 的用户) 和 database。你可以通过环境变量 CLICKHOUSE_DB、CLICKHOUSE_USER、CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT 和 CLICKHOUSE_PASSWORD 来实现:
docker run --rm -e CLICKHOUSE_DB=my_database -e CLICKHOUSE_USER=username -e CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1 -e CLICKHOUSE_PASSWORD=password -p 9000:9000/tcp clickhouse/clickhouse-server
如果未设置 CLICKHOUSE_USER、CLICKHOUSE_PASSWORD 或 CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT,则用户 default 默认会禁用网络访问。
也可以通过将环境变量 CLICKHOUSE_SKIP_USER_SETUP 设置为 1,以不安全的方式启用 default 用户:
docker run --rm -e CLICKHOUSE_SKIP_USER_SETUP=1 -p 9000:9000/tcp clickhouse/clickhouse-server
如果要在基于此镜像派生的镜像中执行额外的初始化,请在 /docker-entrypoint-initdb.d 下添加一个或多个 *.sql、*.sql.gz 或 *.sh 脚本。入口点调用 initdb 后,会运行所有 *.sql 文件、执行所有可执行的 *.sh 脚本,并 source 该目录中所有不可执行的 *.sh 脚本,以便在服务启动前完成进一步初始化。
/docker-entrypoint-initdb.d 下的脚本会按文件名字母顺序执行**。如果这些脚本之间存在依赖关系 (例如,创建视图的脚本必须在创建其所引用表的脚本之后运行) ,请确保文件名的排序顺序正确。
此外,你还可以提供环境变量 CLICKHOUSE_USER 和 CLICKHOUSE_PASSWORD,初始化期间 clickhouse-client 会使用它们。
例如,要添加另一个用户和数据库,请将以下内容添加到 /docker-entrypoint-initdb.d/init-db.sh:
#!/bin/bash
set -e
clickhouse client -n <<-EOSQL
CREATE DATABASE docker;
CREATE TABLE docker.docker (x Int32) ENGINE = MergeTree
ORDER BY ();
EOSQL