docker下ftp传输
❶ docker java 主动模式访问ftp, 随机端口如何映射
提供一个思路,Docker 的宿主机 部署CICD的工具,然后docker容器内获得端口的时候,通过webhook来出发宿主机的CI脚本来添加映射。。。
❷ docker容器里怎么安装ftp协议
1、创建容器
docker run --name centos_ssh_ftp --privileged=true -p 10.0.75.1:3222:22 -p 10.0.75.1:3223:3223 -p 10.0.75.1:3224-3299:3224-3299 -v e:/softs:/softs -it centos_ssh
说明:
--name centos_ssh_ftp #指定创建的容器的名称为centos_ssh_ftp
--privileged=true #授权,开启系统文件的权限,比如可以编辑iptables
-p <宿主ip:宿主端口:容器端口> #将宿主机的指定端口映射到容器的指定端口,就是子网对外开放的端口,可以多个,也可以设置区间段如,3224-3299,这里我们把3222映射到容器的22,则外网通过宿主机的3222端口进行ssh连接,其他端口是为vsftpd被动模式准备的
-v <宿主机目录:容器目录> #将宿主机目录映射到容器对应目录,可以直接操作目录和文件
-it <镜像名称> #以交互模式启动镜像,没什么可说的,启动完后会自动进入容器的root交互终端
2、安装ssh
先查看是否已经安装,看有没有sshd
chkconfig --list #该命令可以看到本机上的服务和启动状态,以后设置服务开机子自启动也会用到
yum -y
install openssh-server
安装完毕,查看chkconfig --list
sshd
手动启动sshd
service sshd start
设置开机自启动
chkconfig sshd on
查看是否设置成功,2-5都是on就是设置成功
# chkconfig --list sshdsshd
0:off
1:off
2:on
3:on
4:on
5:on
6:off
此时在宿主机外通过ssh远程连接工具远程到宿主机ip(10.0.75.1)的端口(3222)应该就可以了
3、安装vsftpd
查看是否已经安装了vsftpd
rpm -aq|grep vsftpd
没有则安装
yum -y install vsftpd
添加一个ftp用户用来登录
useradd ftp
给ftp用户添加密码
passwd ftp
设置ftp用户的根目录,先创建目录/data/ftp
usermod -d /data/ftp ftp
将该目录的拥有者改为ftp
chown ftp /data/ftp
修改配置文件
vi
/etc/vsftpd/vsftpd.conf
anonymous_enable=NO #不允许匿名登录
ftpd_banner=welcome to ftp service #设置连接服务器后的欢迎信息
max_clients=200 #指明服务器总的客户并发连接数为200
max_per_ip=3 #指明每个客户机的最大连接数为3
chroot_local_user=YES #只能查看自己的根目录
listen_port=3223 #设置FTP工作的端口号,默认的为21 这里改为3223, 如果还是21映射过来,能登录却取不到目录
pasv_enable=YES #开启被动模式
pasv_min_port=3224 #被动模式的最小端口
pasv_max_prot=3299 #被动模式使用的最大端口
pasv_addr_resolve=YES #启用被动模式的回传地址
pasv_address=10.0.75.1 #这里其实就是宿主机的ip
启动vsftp
service vsftp start
使用ftp连接工具,看是否正确连接,能否创建删除文件,是否可以访问根目录以外
设置开机自启动
chkconfig vsftpd on
查看是否设置成功,2-5都是on就是设置成功
# chkconfig --list
vsftpd
vsftpd
0:off
1:off
2:on
3:on
4:on
5:on
6:off
❸ 四、Docker网络揭秘
Docker 之所以功能这么强大,其实就是充分利用了Linux Kernel的特性:NameSpace、CGroups、UnionFileSystem。通过这些特性实现了资源隔离、限制与分层等。本文这次就来揭晓Docker中的容器是如何做到网络互通的。
两台机器如果要实现通信,其实就是通过底层的网卡进行数据传输,每个网卡都有一个唯一的MAC地址,网卡又会绑定一个ip地址,只要两台机器的网络可以互通,那么这两台机器就可以进行通信。
想要实现通信,就得有两个同一网段的网卡,两个网卡必须是可以 ping 通的。
Docker在安装成功后,会在宿主机创建一个docker0网卡,这个网卡就是负责容器与宿主机之间通信的桥梁。
通过Docker创建一个容器之后,会在宿主机再创建一个网卡,也就是上面的 veth3543ea3@if7 ,容器内也会创建一个网卡。
一般成对的网卡,网卡组件名称后面的数字是连续的,比如宿主机的 @if7 和容器内的 @if8 ,正是这成对的网卡,才实现了容器与宿主机之间的通信。这其实是利用 Linux Kernel 的特性 NameSpace 实现的网卡隔离,不同NameSpace下的网卡是独立的,就像Java程序中的 package 一样。
从上面的例子中看到容器与宿主机之间的通信好像并不是通过docker0网卡实现的?
其实这只是单容器的状态,可能看不出docker0的作用。用图来表示一下单容器的网卡通信情况。
通过docker生成的 eth0 和 veth 两个网卡实现同一网段内的通信,而这个网卡又是桥接在docker0网卡上的。
再看下有多个容器的情况。
两个容器之间可以互相通信的原因就是因为docker0的存在,因为它们的网卡都是桥接在docker0上,所以也就有了和另一个容器通信的桥。
我们来验证一下是不是这样!
这种网络连接方法我们称为Bridge,这也是docker中默认的网络模式。可以通过命令查看docker中的网络模式:
通过 docker network ls 命令查看到,docker提供了3种网络模式,brige模式我们已经知道了,那 host 和 none 又是什么意思呢?不妨来验证一下:
这种模式只会创建一个本地的环路网卡,无法与其他容器或宿主机进行通信。
在创建自己的network之前先来解释一下为什么要创建新的network。
我们用一个例子来演示一下不同容器之间的通信。
容器之间通过 ip 是可以正常访问的,但是有没有这种情况:如果一个容器出问题了,我们重启之后它的ip变了,那是不是其他用到这个容器的项目配置是不是都得改。
有没有可能直接通过容器名称来访问呢?来验证一下:
发现并不能 ping 通,但是可以使用别的手段来达到这个目的。
通过上面这种方式就可以做到以容器名来 ping 通其他容器,其实它就跟windows系统中在 hosts 文件里加了个映射是一样的。
可以看到创建自定义的 network 自动帮我们实现了这个功能,而且使用自定义的 network 也方便管理,不同业务类型的容器可以指定不同的 network。
不同的 network ip网段也不一样,这样也可以增加单机中可以创建的容器的数量。
在创建一个容器的时候,一般都需要讲容器需要暴露的端口映射到物理主机的相同端口或其他端口,因为在外网环境下是不方便直接连接到容器的,所以需要通过映射端口的方式,让外网访问宿主机的映射端口来访问容器。
如果想建立多个容器,势必需要端口映射,以满足不同容器使用相同端口的情况。
以上这些内容都是在单容器进行操作,容器之间通信也只是通过 docker0 实现的桥接模式。
如果要实现多机之间的docker通信,其实还是通过网卡,只不过需要其他的技术来实现了。
本章节就不在演示,到后面的章节再来分析!