Docker 自制镜像:Ubuntu 安装 samba+Webmin

Docker 自制镜像:Ubuntu 安装 samba+Webmin

编写 Dockerfile

自己找个合适的位置创建个目录,然后编写 Dockerfile 文件。

这个镜像中就有 webminsamba

bash 复制代码
# 使用 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 文件)

bash 复制代码
docker build -t samba-webmin:v1.0 .

查看和确认镜像的相关信息:

bash 复制代码
docker images

运行容器

/data 是我单独挂载的一块6T的硬盘。

我打算把相关文件都放在 /data/samba/ 下。

bash 复制代码
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 全开了。

  • 宿主机:

    bash 复制代码
    sudo chmod 777 /data/samba/shared-data/
  • 容器内:

    bash 复制代码
    sudo chmod 777 /shared/

Webmin

访问:Webmin

(ip addr 查看IP)
http://172.22.180.148:10000/
Webmin 默认使用系统账户的用户名和密码进行登录认证。

  • 修改密码(前面好像我们没设置过密码,只能修改一下了)
bash 复制代码
# 宿主机执行进入docker容器内
[jerry@CentOS8 samba]$ docker exec -it samba-webmin-container bash

# 修改 root 密码
root@36e08d19e69b:/# passwd
Enter 新密码: (输入时是看不见的,脑补吧)
Retype 再次新密码: (输入时是看不见的,脑补吧)
passwd: password updated successfully

语言选一下

来这设置

我在 ubuntu 已经创建好了账号,这两个进去走一波。

修复错误

进入 Webmin 后顶部显示错误信息

bash 复制代码
 致命错误!
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 命令缺失

ifconfigip 是用于网络配置和管理的常用命令,Webmin 在运行过程中可能会依赖这些命令来获取网络信息。ifconfig 通常包含在 net-tools 软件包中,而 ip 命令包含在 iproute2 软件包中。
解决办法

你需要在 Docker 容器中安装 net-tools 和 iproute2 软件包。进入正在运行的 Docker 容器,执行以下命令:

bash 复制代码
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 模块:

bash 复制代码
apt-get install -y libmd5-perl

提交修改为新镜像

要自己控制一下版本号:之前是 samba-webmin:v1.0 提交后得到新的是 samba-webmin:v1.1

bash 复制代码
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 了)

bash 复制代码
docker save -o samba-webmin-v1.2.tar samba-webmin:v1.2

导入

  1. 执行加载命令:在终端中执行以下命令,将镜像文件加载到 Docker 中:
bash 复制代码
docker load -i samba-webmin-v1.2.tar

其中,-i 选项用于指定要加载的镜像文件的路径。如果镜像文件位于其他目录,需要使用完整的路径,例如:

bash 复制代码
docker load -i /home/user/images/samba-webmin-v1.2.tar
  1. 查看
bash 复制代码
docker images
  1. 运行。跟前面一样,只是这次镜像名叫 samba-webmin:v1.2
    运行容器

samba

samba 配置文件

/data/samba/samba-config/smb.conf

最终如下:samba,sambaadm 两个账号,一个只读,一个可读写。

bash 复制代码
# [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

bash 复制代码
net use Z: \\172.22.180.148\jerry_samba /user:samba samba
切换账号登录
  1. 先右键断开它 (Z盘符占着呢,我不想换别的盘符)
  2. 我是WIN11,其他系统位置可能不太一样,自己找找。
  3. 勾上这个就能换账号了

2. 资源管理器访问

WIN + E 打开windows资源管理器,输入 \\172.22.180.148

切换账号登录
  1. 如果已经登录过,想要切换用户需要打开 凭据管理器,删除与 Samba 服务器相关的旧凭据。
    WIN + R 输入 control keymgr.dll 回车。

  2. 再把网络连接断开。
    * 是全部,可以替换成具体连接如 \\172.22.180.148 有哪些远程网络连接可以用 net use 查看。

    bash 复制代码
    net use * /delete

    记得关掉命令行窗口,然后等一会(我测试1分钟内OK),再去访问就会提示我们输入密码了。

省屁吹灯

samba 跑起来后 Webmin 我就用不上了。不停了它朕心难安。

bash 复制代码
# 宿主机执行进入docker容器内
[jerry@CentOS8 samba]$ docker exec -it samba-webmin-container bash
# 停止 Webmin 服务
service webmin stop
# 查看 Webmin 服务状态,确认是否停止成功                                                                     
service webmin status 
  • 需要时再启动它
bash 复制代码
# 启动 Webmin 服务
service webmin start

参考资料

https://webmin.com/

相关推荐
人间打气筒(Ada)3 小时前
ubuntu网络及软件包管理
网络·ubuntu·php
Abdullah al-Sa3 小时前
Docker教程(喂饭级!)
c++·人工智能·docker·容器
web2u4 小时前
Docker入门及基本概念
java·运维·服务器·spring·docker·容器
元气满满的热码式4 小时前
Docker实战-使用docker compose搭建博客
运维·docker·容器
Anna_Tong5 小时前
阿里云如何协助解决操作系统兼容性问题
linux·服务器·ubuntu·阿里云·centos·云计算·系统迁移
哥是黑大帅8 小时前
Docker基于Ollama本地部署大语言模型
python·docker·语言模型
升讯威在线客服系统9 小时前
如何通过 Docker 在没有域名的情况下快速上线客服系统
java·运维·前端·python·docker·容器·.net
Karoku06611 小时前
【CI/CD】CI/CD环境搭建流程和持续集成环境配置
运维·ci/cd·docker·容器·kubernetes·prometheus
勤奋的凯尔森同学14 小时前
webmin配置终端显示样式,模仿UbuntuDesktop终端
linux·运维·服务器·ubuntu·webmin