文章目录
- fauria/vsftpd
- dockerfile原始文件
- dockerfile解析
fauria/vsftpd
fauria/vsftpd
是一个由Docker Hub用户"fauria"创建的Docker镜像。这个镜像是基于CentOS 7构建的,包含了vsftpd(Very Secure FTP Daemon)服务,并支持被动模式和虚拟用户。通过使用这个镜像,用户可以快速地部署一个vsftpd服务器,并根据需要进行配置和定制。
但是注意,由于使用的基础镜像为centos7,这个镜像不支持arm架构。
dockerhub链接:
https://hub.docker.com/r/fauria/vsftpd/dockerfile
dockerfile原始文件
FROM centos:7
ARG USER_ID=14
ARG GROUP_ID=50
MAINTAINER Fer Uria <fauria@gmail.com>
LABEL Description="vsftpd Docker image based on Centos 7. Supports passive mode and virtual users." \
License="Apache License 2.0" \
Usage="docker run -d -p [HOST PORT NUMBER]:21 -v [HOST FTP HOME]:/home/vsftpd fauria/vsftpd" \
Version="1.0"
RUN yum -y update && yum clean all
RUN yum install -y \
vsftpd \
db4-utils \
db4 \
iproute && yum clean all
RUN usermod -u ${USER_ID} ftp
RUN groupmod -g ${GROUP_ID} ftp
ENV FTP_USER **String**
ENV FTP_PASS **Random**
ENV PASV_ADDRESS **IPv4**
ENV PASV_ADDR_RESOLVE NO
ENV PASV_ENABLE YES
ENV PASV_MIN_PORT 21100
ENV PASV_MAX_PORT 21110
ENV XFERLOG_STD_FORMAT NO
ENV LOG_STDOUT **Boolean**
ENV FILE_OPEN_MODE 0666
ENV LOCAL_UMASK 077
ENV REVERSE_LOOKUP_ENABLE YES
ENV PASV_PROMISCUOUS NO
ENV PORT_PROMISCUOUS NO
COPY vsftpd.conf /etc/vsftpd/
COPY vsftpd_virtual /etc/pam.d/
COPY run-vsftpd.sh /usr/sbin/
RUN chmod +x /usr/sbin/run-vsftpd.sh
RUN mkdir -p /home/vsftpd/
RUN chown -R ftp:ftp /home/vsftpd/
VOLUME /home/vsftpd
VOLUME /var/log/vsftpd
EXPOSE 20 21
CMD ["/usr/sbin/run-vsftpd.sh"]
dockerfile解析
这是用于构建一个基于CentOS 7的vsftpd镜像的Dockerfile文件,下面将对它解释:
FROM centos:7
:指定基础镜像为CentOS 7。ARG USER_ID=14
和ARG GROUP_ID=50
:定义了两个构建参数,用于指定vsftpd用户和组的ID。MAINTAINER Fer Uria <fauria@gmail.com>
:指定镜像的维护者信息。LABEL
:定义了一些标签,包括描述、许可证、用法和版本等信息。RUN yum -y update && yum clean all
:更新系统并清理yum缓存。
(清理yum缓存的目的是为了减少镜像的大小,并且可以避免在构建镜像时下载重复的软件包。当使用yum install
命令安装软件包时,yum会将下载的软件包存储在缓存目录中,以便在以后的安装中重复使用。然而,在构建Docker镜像时,这些缓存文件并不需要包含在镜像中,因为它们只会增加镜像的大小,而不会对镜像的功能产生影响。
通过在Dockerfile中添加yum clean all
命令,可以清理yum缓存,删除已下载的软件包和元数据文件。这样可以减小镜像的体积,并且在构建镜像时不会包含不必要的缓存文件。这对于减少镜像的大小和加快构建过程都是有益的。)
RUN yum install -y \ vsftpd \ db4-utils \ db4 \ iproute && yum clean all
:安装vsftpd、db4-utils、db4和iproute等软件包,并清理yum缓存。
db4-utils
、db4
和iproute
是在Dockerfile中安装的软件包,它们的作用如下:
-
db4-utils
:这是Berkeley DB的实用工具包,它提供了一些用于管理和操作Berkeley DB数据库的命令行工具,如db_dump
、db_load
等。在vsftpd中,可能会使用Berkeley DB来存储虚拟用户的认证信息。 -
db4
:这是Berkeley DB的运行时库,它提供了对Berkeley DB数据库的访问功能。在vsftpd中,可能会使用Berkeley DB库来读取和验证虚拟用户的认证信息。 -
iproute
:这是一个网络工具包,它提供了一些用于配置和管理网络接口、路由表、流量控制等的命令行工具,如ip
命令。在vsftpd中,可能会使用ip
命令来配置网络接口和路由,以支持被动模式的数据传输。
RUN usermod -u ${USER_ID} ftp
:修改ftp用户的ID为构建参数中指定的值。RUN groupmod -g ${GROUP_ID} ftp
:修改ftp组的ID为构建参数中指定的值。
执行RUN usermod -u ${USER_ID} ftp
和RUN groupmod -g ${GROUP_ID} ftp
的目的是修改vsftpd服务所使用的ftp用户和组的ID。
在Docker容器中,每个用户和组都有一个唯一的ID。默认情况下,CentOS 7中的ftp用户和组的ID是14和50。然而,为了避免与宿主机或其他容器中的用户和组冲突,我们可以通过构建参数来指定新的ID。
通过执行usermod
和groupmod
命令,我们可以修改ftp用户和组的ID为构建参数中指定的值。这样可以确保在容器中运行vsftpd服务时,使用的用户和组的ID是唯一的,并且不会与其他用户和组发生冲突。
这样做的好处是,可以更好地隔离容器中的用户和组,避免潜在的安全问题和冲突。同时,也可以更灵活地根据需要定制用户和组的ID,以适应不同的环境和需求。
ENV
:设置一系列环境变量,包括FTP用户、密码、被动模式的地址和端口等。
在Dockerfile中,ENV FTP_USER **String**
中的String
是一个占位符,表示需要替换为实际的字符串值。
ENV
指令用于设置环境变量,其中FTP_USER
是环境变量的名称,**String**
是环境变量的值。在这里,**String**
表示需要替换为实际的字符串值。
例如,如果要将FTP_USER
设置为myuser
,则可以将ENV FTP_USER **String**
替换为ENV FTP_USER myuser
。
在构建Docker镜像时,可以通过在命令行中使用--build-arg
参数来传递实际的字符串值,例如:
docker build --build-arg FTP_USER=myuser .
这样,在构建过程中,Docker将使用传递的值来替换**String**
,并将FTP_USER
设置为myuser
。
除此之外,还可以在运行容器时通过命令行参数来传递环境变量的值。
在运行容器时,可以使用-e
或--env
参数来设置环境变量。例如,要将FTP_USER
设置为myuser
,可以使用以下命令:
docker run -e FTP_USER=myuser <image_name>
这样,在运行容器时,Docker将使用传递的值来设置FTP_USER
环境变量。
同时,还可以使用--env-file
参数来从文件中读取环境变量的值。例如,如果有一个名为env.txt
的文件,其中包含了FTP_USER=myuser
这一行,可以使用以下命令:
docker run --env-file env.txt <image_name>
这样,Docker将从env.txt
文件中读取环境变量的值,并将其设置为容器中的环境变量。
无论是通过命令行参数还是通过文件来传递环境变量的值,都可以在运行容器时动态地设置环境变量,以适应不同的需求和配置。
COPY
:将本地文件复制到镜像中的指定位置。RUN chmod +x /usr/sbin/run-vsftpd.sh
:给run-vsftpd.sh
脚本添加可执行权限。RUN mkdir -p /home/vsftpd/
:创建vsftpd的主目录。RUN chown -R ftp:ftp /home/vsftpd/
:将vsftpd的主目录的所有权赋予ftp用户和组。VOLUME
:定义了两个数据卷,分别用于存储vsftpd的主目录和日志文件。EXPOSE
:声明容器将监听的端口号。
VOLUME
和EXPOSE
指令在Dockerfile中只是用来提供一些元数据信息,而不会自动进行挂载和端口映射。
VOLUME
指令用于声明容器中的挂载点,以便其他人在构建和运行容器时知道哪些目录或文件是可以挂载的。但是,它并不会自动在容器中创建挂载点或将主机上的目录或文件与容器中的挂载点进行关联。要实际进行挂载,需要在运行容器时使用-v
参数来指定挂载点。
同样地,EXPOSE
指令用于声明容器将监听的端口,以便其他人在构建和运行容器时知道哪些端口是可以连接的。但是,它并不会自动将容器的端口映射到主机上的端口。要实际进行端口映射,需要在运行容器时使用-p
参数来指定端口映射规则。
因此,VOLUME
和EXPOSE
指令在Dockerfile中只是提供一些元数据信息,实际的挂载和端口映射需要在运行容器时通过命令行参数来完成。
CMD
:指定容器启动时要执行的命令。
这个Dockerfile的作用是构建一个包含vsftpd服务的镜像,并设置了一些默认配置和环境变量。