1、环境
- 操作系统:Centos 7
- docker版本:19.03.8
- docker-compose版本:1.25.4
- etcd 镜像版本: quay.io/coreos/etcd:v3.5.4
2、拉取官方镜像
> docker pull quay.io/coreos/etcd:v3.5.4
3、docker-compose.yml 配置文件
我这个地方是单节点的配置,其中"192.168.1.100" 需要改为你自己的服务器IP地址。
version: "3"
services:
etcd:
image: quay.io/coreos/etcd:v3.5.4
container_name: etcd
command: /usr/local/bin/etcd
restart: always
networks:
- deng
ports:
- "2379:2379"
- "2380:2380"
volumes:
- "/data/etcd:/etcd-data"
- "/etc/localtime:/etc/localtime:ro"
environment:
# 指定版本
ETCDCTL_API: 3
# 日志类型
ETCD_LOGGER: zap
# 存储路径
ETCD_DATA_DIR: /etcd-data
# 节点名称
ETCD_NAME: node1
# 创建集群唯一TOKEN
INITIAL_CLUSTER_TOKEN: etcd-v3-cluster
# 对外公告该节点客户端监听地址
ETCD_ADVERTISE_CLIENT_URLS: http://192.168.1.100:2379
# 本地对外提供服务的地址
ETCD_LISTEN_CLIENT_URLS: http://0.0.0.0:2379
# 该节点同伴监听地址
ETCD_INITIAL_ADVERTISE_PEER_URLS: http://0.0.0.0:2380
# 和其他节点通信的地址
ETCD_LISTEN_PEER_URLS: http://0.0.0.0:2380
# 初始化集群所有节点列表(逗号隔开)
ETCD_INITIAL_CLUSTER: node1=http://0.0.0.0:2380
# 集群初始化状态(新建集群时为new)
ETCD_INITIAL_CLUSTER_STATE: new
# 启用K-V键值自动压缩存盘
ETCD_AUTO_COMPACTION_RETENTION: 1
networks:
deng:
external: true
4、后台运行etcd服务
> docker-compose up -d etcd
5、docker-compose 参数说明
-
volumes:我们把宿主机的目录映射到容器的 /etcd-data 目录目的是,每次重新创建容器,数据不会清空
-
environment:用来为容器设置环境变量,使用
docker exec {containerID} env
即可查看容器中生效的环境变量 -
command:启动容器时所运行的指令,使用 command 可以覆盖 environment 所设置的环境变量值
-
restart:设置为always,当 docker 重启时,容器也会自动重启。
6、登入容器内部
> docker exec -it etcd /bin/sh
-
查看 ETCDCTL_API环境变量 >
echo $ETCDCTL_API
-
查看 etcd 版本 >
etcd --version
-
查看 etcdctl 版本 >
etcdctl version
-
put k-v 值 >
etcdctl put foo bar
-
get k 值 >
etcdctl foo
-
del k 值 >
etcdctl del foo
-
登出容器指令 > exit
5、Etcd-manage UI 管理工具
开源地址:https://github.com/etcd-manage/etcd-manage-server
1. docker-compose.yml 配置如下
version: "3"
services:
etcd-ui:
image: shinxiang/etcd-manage:latest
container_name: etcd-ui
restart: always
networks:
- deng
ports:
- "10280:10280"
volumes:
- "./conf/cfg.toml:/app/config/cfg.toml"
- "./logs/:/app/logs"
- "/etc/localtime:/etc/localtime:ro"
networks:
deng:
external: true
2. 部署前需先导入MySQL脚本,如下
/*
Navicat Premium Data Transfer
Source Server Type : MySQL
Source Host : 127.0.0.1:3306
Source Schema : etcd-manage
Target Server Type : MySQL
Target Server Version : 5.7.44
Date: 24/05/2024 19:21:26
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for etcd_servers
-- ----------------------------
DROP TABLE IF EXISTS `etcd_servers`;
CREATE TABLE `etcd_servers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`version` varchar(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'v3' COMMENT 'etcd版本',
`name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'etcd服务名字',
`address` varchar(600) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'etcd地址列表',
`prefix` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'key前缀,建议不为空,防止大量key',
`tls_enable` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'true' COMMENT '是否启用tls连接',
`cert_file` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '证书',
`key_file` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '证书',
`ca_file` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '证书',
`username` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户名',
`password` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '密码',
`desc` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '描述信息',
`created_at` datetime NULL DEFAULT NULL COMMENT '添加时间',
`updated_at` datetime NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'etched server列表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of etcd_servers
-- ----------------------------
INSERT INTO `etcd_servers` VALUES (1, 'v3', '本机测试', '192.168.1.100:2379', '', 'false', '', '', '', '', '', '默认未启用ssl', NULL, '2024-05-24 10:45:34');
INSERT INTO `etcd_servers` VALUES (2, 'v3', '集群测试', '127.0.0.1:2379,127.0.0.1:12379,127.0.0.1:22379', '', 'false', '', '', '', '', '', '', NULL, '2024-05-24 11:20:54');
-- ----------------------------
-- Table structure for role_etcd_servers
-- ----------------------------
DROP TABLE IF EXISTS `role_etcd_servers`;
CREATE TABLE `role_etcd_servers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`etcd_server_id` int(11) NOT NULL DEFAULT 0 COMMENT 'etcd服务id',
`role_id` int(11) NOT NULL COMMENT '角色id',
`type` tinyint(4) NOT NULL DEFAULT 0 COMMENT '0读 1写 -1无任何权限',
`created_at` datetime NOT NULL COMMENT '添加时间',
`updated_at` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_role_id`(`role_id`) USING BTREE,
INDEX `idx_etcd_server_id`(`etcd_server_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色权限表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of role_etcd_servers
-- ----------------------------
INSERT INTO `role_etcd_servers` VALUES (1, 1, 1, 1, '2019-08-21 12:48:19', '2024-05-24 10:45:35');
INSERT INTO `role_etcd_servers` VALUES (2, 2, 1, 1, '2019-08-21 12:48:19', '2024-05-24 19:20:01');
-- ----------------------------
-- Table structure for roles
-- ----------------------------
DROP TABLE IF EXISTS `roles`;
CREATE TABLE `roles` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '角色名',
`created_at` datetime NOT NULL COMMENT '添加时间',
`updated_at` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of roles
-- ----------------------------
INSERT INTO `roles` VALUES (1, '高级管理员', '2019-08-14 19:43:44', '2019-08-14 19:43:48');
INSERT INTO `roles` VALUES (2, '开发只读', '2019-08-18 04:14:42', '2019-08-18 04:32:02');
INSERT INTO `roles` VALUES (3, '开发管理', '2019-08-18 04:25:05', '2019-08-18 04:32:21');
-- ----------------------------
-- Table structure for users
-- ----------------------------
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户名',
`password` char(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '密码',
`email` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '邮箱',
`role_id` int(11) NOT NULL DEFAULT 0 COMMENT '角色id',
`created_at` datetime NOT NULL COMMENT '添加时间',
`updated_at` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of users
-- ----------------------------
INSERT INTO `users` VALUES (1, 'admin', 'bfb4216c2b79c294dc503795209ffe39', '123456', 1, '2019-08-12 20:19:15', '2024-05-24 10:47:47');
SET FOREIGN_KEY_CHECKS = 1;
3. 创建 ./conf/cfg.toml 配置文件
# debug模式
debug = false
# 日志文件路径
log_path = ""# http 监听端口
[http]
# 监听地址
address = "0.0.0.0"
# 监听端口
port = 10280# 使用 Let's Encrypt 证书 - tls_enable为true优先使用本地证书模式
tls_encrypt_enable = false
# 域名列表
tls_encrypt_domain_names = ["your-domain.com"]# 是否启用tls
tls_enable = false
# tls证书文件
[http.tls_config]
cert_file = "cert_file"
key_file = "key_file"
## mysql 配置
[db]
## 是否调试模式
debug = true
## 数据库连接地址 - docker run 不可以是'127.0.0.1'
address = "192.168.1.100"
## 数据库端口
port = 3306
## 数据库用户名
user = "root"
## 数据库密码
passwd = "123456"
## 数据库名
db_name = "etcd-manage"## 连接池最大连接数
max_idle_conns = 2
## 默认打开连接数
max_open_conns = 1
4. 启动后在浏览器中访问 http://127.0.0.1:10280/ui
,默认用户密码 admin/123456