diff --git a/build_docker.sh b/build_docker.sh
index ec94d0f..ef8afac 100644
--- a/build_docker.sh
+++ b/build_docker.sh
@@ -6,10 +6,13 @@ echo $ver
 #docker login -u bjdgyc
 
 #docker build -t bjdgyc/anylink .
-docker build -t bjdgyc/anylink -f docker/Dockerfile .
+
+docker build -t bjdgyc/anylink --build-arg GitCommitId=$(git rev-parse HEAD) -f docker/Dockerfile .
 
 docker tag bjdgyc/anylink:latest bjdgyc/anylink:$ver
 
+exit 0
+
 docker push bjdgyc/anylink:$ver
 docker push bjdgyc/anylink:latest
 
diff --git a/doc/README.md b/doc/README.md
index a56d567..6953384 100644
--- a/doc/README.md
+++ b/doc/README.md
@@ -9,37 +9,39 @@
 ## Donator
 
 > 感谢以下同学的打赏,AnyLink 有你更美好!
-> 
+>
 > 需要展示主页的同学,可以在QQ群 直接联系我添加。
 
-| 昵称      | 主页                         |
-|---------| ---------------------------- |
-| 代码 oo8  |                              |
-| 甘磊      | https://github.com/ganlei333 |
-| Oo@     | https://github.com/chooop    |
-| 虚极静笃    |                              |
-| 请喝可乐    |                              |
-| 加油加油    |                              |
-| 李建      |                              |
-| lanbin  |                              |
-| 乐在东途    |                              |
-| 孤鸿      |                              |
-| 刘国华     |                              |
-| 改名好无聊   |                              |
-| 全能互联网专家 |                              |
-| JCM     |                              |
-| Eh...   |                              |
-| 沉       |                              |
-| 刘国华     |                              |
-| 忧郁的豚骨拉面 |                              |
-| 张小旋当爹地  |                              |
-| 对方正在输入  |                              |
-| Ronny   |                              |
-| 奔跑的少年   |                              |
-| ZBW     |                              |
-| 悲鸣      |                              |
-| 谢谢      |                              |
-| 云思科技    |                              |
+| 昵称        | 主页 / 留言                      |
+|-----------|------------------------------|
+| 代码 oo8    |                              |
+| 甘磊        | https://github.com/ganlei333 |
+| Oo@       | https://github.com/chooop    |
+| 虚极静笃      |                              |
+| 请喝可乐      |                              |
+| 加油加油      |                              |
+| 李建        |                              |
+| lanbin    |                              |
+| 乐在东途      |                              |
+| 孤鸿        |                              |
+| 刘国华       |                              |
+| 改名好无聊     |                              |
+| 全能互联网专家   |                              |
+| JCM       |                              |
+| Eh...     |                              |
+| 沉         |                              |
+| 刘国华       |                              |
+| 忧郁的豚骨拉面   |                              |
+| 张小旋当爹地    |                              |
+| 对方正在输入    |                              |
+| Ronny     |                              |
+| 奔跑的少年     |                              |
+| ZBW       |                              |
+| 悲鸣        |                              |
+| 谢谢        |                              |
+| 云思科技      |                              |
+| 哆啦A伟(张佳伟) |                              |
+| nobody    | 开源不易,感谢分享                    |
 
 
 
diff --git a/docker/Dockerfile b/docker/Dockerfile
index 9abbcac..e703090 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -1,42 +1,48 @@
+#node:16-bullseye
+#golang:1.20-bullseye
+#debian:bullseye-slim
+
 # web
-FROM node:16.17.1-alpine3.15 as builder_node
+FROM node:16-alpine3.18 as builder_node
 WORKDIR /web
 COPY ./web /web
 RUN yarn install \
     && yarn run build \
     && ls /web/ui
 
+
 # server
-FROM golang:1.19-alpine as builder_golang
+FROM golang:1.20-alpine3.18 as builder_golang
 #TODO 本地打包时使用镜像
-ENV GOPROXY=https://goproxy.io
+ENV GOPROXY=https://goproxy.cn
 ENV GOOS=linux
+ARG GitCommitId="gitCommitId"
+
 WORKDIR /anylink
-COPY . /anylink
-COPY --from=builder_node /web/ui  /anylink/server/ui
+COPY server /anylink
+COPY --from=builder_node /web/ui  /anylink/ui
 
 #TODO 本地打包时使用镜像
 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories
-RUN apk add --no-cache git gcc musl-dev
-RUN cd /anylink/server;go mod tidy;go build -o anylink -ldflags "-X main.CommitId=$(git rev-parse HEAD)" \
-    && /anylink/server/anylink tool -v
+RUN apk add gcc musl-dev
+RUN cd /anylink;go mod tidy;go build -o anylink -ldflags "-s -w -X main.CommitId=${GitCommitId}" \
+    && /anylink/anylink tool -v
+
 
 # anylink
-FROM alpine
+FROM alpine:3.18
 LABEL maintainer="github.com/bjdgyc"
 
-#ENV IPV4_CIDR="192.168.10.0/24"
+ENV ANYLINK_IN_CONTAINER=true
 
 WORKDIR /app
-COPY --from=builder_golang /anylink/server/anylink  /app/
+COPY --from=builder_golang /anylink/anylink  /app/
 COPY docker/docker_entrypoint.sh  /app/
-
-#COPY ./server/bridge-init.sh /app/
+COPY ./server/bridge-init.sh /app/
 COPY ./server/conf  /app/conf
 COPY ./LICENSE  /app/LICENSE
 COPY ./home  /app/home
 
