diff --git a/README.md b/README.md
index 925c8128a3963970d6cb8a6ad99385df59846ba5..6444c35d9696132192d088430af93f233520255c 100644
--- a/README.md
+++ b/README.md
@@ -1,15 +1,21 @@
[](https://github.com/RichardLitt/standard-readme)
-
-

-
+
+
-**SimpleDocker** 是一个简单的Docker控制面板,致力于可以让用户更方便、更无障碍、更舒适的使用Docker,其界面简洁、操作便捷,功能强大,可以带来更好地运维体验。
+
+**SimpleDocker** 是一个简单的Docker控制面板,致力于可以让用户更方便、更无障碍、更舒适的使用Docker,其界面简洁、操作便捷,功能强大,可以带来更好地运维体验。
**个人开发维护不易,麻烦给个 Star ✨ 鼓励一下作者,您的鼓励是我最大的动力 😛!!!**
-> 🎉 🔥 ✨ 新发布的 V0.0.6 新增容器备份到本地、查看容器Inspect的功能以及修复若干BUG
+> 🎉 🔥 ✨ 新发布的 V0.0.7 新增登录界面验证码的功能
+
+## 演示网站
+ 1. 演示环境 [http://docker.zhoutao123.com](http://docker.zhoutao123.com)
+ 2. 账号: admin 密码: 123456
+ 3. 演示环境,请勿删除/停止/暂停 simpledocker-xxxx 开头的容器,否则可能造成服务异常
+ 4. 如果演示环境无法登录或者无法使用,请及时创建Issue联系我
## 背景
@@ -51,7 +57,7 @@ Docker是目前一种非常主流的容器化方案,支持非常多的特性
1. 确保Docker & DockerCompose 已经部署并且启动成功,如果docker-compose 没有安装请参考官网 [https://docs.docker.com/compose/install/](https://docs.docker.com/compose/install/) 安装
2. 通过命令 `docker-compose version` 验证安装成功
-3. 在某个目录下创建文件 `docker-compose.yml` 其内容如下:
+3. 在某个目录下创建文件 `docker-compose.yml` 其内容如下:
```yaml
# yaml 配置实例
version: '3'
@@ -59,18 +65,17 @@ services:
redis:
image: redis:latest
web:
- image: registry.cn-hangzhou.aliyuncs.com/seven-tao/simple-docker:0.0.6
+ image: registry.cn-hangzhou.aliyuncs.com/seven-tao/simple-docker:0.0.7
ports:
- "9091:4050"
volumes:
+ - /tmp/simple-docker/back:/tmp/back
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- redis
```
-> ** 如果需要持久化容器/镜像的备份文件,请在 volumes 标签下新增挂载 `- 宿主机目录:/tmp/back` **
-
3. 执行下面的脚本,会自动拉取镜像并启动在 9091 端口
diff --git a/build.sh b/build.sh
index b3adb736720025670f733051014044b37021ac2f..924b7a72f68a79473bd756037b917650dbb08257 100755
--- a/build.sh
+++ b/build.sh
@@ -1,6 +1,6 @@
echo "编译后端....."
-CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build App.go
cp ./App ./build/App
+CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build App.go
echo "编译前端....."
cd ui && yarn build
diff --git a/src/docker/compose/compose.go b/src/docker/compose/compose.go
new file mode 100644
index 0000000000000000000000000000000000000000..822b1b7fcc7e7bc524d3217526855a49602d3e34
--- /dev/null
+++ b/src/docker/compose/compose.go
@@ -0,0 +1,7 @@
+package compose
+
+import "github.com/astaxie/beego/logs"
+
+func init() {
+ logs.Info("尝试初始化Docker-Compose 文件")
+}
diff --git a/src/docker/swarm/swarm.go b/src/docker/swarm/swarm.go
new file mode 100644
index 0000000000000000000000000000000000000000..1e9eabd6aafcd1ec6ea6dc13ebf95d6d9caa0f30
--- /dev/null
+++ b/src/docker/swarm/swarm.go
@@ -0,0 +1,87 @@
+package swarm
+
+import (
+ "SimpleDocker/src/context"
+ "errors"
+ "github.com/astaxie/beego/logs"
+ "github.com/docker/docker/api/types"
+ "github.com/docker/docker/api/types/swarm"
+ "io/ioutil"
+)
+
+func init() {
+ logs.Info("尝试初始化Docker Swarm...")
+}
+
+/** 查询DockESwarm的服务列表 */
+func GetServiceList() ([]swarm.Service, error) {
+ optional := types.ServiceListOptions{}
+ return context.Cli.ServiceList(context.Ctx, optional)
+}
+
+/** 查询制定服务的日志 */
+func GetServiceLogs(serviceId string) (string, error) {
+ if serviceId != "" {
+ return "", errors.New("服务ID不能为空")
+ }
+ logsOption := types.ContainerLogsOptions{}
+ closer, err := context.Cli.ServiceLogs(context.Ctx, serviceId, logsOption)
+ if err != nil {
+ return "", err
+ }
+ defer closer.Close()
+ bytes, err := ioutil.ReadAll(closer)
+ if err != nil {
+ return "", err
+ }
+ return string(bytes), nil
+}
+
+/** 查询服务的 Inspect 信息 */
+func GetServiceInspect(serviceId string) (string, error) {
+ if serviceId != "" {
+ return "", errors.New("服务ID不能为空")
+ }
+ logs.Info("查询服务:{}的Inspect信息", serviceId)
+ options := types.ServiceInspectOptions{}
+ _, bytes, err := context.Cli.ServiceInspectWithRaw(context.Ctx, serviceId, options)
+ if err != nil {
+ return "", err
+ }
+ return string(bytes), nil
+}
+
+/** 移除服务*/
+func RemoveService(serviceId string) error {
+ if serviceId != "" {
+ return errors.New("服务ID不能为空")
+ }
+ err := context.Cli.ServiceRemove(context.Ctx, serviceId)
+ if err != nil {
+ return err
+ }
+ return nil
+}
+
+/** 更新服务 */
+func UpdateService(serviceId string) ([]string, error) {
+ if serviceId != "" {
+ return nil, errors.New("服务ID不能为空")
+ }
+
+ options := types.ServiceInspectOptions{}
+ info, _, err := context.Cli.ServiceInspectWithRaw(context.Ctx, serviceId, options)
+ if err != nil {
+ return nil, err
+ }
+ version := swarm.Version{Index: info.Version.Index + 1}
+
+ // TODO: 更新Service的配置
+ spec := swarm.ServiceSpec{}
+ options2 := types.ServiceUpdateOptions{}
+ response, err := context.Cli.ServiceUpdate(context.Ctx, serviceId, version, spec, options2)
+ if err != nil {
+ return nil, err
+ }
+ return response.Warnings, nil
+}
diff --git a/ui/package.json b/ui/package.json
index d254ac1bf05284ce086378b07e48129150b29059..3623b49594b692ea8f7c815fe68788b2fe66ac52 100644
--- a/ui/package.json
+++ b/ui/package.json
@@ -14,6 +14,7 @@
"jwt-decode": "^3.1.2",
"lodash": "^4.17.20",
"vue": "^2.6.11",
+ "vue-captcha-code": "^1.0.2",
"vue-json-viewer": "^2.2.19",
"vue-router": "^3.2.0",
"vue-terminal-ui": "^0.1.6",
diff --git a/ui/src/views/Login.vue b/ui/src/views/Login.vue
index eaca7c3297d23281e4ea4846dad6835c4ce89583..fdb4ab775baba90bc8e89defa3157667405ba745 100644
--- a/ui/src/views/Login.vue
+++ b/ui/src/views/Login.vue
@@ -14,6 +14,20 @@
+
+