如何在单个Docker容器中运行Samba与SFTP镜像?不使用docker-compose及Dockerfile
在单个Docker容器中运行Samba与SFTP服务(无需Dockerfile或docker-compose)
Docker容器本质基于单个镜像启动,但可通过启动时执行自定义命令,在容器内同时安装并运行Samba和SFTP服务。以下是具体实现方案:
核心思路
选择带完整包管理工具的基础镜像(如Debian/Ubuntu),在容器启动流程中安装Samba与OpenSSH Server(SFTP依赖),完成服务配置后同时启动两者,并通过前台进程维持容器运行状态。
具体执行命令
运行以下docker run命令即可创建并启动包含双服务的容器:
docker run -d \ --name samba-sftp \ -p 22:22 \ # 映射SFTP端口 -p 445:445 \ # 映射Samba端口 -v /your/local/shared:/shared \ # 本地共享目录挂载到容器内 -e SFTP_USER=sftpuser \ # 自定义SFTP用户名 -e SFTP_PASS=sftppass \ # 自定义SFTP密码 -e SAMBA_PASS=sftppass \ # 自定义Samba密码(建议与SFTP一致) debian:latest \ bash -c "apt-get update && apt-get install -y samba openssh-server && \ # 创建SFTP系统用户并设置密码 useradd -m \$SFTP_USER && echo \"\$SFTP_USER:\$SFTP_PASS\" | chpasswd && \ # 为用户设置Samba访问密码 echo \"\$SAMBA_PASS\" | smbpasswd -s -a \$SFTP_USER && \ # 配置Samba共享规则 echo '[shared] path = /shared browseable = yes read only = no valid users = \$SFTP_USER' >> /etc/samba/smb.conf && \ # 调整SSHD配置允许密码登录 sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config && \ # 创建SSHD运行必需的目录 mkdir -p /run/sshd && \ # 后台启动Samba,启动SSHD,用tail维持容器前台运行 /usr/sbin/smbd -D && /usr/sbin/sshd && tail -f /dev/null"
关键细节说明
- 端口与目录:替换
/your/local/shared为本地实际共享目录,确保22、445端口未被本地服务占用。 - 安全优化:通过环境变量传入账号密码,避免硬编码;若需限制SFTP用户仅能访问共享目录,可在
bash -c命令中添加以下SSHD配置:sed -i '/Subsystem sftp/s/^/#/' /etc/ssh/sshd_config && \ echo 'Subsystem sftp internal-sftp' >> /etc/ssh/sshd_config && \ echo 'Match User \$SFTP_USER ChrootDirectory /shared ForceCommand internal-sftp AllowTcpForwarding no X11Forwarding no' >> /etc/ssh/sshd_config - 容器存活:
tail -f /dev/null作为容器主进程,防止因Samba、SSHD后台运行导致容器自动退出。
服务验证
- SFTP连接:执行
ssh sftpuser@localhost -p 22,输入设置的密码即可登录。 - Samba访问:在本地文件管理器中访问
\\localhost\shared,输入账号密码即可访问共享目录。
内容的提问来源于stack exchange,提问作者loki
相关产品推荐
相关产品推荐

