Dockerfile构建vsftpd服务
mkdir /dece && cd /dece
创建文件夹并进入vim Dockerfile
编辑dockerfile- 复制下面代码到Dockerfile中
# 使用docker官方的基础镜像 FROM docker.io/centos:latest # 维护者信息 MAINTAINER decezz decezz@qq.com # 设置环境变量 ENV FTP_USER admin ENV FTP_PASS **Random** ENV FTP_GROUP www ENV PASV_MIN_PORT 10030 ENV PASV_MAX_PORT 10060 ENV LOCAL_UMASK 077 # 镜像的操作指令 RUN yum -y install vsftpd* && \ yum -y install pam libdb-utils libdb --skip-broken && \ # 配置vsftpd pam认证 mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak && \ echo 'auth required pam_userdb.so db=/etc/vsftpd/vsftpd_users' > /etc/pam.d/vsftpd && \ sed -i '$a account required pam_userdb.so db=/etc/vsftpd/vsftpd_users' /etc/pam.d/vsftpd && \ mkdir -p /etc/vsftpd/vsftpd_user_conf && \ # 将用户限制在家目录 echo 'chroot_local_user=YES' >> /etc/vsftpd/vsftpd.conf && \ echo 'allow_writeable_chroot=YES' >> /etc/vsftpd/vsftpd.conf && \ # POST模式端口调整 sed -ri 's/connect_from_port_20=YES/connect_from_port_20=NO/g' /etc/vsftpd/vsftpd.conf && \ echo -e "port_enable=YES" >> /etc/vsftpd/vsftpd.conf && \ echo -e "ftp_data_port=10020" >> /etc/vsftpd/vsftpd.conf && \ # 关闭匿名访问 sed -ri 's/anonymous_enable=YES/anonymous_enable=NO/g' /etc/vsftpd/vsftpd.conf && \ sed -ri "s/local_umask=022/local_umask=$LOCAL_UMASK/g" /etc/vsftpd/vsftpd.conf # 添加脚本 ADD run.sh /usr/local/vsftpd/run.sh # 修改权限 RUN chmod -R 755 /usr/local/vsftpd/run.sh # 容器暴露的端口号 EXPOSE 10020 EXPOSE 21 EXPOSE $PASV_MIN_PORT-$PASV_MAX_PORT # 容器启动时执行命令 CMD ["/usr/local/vsftpd/run.sh"]
vim run.sh
编辑run.sh#!/bin/bash if [ "$FTP_PASS" = "**Random**" ]; then export FTP_PASS=`cat /dev/urandom | tr -dc A-Z-a-z-0-9 | head -c${1:-16}` fi # add home group groupadd $FTP_GROUP # add nologin user useradd -u 1000 -d /home/vsftpd -g $FTP_GROUP -s /sbin/nologin $FTP_GROUP # build home mkdir -p /home/vsftpd/$FTP_GROUP # change auth chown -R $FTP_GROUP:$FTP_GROUP /home/vsftpd/ # build virtual user echo -e "$FTP_USER" > /etc/vsftpd/vsftpd_users.txt echo -e "$FTP_PASS" >> /etc/vsftpd/vsftpd_users.txt # create text db /usr/bin/db_load -T -t hash -f /etc/vsftpd/vsftpd_users.txt /etc/vsftpd/vsftpd_users.db # add user conf info echo -e "local_root=/home/vsftpd/$FTP_GROUP" > /etc/vsftpd/vsftpd_user_conf/$FTP_USER sed -i '$a write_enable=YES' /etc/vsftpd/vsftpd_user_conf/$FTP_USER # add vsftpd config # start pasv mode echo -e "pasv_enable=YES" >> /etc/vsftpd/vsftpd.conf echo -e "pasv_min_port=$PASV_MIN_PORT" >> /etc/vsftpd/vsftpd.conf echo -e "pasv_max_port=$PASV_MAX_PORT" >> /etc/vsftpd/vsftpd.conf # start virtual mode echo -e "pam_service_name=vsftpd" >> /etc/vsftpd/vsftpd.conf echo -e "guest_enable=YES" >> /etc/vsftpd/vsftpd.conf echo -e "guest_username=$FTP_GROUP" >> /etc/vsftpd/vsftpd.conf echo -e "user_config_dir=/etc/vsftpd/vsftpd_user_conf" >> /etc/vsftpd/vsftpd.conf echo -e "virtual_use_local_privs=YES" >> /etc/vsftpd/vsftpd.conf cat << EOB ************************************************* * * * Docker image: dece/vsftpd * * * * * ************************************************* SERVER SETTINGS --------------- · FTP User: $FTP_USER · FTP Pass: $FTP_PASS · FTP group: $FTP_GROUP EOB # run vsftpd &>/dev/null /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
docker build -t vsftpd:dece .
构建docker镜像- 创建vsftpd容器
docker run -itd --name vsftpd \ -p 10021:21 \ -p 10020:10020 \ -p 10030-10060:10030-10060 \ -v /home/test:/home/vsftpd/www \ -e FTP_USER=theftp \ -e FTP_PASS=theftp123456 \ -e FTP_GROUP=www \ vsftpd:dece /bin/bash
- 如果容器内进程没启动,手动进入启动即可
/usr/local/vsftpd/run.sh