Samba 是类Unix下的 Windows文件共享 服务,本文将以Debian为例介绍Samba在Docker环境下的快速部署和不为人知的使服务快速被发现.

安装 Docker 🔗︎

快速搜索Linux常用环境标准部署文档, 如谷歌搜关键字: site://www.digitalocean.com debian install docker, do的文档足够参考.

Docker 快速部署Samba 🔗︎

  • 取得 dperson/samba 镜像
1
docker pull dperson/samba
  • 运行 dperson/samba 镜像

/我的/共享文件夹路径 替换为你本机预报做共享的路径, 此方法将开启一个匿名可登录和读写的共享路径: public

1
2
3
4
5
6
7
8
docker run -d --name samba -p 139:139 -p 445:445 \
-v /我的/共享文件夹路径:/data \
--restart=always \
dperson/samba \
-s "public;/data;yes;no" \
-p

# --restart=always 参数将使该容器随系统启动

其他高级的带验证的方法就不讨论, 靠大家自己在 dperson/samba 的文档里摸索. 此镜像支持的Samba功能非常齐全, 认真阅读文档即可实现各种复杂的共享设置.


后面的内容可能毫无意义

使服务快速被发现 🔗︎

由于Windows和类Unix(包括苹果安卓)服务发现协议不同, 要实现使服务快速被发现, 必须分别依赖 wsdd2avahi .

  • wsdd2 的编译和安装
1
# wsdd2 的编译和安装		写起来太麻烦, 也可以直接下源码 make 也行, 遇到问题大家先谷歌搜索
  • avahi 的安装
1
apt-get install avahi-daemon
  • wsdd2 的设置

假如我们把 wsdd2 安装到 /usr/sbin/wsdd2 的路径下,

vi /etc/systemd/system/wsdd2.service # 该配置内容如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
[Unit]
Description=WSD/LLMNR Discovery/Name Service Daemon
#BindsTo=smbd.service

[Service]
ExecStart=/usr/sbin/wsdd2
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
DynamicUser=true
AmbientCapabilities=CAP_NET_RAW
PrivateTmp=true
PrivateDevices=true
ProtectSystem=full
ProtectHome=true

[Install]
WantedBy=multi-user.target
  • 启用 wsdd2
1
2
3
systemctl daemon-reload
systemctl enable wsdd2
systemctl restart wsdd2
  • avahi 的设置

vi /etc/avahi/services/samba.service # 该配置内容如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
  <name replace-wildcards="yes">%h</name>
  <service>
    <type>_smb._tcp</type>
    <port>445</port>
  </service>
 <service>
    <type>_device-info._tcp</type>
   <port>0</port>
   <txt-record>model=RackMac</txt-record>
 </service>
</service-group>
  • 启用 avahi
1
2
systemctl enable avahi-daemon
systemctl restart avahi-daemon


效果 🔗︎

运行 wsdd2 和 avahi 后, 你的Samba服务就能在Windows网上邻居和苹果局域网共享、以及VLC本地网络发现等环境下第一时间就被自动搜索到。


卸载方法 🔗︎

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 卸载 wsdd2
systemctl stop wsdd2
rm -f /usr/sbin/wsdd2 \
	/etc/systemd/system/wsdd2.service

# 卸载 avahi-daemon 的 samba.service
rm -f /etc/avahi/services/samba.service
systemctl restart avahi-daemon

# 卸载 Docker 容器和镜像
docker stop samba
docker rm samba
docker rmi dperson/samba