📦 1. 环境准备与镜像拉取
首先安装 Podman 并拉取 Consul 官方镜像。
# 安装 Podman
sudo dnf install -y podman
# 拉取 Consul 官方镜像 (建议使用特定版本以保证一致性)
sudo podman pull docker.io/hashicorp/consul:2.0.4
💾 2. 创建数据持久化目录与配置文件
生产环境必须将数据目录和配置目录挂载到宿主机,以确保容器重启后数据不丢失。
# 创建 Consul 数据与配置目录
sudo mkdir -p /var/lib/consul/data
sudo mkdir -p /etc/consul.d
# 可选:创建专用的 Consul 系统用户(推荐,但非必须)
# sudo useradd --system --home /etc/consul.d --shell /bin/false consul
创建 Consul 配置文件 /etc/consul.d/consul.hcl:
# /etc/consul.d/consul.hcl
datacenter = "dc1"
data_dir = "/consul/data"
log_level = "INFO"
server = true
bootstrap_expect = 1 # 单节点服务器模式;多节点集群请设为 3 或 5
client_addr = "0.0.0.0"
ui_config {
enabled = true
}
# 如需启用 ACL 或加密,请在此处添加相应配置
# encrypt = "YOUR_GOSSIP_ENCRYPTION_KEY"
🏭 3. 以生产模式启动 Consul 容器
使用 -server 模式启动,并挂载数据与配置目录。注意 :Z 标签用于 SELinux 环境下的正确权限上下文。
sudo podman run -d \
--name consul-persistent \
--restart=no \
-p 8500:8500 \
-p 8600:8600/udp \
-v /var/lib/consul/data:/consul/data:Z \
-v /etc/consul.d:/consul/config:Z \
docker.io/hashicorp/consul:2.0.4 \
agent -config-dir=/consul/config
参数说明:
--restart=no:暂不设置重启策略,后续由 Systemd 接管。
-p 8500:8500:映射 HTTP API 和 Web UI 端口。
-p 8600:8600/udp:映射 DNS 接口端口。
-v ...:Z:将宿主机目录挂载到容器内,并正确设置 SELinux 上下文。
🔄 4. 配置 Systemd 实现开机自启
这是实现生产级自启动的关键步骤。
如何为 Consul 创建 Quadlet 文件
下面是针对你之前部署 Consul 场景的 Quadlet 配置方案。
1). 创建 Quadlet 文件目录
对于 rootful(系统级)容器,官方推荐的目录是 /etc/containers/systemd/-29。
sudo mkdir -p /etc/containers/systemd/
2). 编写 .container 文件
创建文件 /etc/containers/systemd/consul-persistent.container,内容如下:
[Unit]
Description=Consul Server Container (Persistent)
After=network-online.target
[Container]
Image=docker.io/hashicorp/consul:2.0.4
ContainerName=consul-persistent
PublishPort=8500:8500
PublishPort=8600:8600/udp
Volume=/var/lib/consul/data:/consul/data:Z
Volume=/etc/consul.d:/consul/config:Z
Exec=agent -config-dir=/consul/config
# 如果 Consul 需要以 root 用户运行(例如绑定低端口),可取消注释下面这行
# User=root
[Service]
Restart=always
TimeoutStartSec=300
[Install]
WantedBy=multi-user.target
关键配置项说明:
-
Image:指定要使用的容器镜像。 -
PublishPort:映射端口,8600:8600/udp指定了 UDP 协议。 -
Volume:挂载数据卷和配置目录。:Z标签用于 SELinux 环境下的正确权限上下文-。 -
Exec:指定容器启动命令,等同于podman run命令中镜像后的参数-36。 -
Restart=always:确保容器在退出后自动重启-。 -
TimeoutStartSec=300:为镜像拉取预留更长的启动超时时间(默认 90 秒可能不够)-。 -
WantedBy=multi-user.target:这是实现开机自启的关键。[Install]段会在系统启动时自动激活服务-29。
3). 应用配置并启动服务
Quadlet 文件需要被 systemd 生成器识别。
# 重新加载 systemd 配置,这会触发 Quadlet 生成器
sudo systemctl daemon-reload
# 启动服务
sudo systemctl start consul-persistent.service
4). 验证服务状态
# 查看服务状态
sudo systemctl status consul-persistent.service
# 查看日志
sudo journalctl -u consul-persistent.service -f
🔥 5. 配置防火墙
如果启用了 firewalld,需要放行 Consul 使用的端口,以便集群其他节点或客户端访问。
sudo firewall-cmd --permanent --add-port=8300-8302/tcp
sudo firewall-cmd --permanent --add-port=8300-8302/udp
sudo firewall-cmd --permanent --add-port=8500/tcp
sudo firewall-cmd --permanent --add-port=8600/tcp
sudo firewall-cmd --permanent --add-port=8600/udp
sudo firewall-cmd --reload
🛠️ 6. 运维与管理
查看日志:sudo journalctl -u consul-persistent.service -f
查看容器日志:sudo podman logs -f consul-persistent
查看集群成员:sudo podman exec consul-persistent consul members
停止服务:sudo systemctl stop consul-persistent.service
禁用自启:
🟢 情况一:如果你使用的是 Quadlet(推荐方式)
Quadlet 生成的服务是“瞬态”的,不能使用 systemctl disable 命令来禁用自启。你需要通过修改配置文件来实现。
方法 A:修改 .container 文件(最规范)
-
停止当前服务(如果正在运行):
sudo systemctl stop consul-persistent.service -
编辑 Quadlet 文件:
sudo vi /etc/containers/systemd/consul-persistent.container -
注释掉或删除
[Install]段。使其变成这样:#[Install] #WantedBy=multi-user.target -
重新加载 systemd 配置,使修改生效:
sudo systemctl daemon-reload这样,下次开机时 Consul 就不会自动启动了。如果需要手动启动,依然可以使用
systemctl start。
浙公网安备 33010602011771号