Docker 自制镜像:Ubuntu 安装 samba+Webmin
编写 Dockerfile
自己找个合适的位置创建个目录,然后编写 Dockerfile
文件。
这个镜像中就有 webmin
和 samba
了
# 使用 Ubuntu 22.04 作为基础镜像
FROM ubuntu:22.04
# 设置环境变量,避免交互提示
ENV DEBIAN_FRONTEND=noninteractive
# 备份原始的软件源配置文件,并替换为阿里云镜像源
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list \
&& sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
# 安装 wget 和 gnupg
RUN apt-get update && apt-get install -y \
wget \
gnupg \
&& rm -rf /var/lib/apt/lists/*
# 添加 Webmin 软件源
RUN echo "deb http://download.webmin.com/download/repository sarge contrib" >> /etc/apt/sources.list \
&& wget -qO - http://www.webmin.com/jcameron-key.asc | apt-key add -
# 更新系统软件包列表并安装 Samba 和 Webmin
RUN apt-get update && apt-get install -y \
samba \
webmin \
&& rm -rf /var/lib/apt/lists/*
# 配置 Webmin 允许远程访问
RUN sed -i 's/ssl=1/ssl=0/' /etc/webmin/miniserv.conf \
&& sed -i 's/allow=127.0.0.1/allow=0.0.0.0/' /etc/webmin/miniserv.conf
# 暴露 Samba 和 Webmin 的端口
EXPOSE 139 445 10000
# 启动 Samba 和 Webmin 服务
CMD service smbd start && service webmin start && tail -f /dev/null
构建镜像
执行构建命令
镜像名:samba-webmin
标签:v1.0
构建上下文的路径:.
(默认下 Docker 会到这里找 Dockerfile 文件)
docker build -t samba-webmin:v1.0 .
查看和确认镜像的相关信息:
docker images
运行容器
/data
是我单独挂载的一块6T
的硬盘。
我打算把相关文件都放在 /data/samba/
下。
docker run -d \
-p 139:139 \
-p 445:445 \
-p 10000:10000 \
-v /data/samba/samba-config:/etc/samba \
-v /data/samba/shared-data:/shared \
--name samba-webmin-container \
samba-webmin:v1.0
注意:启动前要先把 smb.conf 创建好,不然 samba 服务启动失败,会导致容器运行不起来。
文件夹权限设置
如果配置确定没问题还是无写权限,则检查一下这些目录设置权限没。我这是内网没多想,直接 777 全开了。
- 宿主机:
sudo chmod 777 /data/samba/shared-data/
- 容器内:
sudo chmod 777 /shared/
Webmin
访问:Webmin
(ip addr
查看IP)
http://172.22.180.148:10000/
Webmin
默认使用系统账户
的用户名和密码进行登录认证。
- 修改密码(前面好像我们没设置过密码,只能修改一下了)
# 宿主机执行进入docker容器内
[jerry@CentOS8 samba]$ docker exec -it samba-webmin-container bash
# 修改 root 密码
root@36e08d19e69b:/# passwd
Enter 新密码: (输入时是看不见的,脑补吧)
Retype 再次新密码: (输入时是看不见的,脑补吧)
passwd: password updated successfully
语言选一下
来这设置
我在 ubuntu 已经创建好了账号,这两个进去走一波。
修复错误
进入 Webmin 后顶部显示错误信息
致命错误!
Both the ifconfig and ip commands are missing
错误详细信息
Can't locate MD5.pm in @INC (you may need to install the MD5 module) (@INC contains: /usr/share/webmin/vendor_perl /usr/share/webmin /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.34.0 /usr/local/share/perl/5.34.0 /usr/lib/x86_64-linux-gnu/perl5/5.34 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl-base /usr/lib/x86_64-linux-gnu/perl/5.34 /usr/share/perl/5.34 /usr/local/lib/site_perl /usr/share/webmin/ . ..) at (eval 703) line 1. BEGIN failed--compilation aborted at (eval 703) line 1. : net/linux-lib.pl (line 214)
问题 1:ifconfig 和 ip 命令缺失
ifconfig
和 ip
是用于网络配置和管理的常用命令,Webmin 在运行过程中可能会依赖这些命令来获取网络信息。ifconfig
通常包含在 net-tools 软件包中,而 ip 命令包含在 iproute2 软件包中。
解决办法
你需要在 Docker 容器中安装 net-tools 和 iproute2 软件包。进入正在运行的 Docker 容器,执行以下命令:
docker exec -it samba-webmin-container bash
apt-get update
apt-get install -y net-tools iproute2
问题 2:MD5.pm 模块缺失
MD5.pm
是 Perl 语言中用于处理 MD5 哈希算法的模块,Webmin 在运行时需要这个模块,但当前环境中没有安装。
解决办法
在容器内执行以下命令来安装 libmd5-perl
软件包,该软件包包含了 MD5.pm 模块:
apt-get install -y libmd5-perl
提交修改为新镜像
要自己控制一下版本号:之前是 samba-webmin:v1.0
提交后得到新的是 samba-webmin:v1.1
docker commit -a "jerry" -m "安装相关工具,修复Webmin报错" samba-webmin-container samba-webmin:v1.1
导出 docker 镜像文件
samba-webmin:v1.2
保存为 samba-webmin-v1.2.tar
文件(我中间又改了一版所以 1.2 了)
docker save -o samba-webmin-v1.2.tar samba-webmin:v1.2
导入
- 执行加载命令:在终端中执行以下命令,将镜像文件加载到 Docker 中:
docker load -i samba-webmin-v1.2.tar
其中,-i 选项用于指定要加载的镜像文件的路径。如果镜像文件位于其他目录,需要使用完整的路径,例如:
docker load -i /home/user/images/samba-webmin-v1.2.tar
- 查看
docker images
- 运行。跟前面一样,只是这次镜像名叫
samba-webmin:v1.2
运行容器
samba
samba 配置文件
/data/samba/samba-config/smb.conf
最终如下:samba
,sambaadm
两个账号,一个只读,一个可读写。
# [global] 部分定义了 Samba 服务器的全局设置,会影响整个 Samba 服务的行为
[global]
# workgroup 指定了 Samba 服务器所属的工作组名称
# 通常在 Windows 网络环境中,同一工作组内的计算机可以互相发现和共享资源
# 这里设置为 WORKGROUP,是一个常见的默认工作组名称
workgroup = WORKGROUP
# server string 是服务器的描述信息
# %v 是一个占位符,会被 Samba 服务器的版本号替换
# 此描述信息会在客户端浏览网络时显示,用于标识该 Samba 服务器
server string = Samba Server %v
# netbios name 是 Samba 服务器在 NetBIOS 网络中的名称
# NetBIOS 是早期用于局域网中计算机名称解析和资源共享的协议
# 这里将服务器的 NetBIOS 名称设置为 ubuntu-samba
netbios name = ubuntu-samba
# security 设置了 Samba 服务器的安全级别
# user 表示使用用户级别的安全认证,客户端需要提供有效的用户名和密码才能访问共享资源
security = user
# map to guest 控制着认证失败时的处理方式
# Bad User 表示将认证失败的用户映射为无效用户,禁止其以匿名访客身份访问
map to guest = Bad User
# dns proxy 决定 Samba 服务器是否作为 DNS 代理
# 设置为 no 表示不启用 DNS 代理功能
dns proxy = no
# disable netbios 用于禁用 NetBIOS 服务
# NetBIOS 存在一些安全风险,禁用它可以提高服务器的安全性
# 设置为 yes 表示禁用 NetBIOS 服务
disable netbios = yes
# server min protocol 指定了 Samba 服务器支持的最小 SMB 协议版本
# 设置为 SMB2 表示只支持 SMB2 及以上版本的协议,SMB2 有更好的性能和安全性
server min protocol = SMB2
# null passwords 控制是否允许使用空密码登录
# 设置为 no 表示禁止使用空密码登录,增强了服务器的安全性
null passwords = no
# [jerry_samba] 部分定义了一个名为 jerry_samba 的共享文件夹
[jerry_samba]
# comment 是对该共享文件夹的描述信息
# 用于在客户端浏览共享资源时提供说明
comment = Shared Files
# path 指定了共享文件夹在服务器上的实际路径
# 这里设置为 /shared,表示将服务器上的 /shared 目录作为共享文件夹
path = /shared
# browsable 决定该共享文件夹是否在网络中可见
# 设置为 yes 表示客户端可以在网络中浏览到这个共享文件夹
browsable = yes
# read only 控制用户对共享文件夹的读写权限
# 设置为 yes 表示默认情况下用户只有只读权限,不能对文件夹中的文件进行修改、删除或创建操作
read only = yes
# valid users 指定了哪些用户可以访问该共享文件夹
# 这里列出了 samba 和 sambaadm 两个用户,只有这两个用户可以连接到该共享
valid users = samba, sambaadm
# write list 指定了哪些用户具有写入权限
# 只有 sambaadm 用户可以在该共享文件夹中创建、修改和删除文件
write list = sambaadm
# guest ok 控制是否允许匿名访客访问该共享文件夹
# 设置为 no 表示禁止匿名用户访问,必须使用 valid users 列表中的用户进行认证
guest ok = no
复制粘贴,保存。
验证配置文件
testparm
重启 Samba 服务
Windows 访问
1. 创建映射盘用 samba 访问
cmd 执行以下命令后,资源管理器中会多出一个Z
盘
net use Z: \\172.22.180.148\jerry_samba /user:samba samba
切换账号登录
- 先右键断开它 (Z盘符占着呢,我不想换别的盘符)
- 我是WIN11,其他系统位置可能不太一样,自己找找。
- 勾上这个就能换账号了
2. 资源管理器访问
WIN + E
打开windows资源管理器,输入 \\172.22.180.148
切换账号登录
- 如果已经登录过,想要切换用户需要打开
凭据管理器
,删除与Samba
服务器相关的旧凭据。
WIN + R
输入control keymgr.dll
回车。
- 再把网络连接断开。
*
是全部,可以替换成具体连接如\\172.22.180.148
有哪些远程网络连接可以用net use
查看。
记得关掉命令行窗口,然后等一会(我测试1分钟内OK),再去访问就会提示我们输入密码了。net use * /delete
省屁吹灯
samba
跑起来后 Webmin
我就用不上了。不停了它朕心难安。
# 宿主机执行进入docker容器内
[jerry@CentOS8 samba]$ docker exec -it samba-webmin-container bash
# 停止 Webmin 服务
service webmin stop
# 查看 Webmin 服务状态,确认是否停止成功
service webmin status
- 需要时再启动它
# 启动 Webmin 服务
service webmin start