diff --git a/internal/apps/docker/init.go b/internal/apps/docker/init.go
new file mode 100644
index 00000000..111407ce
--- /dev/null
+++ b/internal/apps/docker/init.go
@@ -0,0 +1,19 @@
+package podman
+
+import (
+ "github.com/go-chi/chi/v5"
+
+ "github.com/TheTNB/panel/pkg/apploader"
+ "github.com/TheTNB/panel/pkg/types"
+)
+
+func init() {
+ apploader.Register(&types.App{
+ Slug: "docker",
+ Route: func(r chi.Router) {
+ service := NewService()
+ r.Get("/config", service.GetConfig)
+ r.Post("/config", service.UpdateConfig)
+ },
+ })
+}
diff --git a/internal/apps/docker/request.go b/internal/apps/docker/request.go
new file mode 100644
index 00000000..0b3ba9ea
--- /dev/null
+++ b/internal/apps/docker/request.go
@@ -0,0 +1,5 @@
+package podman
+
+type UpdateConfig struct {
+ Config string `form:"config" json:"config" validate:"required"`
+}
diff --git a/internal/apps/docker/service.go b/internal/apps/docker/service.go
new file mode 100644
index 00000000..cebb6822
--- /dev/null
+++ b/internal/apps/docker/service.go
@@ -0,0 +1,45 @@
+package podman
+
+import (
+ "net/http"
+
+ "github.com/TheTNB/panel/internal/service"
+ "github.com/TheTNB/panel/pkg/io"
+ "github.com/TheTNB/panel/pkg/systemctl"
+)
+
+type Service struct{}
+
+func NewService() *Service {
+ return &Service{}
+}
+
+func (s *Service) GetConfig(w http.ResponseWriter, r *http.Request) {
+ config, err := io.Read("/etc/docker/daemon.json")
+ if err != nil {
+ service.Error(w, http.StatusInternalServerError, "%v", err)
+ return
+ }
+
+ service.Success(w, config)
+}
+
+func (s *Service) UpdateConfig(w http.ResponseWriter, r *http.Request) {
+ req, err := service.Bind[UpdateConfig](r)
+ if err != nil {
+ service.Error(w, http.StatusUnprocessableEntity, "%v", err)
+ return
+ }
+
+ if err = io.Write("/etc/docker/daemon.json", req.Config, 0644); err != nil {
+ service.Error(w, http.StatusInternalServerError, "%v", err)
+ return
+ }
+
+ if err = systemctl.Restart("docker"); err != nil {
+ service.Error(w, http.StatusInternalServerError, "%v", err)
+ return
+ }
+
+ service.Success(w, nil)
+}
diff --git a/internal/apps/init.go b/internal/apps/init.go
index 612c5144..e481ccb7 100644
--- a/internal/apps/init.go
+++ b/internal/apps/init.go
@@ -4,6 +4,7 @@ import (
"github.com/go-chi/chi/v5"
_ "github.com/TheTNB/panel/internal/apps/benchmark"
+ _ "github.com/TheTNB/panel/internal/apps/docker"
_ "github.com/TheTNB/panel/internal/apps/fail2ban"
_ "github.com/TheTNB/panel/internal/apps/frp"
_ "github.com/TheTNB/panel/internal/apps/gitea"
diff --git a/web/src/api/apps/docker/index.ts b/web/src/api/apps/docker/index.ts
new file mode 100644
index 00000000..964eb4ed
--- /dev/null
+++ b/web/src/api/apps/docker/index.ts
@@ -0,0 +1,4 @@
+import { http } from '@/utils'
+
+export const getConfig = () => http.Get('/apps/docker/config')
+export const updateConfig = (config: string) => http.Post('/apps/docker/config', { config })
diff --git a/web/src/views/apps/docker/IndexView.vue b/web/src/views/apps/docker/IndexView.vue
new file mode 100644
index 00000000..a0e68e82
--- /dev/null
+++ b/web/src/views/apps/docker/IndexView.vue
@@ -0,0 +1,150 @@
+
+
+
+
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+ 自启动开
+ 自启动关
+
+
+
+
+ {{ statusStr }}
+
+
+
+
+ 启动
+
+
+
+
+
+ 停止
+
+
+ 确定要停止 Docker 吗?
+
+
+
+ 重启
+
+
+
+
+
+
+
+
+
+ 此处修改的是 Docker 配置文件(/etc/docker/daemon.json)
+
+
+
+
+
+
+
diff --git a/web/src/views/apps/docker/route.ts b/web/src/views/apps/docker/route.ts
new file mode 100644
index 00000000..55cd9d93
--- /dev/null
+++ b/web/src/views/apps/docker/route.ts
@@ -0,0 +1,23 @@
+import type { RouteType } from '~/types/router'
+
+const Layout = () => import('@/layout/IndexView.vue')
+
+export default {
+ name: 'docker',
+ path: '/apps/docker',
+ component: Layout,
+ isHidden: true,
+ children: [
+ {
+ name: 'apps-docker-index',
+ path: '',
+ component: () => import('./IndexView.vue'),
+ meta: {
+ title: 'Docker',
+ icon: 'logos:docker-icon',
+ role: ['admin'],
+ requireAuth: true
+ }
+ }
+ ]
+} as RouteType