背景简介
简易部署 samba 共享服务。
前置信息
- 系统:ubuntu 22.04
- Docker 28.2.2
- Samba guest 部署参考 【Samba - Docker 部署 - guest】
详细步骤
第一步: 确保 Samba 镜像可用。
第二步: 创建 Docker 容器
- 准备 smb.conf 配置文件, 参考【Samba - Docker 部署 - guest】
- 准备 supervisord.conf 配置文件,参考 【Samba - Docker 部署 - guest】
- 准备空的 initialize.sh 脚本文件
#!/usr/bin/expect
# do nothing
- 准备 Dockerfile 配置文件
# 使用指定 ubuntu 镜像
FROM ubuntu:noble-20250529
# 设置环境变量,避免交互提示
ENV DEBIAN_FRONTEND=noninteractive
# 更新软件源并安装 Samba
RUN apt-get update && apt-get install -y acl attr samba winbind libpam-winbind libnss-winbind krb5-config krb5-user dnsutils python3-setproctitle chrony expect supervisor && rm -rf /var/lib/apt/lists/*
# 暴露 Samba 使用的端口
EXPOSE 139 445
# 复制自定义的 smb.conf 配置文件到容器中
COPY smb.conf /etc/samba/smb.conf
# 复制 supervisord 配置文件
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# Copy initialize shell script
COPY initialize.sh /shell/initialize.sh
# 启动 supervisord
CMD /bin/sh -c "/shell/initialize.sh && /usr/bin/supervisord -n"
- 生成 Docker 镜像
$ docker build -t pers/samba:2.0.0 .
第三步: 准备真实配置文件
- 准备初始化脚本
- 创建组
- 创建用户
- 添加用户至 Samba
#!/usr/bin/expect
set USERNAME "user"
set PASSWORD "password"
set GROUPNAME "group"
# Check if private group exists
puts "\nCheck if $GROUPNAME exists"
spawn getent group $GROUPNAME
expect eof
# the fourth element is exit code, index start with 0
set STATUS_1 [lindex [wait] 3]
if { $STATUS_1 == 0} {
puts "\nGroup $GROUPNAME exists, skip create group step"
} else {
puts "\nGroup $GROUPNAME not exists, start creating..."
spawn groupadd $GROUPNAME
expect eof
set STATUS_2 [lindex [wait] 3]
if { $STATUS_2 ==0 } {
puts "Success: Create group $GROUPNAME success"
} else {
puts "Error: Create group $GROUPNAME failed"
exit 1
}
}
# check if user exists
spawn getent passwd $USERNAME
expect eof
set STATUS_3 [lindex [wait] 3]
if { $STATUS_3 == 0} {
puts "User $USERNAME exists, skip create user step"
} else {
puts "User $USERNAME not exists, start creating..."
spawn useradd -m -s /sbin/nologin -g $GROUPNAME $USERNAME
expect eof
set STATUS_4 [lindex [wait] 3]
if { $STATUS_4 == 0 } {
puts "Success: User $USERNAME added and add to group $GROUPNAME success"
} else {
puts "Error: User $USERNAME added and add to group $GROUPNAME failed"
exit 1
}
}
# Add user to samba database
# check if smbpasswd command exists
if { ![file exists "/usr/bin/smbpasswd"] } {
puts "Error: smbpasswd not found,please install Samba first"
exit 1
}
# Add user to samba
puts "Add user $USERNAME to Samba..."
spawn smbpasswd -a $USERNAME
expect {
"New SMB password:" {
send "$PASSWORD\n"
expect {
"Retype new SMB password:" {
send "$PASSWORD\n"
expect eof
set STATUS_5 [lindex [wait] 3]
if { $STATUS_5 == 0 } {
puts "Success: Samba user $USERNAME added/modified success"
} else {
puts "Error: Samba user $USERNAME added/modified failed"
exit 1
}
}
timeout {
puts "Error: Input password timeout"
exit 1
}
default {
puts "Error: Unknown error"
exit 1
}
}
}
timeout {
puts "Error: Add user to Samba timeout"
exit 1
}
default {
puts "Error: Unknown error"
exit 1
}
}
- 准备 Basic Authenticated smb.conf 配置文件
[global]
log file = /var/log/samba/%m
log level = 3
server role = standalone server
workgroup = WORKGROUP
security = user
passdb backend = tdbsam
map to guest = never
server string = Samba Server Version %v
server min protocol = SMB3
server max protocol = SMB3
disable netbios = yes
smb ports = 445
[Common]
# This share requires authentication to access
path = /sdd/SambaShared/Common
read only = no
# inherit permissions = yes
browseable = yes
writable = yes
valid users = @DockerSamba
- 创建文件夹
$ sudo mkdir /sdd/SambaShared/Common
- 修改文件夹权限
$ sudo chmod 770 /sdd/SambaShared/Common
第四步: 启动 Samba 服务
- 准备 docker-compose.yaml 配置文件
services:
samba:
image: pers/samba:2.0.0
container_name: samba
restart: always
ports:
- "445:445"
volumes:
- ./data/conf/smb.conf:/etc/samba/smb.conf:ro
- ./data/var/log/supervisor:/var/log/supervisor
- /sdd/SambaShared:/sdd/SambaShared
- ./data/var/log/samba:/var/log/samba
- ./data/shell:/shell:ro
- /etc/localtime:/etc/localtime:ro
- 启动容器
$ docker compose up -d
- 查看容器状态
$ docker logs -f --tail 5 samba
2025-06-19 17:26:57,047 INFO RPC interface 'supervisor' initialized
2025-06-19 17:26:57,048 CRIT Server 'unix_http_server' running without any HTTP authentication checking
2025-06-19 17:26:57,048 INFO supervisord started with pid 37
2025-06-19 17:26:58,051 INFO spawned: 'smbd' with pid 38
2025-06-19 17:27:03,132 INFO success: smbd entered RUNNING state, process has stayed up for > than 5 seconds (startsecs)
第五步: 连接 Samba
- Windows
- 添加路径: This PC → Map network drive… → 输入共享路径 → Finish → 输入账号密码 → OK
- Ubuntu
-
安装 cifs-utils
$ sudo apt install cifs-utils
-
挂载 samba 共享目录,确保 /mnt/test 文件夹已创建
$ sudo mount -t cifs //127.0.0.1/Common /mnt/test -o username=your_name,password=your_password
-
以上便是本文的全部内容,感谢您的阅读,如遇到任何问题,欢迎在评论区留言讨论。