-
 #TODO 本地打包时使用镜像
 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories
 RUN apk add --no-cache bash iptables \
diff --git a/server/base/app_ver.go b/server/base/app_ver.go
index e3556a6..fa9e89f 100644
--- a/server/base/app_ver.go
+++ b/server/base/app_ver.go
@@ -3,5 +3,5 @@ package base
 const (
 	APP_NAME = "AnyLink"
 	// app版本号
-	APP_VER = "0.9.4"
+	APP_VER = "0.10.1"
 )
diff --git a/server/base/mod.go b/server/base/mod.go
new file mode 100644
index 0000000..0f85830
--- /dev/null
+++ b/server/base/mod.go
@@ -0,0 +1,65 @@
+package base
+
+import (
+	"bufio"
+	"fmt"
+	"log"
+	"os"
+	"os/exec"
+	"strings"
+)
+
+const (
+	procModulesPath = "/proc/modules"
+	inContainerKey  = "ANYLINK_IN_CONTAINER"
+)
+
+var (
+	inContainer = false
+	modMap      = map[string]struct{}{}
+)
+
+func initMod() {
+	container := os.Getenv(inContainerKey)
+	if container == "true" {
+		inContainer = true
+	}
+	log.Println("inContainer", inContainer)
+
+	file, err := os.Open(procModulesPath)
+	if err != nil {
+		err = fmt.Errorf("[ERROR] Problem with open file: %s", err)
+		panic(err)
+	}
+	defer file.Close()
+	scanner := bufio.NewScanner(file)
+	scanner.Split(bufio.ScanLines)
+	for scanner.Scan() {
+		splited := strings.Split(scanner.Text(), " ")
+		if len(splited[0]) > 0 {
+			modMap[splited[0]] = struct{}{}
+		}
+	}
+}
+
+func CheckModOrLoad(mod string) {
+	log.Println("CheckModOrLoad", mod)
+
+	if _, ok := modMap[mod]; ok {
+		return
+	}
+
+	if inContainer {
+		err := fmt.Errorf("Linux modules %s is not loaded, please run `modprobe %s`", mod, mod)
+		panic(err)
+	}
+
+	cmdstr := fmt.Sprintln("modprobe", mod)
+
+	cmd := exec.Command("sh", "-c", cmdstr)
+	b, err := cmd.CombinedOutput()
+	if err != nil {
+		log.Println(string(b))
+		panic(err)
+	}
+}
diff --git a/server/base/start.go b/server/base/start.go
index a2354c6..c25d202 100644
--- a/server/base/start.go
+++ b/server/base/start.go
@@ -4,6 +4,7 @@ func Start() {
 	execute()
 	initCfg()
 	initLog()
+	initMod()
 }
 
 func Test() {
diff --git a/server/handler/link_tun.go b/server/handler/link_tun.go
index d01b5f5..5ba65f2 100644
--- a/server/handler/link_tun.go
+++ b/server/handler/link_tun.go
@@ -22,9 +22,10 @@ func checkTun() {
 	defer ifce.Close()
 
 	// 测试ip命令
-	cmdstr0 := fmt.Sprintln("modprobe -i tun")
+	base.CheckModOrLoad("tun")
+
 	cmdstr1 := fmt.Sprintf("ip link set dev %s up mtu %s multicast off", ifce.Name(), "1399")
-	err = execCmd([]string{cmdstr0, cmdstr1})
+	err = execCmd([]string{cmdstr1})
 	if err != nil {
 		base.Fatal("testTun err: ", err)
 	}
@@ -41,12 +42,8 @@ func checkTun() {
 		}
 
 		// 修复 rockyos nat 不生效
-		cmdstr0 := fmt.Sprintln("modprobe -i iptable_filter")
-		cmdstr1 := fmt.Sprintf("modprobe -i iptable_nat")
-		err = execCmd([]string{cmdstr0, cmdstr1})
-		if err != nil {
-			base.Fatal("testTun err: ", err)
-		}
+		base.CheckModOrLoad("iptable_filter")
+		base.CheckModOrLoad("iptable_nat")
 
 		natRule := []string{"-s", base.Cfg.Ipv4CIDR, "-o", base.Cfg.Ipv4Master, "-j", "MASQUERADE"}
 		forwardRule := []string{"-j", "ACCEPT"}
diff --git a/server/handler/link_vtap.go b/server/handler/link_vtap.go
index 9536fca..fa2c5b0 100644
--- a/server/handler/link_vtap.go
+++ b/server/handler/link_vtap.go
@@ -33,13 +33,14 @@ func checkMacvtap() {
 
 	ifName := "anylinkMacvtap"
 	// 加载 macvtap
-	cmdstr0 := fmt.Sprintln("modprobe -i macvtap")
+	base.CheckModOrLoad("macvtap")
+
 	// 开启主网卡混杂模式
 	cmdstr1 := fmt.Sprintf("ip link set dev %s promisc on", base.Cfg.Ipv4Master)
 	// 测试 macvtap 功能
 	cmdstr2 := fmt.Sprintf("ip link add link %s name %s type macvtap mode bridge", base.Cfg.Ipv4Master, ifName)
 	cmdstr3 := fmt.Sprintf("ip link del %s", ifName)
-	err := execCmd([]string{cmdstr0, cmdstr1, cmdstr2, cmdstr3})
+	err := execCmd([]string{cmdstr1, cmdstr2, cmdstr3})
 	if err != nil {
 		base.Fatal(err)
 	}