宿主机为centos7系统,docker部署vsftp
#部署服务,账号密码都为test
docker run -d -v /home/ftp:/home/vsftpd -p 20:20 -p 21:21 -p 21100-21110:21100-21110 -e FTP_USER=test -e FTP_PASS=test -e PASV_ADDRESS=127.0.0.1 -e PASV_MIN_PORT=21100 -e PASV_MAX_PORT=21110 --name vsftpd --restart=always fauria/vsftpd
#开启firewall-cmd防火墙对应的端口
firewall-cmd --permanent --add-port=20/tcp
firewall-cmd --permanent --add-port=21/tcp
firewall-cmd --permanent --add-port=21100/tcp
firewall-cmd --permanent --add-port=20/tcp
firewall-cmd --permanent --add-port=21/tcp
firewall-cmd --permanent --add-port=21100/tcp
firewall-cmd --permanent --add-port=21101/tcp
firewall-cmd --permanent --add-port=21102/tcp
firewall-cmd --permanent --add-port=21103/tcp
firewall-cmd --permanent --add-port=21104/tcp
firewall-cmd --permanent --add-port=21105/tcp
firewall-cmd --permanent --add-port=21106/tcp
firewall-cmd --permanent --add-port=21107/tcp
firewall-cmd --permanent --add-port=21108/tcp
firewall-cmd --permanent --add-port=21109/tcp
firewall-cmd --permanent --add-port=21110/tcp
firewall-cmd --reload
#新建用户文件夹
docker exec -i -t vsftpd bash
mkdir /home/vsftpd/test
vi /home/vsftpd/test/1.txt
#访问服务
* [ftp://test:test@192.168.60.128:21](ftp://test:test@192.168.11.124/)

访问vsftp服务.png
---------------------------------------------------------------练习python-------------------------------------------
附加:python测试
python上传文件
特别注意不能把全路径加上,否则会导致权限不足
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import tempfile
from contextlib import contextmanager
from ftplib import FTP
class FtpConfig(object):
"""ftp配置信息
"""
__ftp_config = None
ACTIVE_MODE = 1 # 主动模式
PASSIVE_MODE = 0 # 被动模式
def __init__(self, host, username, password, port, ftp_root):
self.host = host
self.username = username
self.password = password
self.port = port
self.ftp_root = ftp_root
@classmethod
def get_ftp_object(cls):
"""查询ftp配置信息
:return ftp配置对象
:rtype FtpConfig()
"""
if cls.__ftp_config:
return cls.__ftp_config
# ftp服务器相关配置
# TODO: 配置文件应该单独维护在配置文件中,方便修改,演示用,就不另外拆分了
host = "192.168.1.86"
username = "ftp"
password = "ftp"
root = "/home/ftp/ftp"
port = 21
cls.__ftp_config = cls(host, username, password, port, root)
return cls.__ftp_config
@contextmanager
def ftp_connect(host, username, password, port):
"""获取ftp连接
:param host ftp主机
:type host str
:param username ftp用户名
:type username str
:param password ftp密码
:type password str
:param port ftp端口
:type port int
"""
ftp_conn = FTP()
ftp_conn.set_debuglevel(2)
ftp_conn.connect(host, port)
ftp_conn.login(username, password)
yield ftp_conn
ftp_conn.quit()
def upload_file(local_path, remote_name):
"""上传文件到ftp服务器
:param local_path: 本地文件路径
:type local_path str
:param remote_name: 目标服务文件名
:type remote_name str
"""
buf_size = 1024 * 1 # 每次读取的文件大小
ftp_obj = FtpConfig.get_ftp_object()
with ftp_connect(ftp_obj.host, ftp_obj.username, ftp_obj.password, ftp_obj.port) as ftp_conn:
old_pasv = ftp_conn.passiveserver
# 修改模式
if old_pasv == ftp_obj.ACTIVE_MODE:
ftp_conn.set_pasv(ftp_obj.PASSIVE_MODE)
try:
# 上传文件
with open(local_path, 'rb') as fp:
# 特别注意不能把全路径加上,否则会导致权限不足
ftp_conn.storbinary('STOR ' + remote_name, fp, buf_size)
finally:
# 修改回原来的模式
if old_pasv != ftp_conn.passiveserver:
ftp_conn.set_pasv(old_pasv)
@contextmanager
def make_temp_file(suffix="_test", prefix="test_", clean=True):
"""创建临时文件
:param suffix 临时文件后缀
:type suffix str
:param prefix 临时文件前缀
:type suffix str
:param clean 是否清除临时文件
:type clean bool
True 在with语句之后删除文件
"""
curr_path = os.path.dirname(os.path.abspath(__file__))
temp_file = tempfile.mktemp(suffix=suffix, prefix=prefix, dir=curr_path)
try:
yield temp_file
finally:
if clean and os.path.isfile(temp_file):
os.remove(temp_file)
def test():
"""测试上传文件
"""
with make_temp_file() as temp_file:
file_name = os.path.basename(temp_file)
with open(temp_file, "a") as f:
f.write(file_name)
upload_file(temp_file, file_name)
if __name__ == '__main__':
test()
参考地址:http://www.hangge.com/blog/cache/detail_2449.html