docker安装fastdfs碰到storage的IP地址映射宿主地址问题
一、概述
最近公司准备全面实施docker部署,解决每次项目实施安装部署环境工作量大问题,mysql5.7、oracle12c很顺利,在安装fastdfs时碰到storage的IP地址映射问题。服务器采用的是CentOS7.6,关闭了firewall,启动镜像后在局域网其他机器无法通过fastdfs-java-client上传文件,获取的storage的IP地址为容器的IP地址,局域网其他机器无法访问容器的IP地址,查找了很多资料包括:docker-proxy iptables 等最终解决问题,记录下来方便。
二、fastdfs镜像安装和容器启动
fastdfs镜像是通过作者提供的dockerfile进行构建:https://github.com/happyfish100/fastdfs/tree/master/docker/dockerfile_network,构建比较简单,下载作者提供的dockerfile_network目录,里面包含了用最新的代码构建fastdfs的镜像,然后在目录执行:
docker build -t fastdfs:V5.11 .
构建成功后,通过docker images查看镜像

启动镜像,本机的IP地址为 192.168.1.98 执行以下命令启动:
docker run -d -e FASTDFS_IPADDR=192.168.1.98 -p 8888:8888 -p 22122:22122 -p 23000:23000 -p 8011:80 --name test-fast fastdfs:V5.11
三、问题描述和分析
在另一台机器192.168.1.230使用fastdfs-client-java测试上传图片,总是报错提示 connect time out ,调试代码后发现连接到tracker server (192.168.1.98:22122)成功的,并且返回了storage信息,但是storage地址是:172.17.0.1:23000,192.168.1.230是无法连接到172.17.0.1的IP,这个IP是docker的一个虚拟网卡IP,用于桥接运行容器,如下图:

查看了作者提供的fastdfs.sh文件,容器启动时已经把storage.conf的配置文件里面的tracker_server地址替换为FASTDFS_IPADDR=192.168.1.98参数的地址,也就是说storage是连接到tracker server 的地址是192.168.1.98:22122,按道理storage注册到tracker server的地址应该也是192.168.1.98,进入容器查看tracker server的信息:
[root@localhost ~]# docker exec -it test-fast /bin/bash
[root@854ce848546a /]# /usr/bin/fdfs_monitor /etc/fdfs/storage.conf

到这里问题已经找到了,storage server在容器里面连接到192.168.1.98:22122 地址时,tracker server记录到storage的地址是 docker0 虚拟网卡(172.17.0.1)的地址。
对centos下docker的网络不熟悉,百度学习了很久的 docker网络(Bridge模式、Host模式、Containner模式等)、iptables的知识后,大概知道storage server在容器里面连接192.168.1.98:22122 ,通过NAT表转发到tracker server时,数据包里面的源地址为:172.17.0.1导致了tracker server默认认为storage的地址是172.17.0.1
四、解决问题的思路
在学习了iptables的知识后(主要看了 http://www.zsythink.net/archives/1199/ )后,已经明白在NAT表转发过程中,数据达到172.17.0.2的22122端口记录的源地址是 172.17.0.1,我们只需要修改iptables的NAT表规则,所有转发到172.12.0.2:22122的数据,源地址修改为宿主主机的地址:192.168.1.98,这样storage注册到tracker server时,tracker server获取到storage的ip地址为 192.168.1.88 而不是网关地址172.17.0.1
iptables -t nat -A POSTROUTING -p tcp -m tcp --dport 22122 -d 172.17.0.2 -j SNAT --to 192.168.1.98
使用iptables -L -t nat 查看nat表规则

重新执行fastdfs-client-java的工程,返回的storage的地址为 192.168.1.98,上传成功:

五、总结
个人感觉采用docker部署后,网络环境会比单机更加复杂,如果直接采用Host模式的网络和单机一样,如果采用Bridge模式的换会复杂很多,想学docker的话必须很好掌握docker的网络的基础知识。同时在liunx下如果使用了iptables的话,也需要了解docker和iptables的技术细节。我觉得这个思路也许能解决目前fastdfs的内网IP映射外网进行上传的问题,找个时间试试看。
docker安装fastdfs碰到storage的IP地址映射宿主地址问题的更多相关文章
- docker安装fastdfs单机版
docker search fastdfs INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/season/fas ...
- docker安装fastdfs与java客户端测试
一.docker 安装FastDFS 1.拉取镜像 docker pull morunchang/fastdfs 2.创建并启动tracker容器 docker run -d --name=track ...
- docker 安装 fastdfs
fastdfs 安装 //1.拉取镜像 docker pull morunchang/fastdfs //2.启动tracker docker run -d --name tracker --net= ...
- Docker安装nacos1.0.0固定ip单机模式
1 从dockerHub拉取镜像到本地 docker pull nacos/nacos-server:1.0.0 2 创建目录(宿主机) 2.1 日志目录 mkdir -p /docker/nacos ...
- 使用Docker安装FastDFS(分布式文件系统)
1. 获取镜像 可以利用已有的FastDFS Docker镜像来运行FastDFS. 获取镜像可以通过下载 docker image pull delron/fastdfs 也可是直接使用提前下载的镜 ...
- Docker安装FastDFS
什么是FastDFS? FastDFS 是用 c 语言编写的一款开源的分布式文件系统.FastDFS 为互联网量身定制, 充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,使用 ...
- Docker与FastDFS的安装命令及使用
Docker特点 1)上手快 用户只需要几分钟,就可以把自己的程序“Docker 化”.Docker 依赖于“写时复制” (copy-on-write)模型,使修改应用程序也非常迅速,可以说达到“随心 ...
- docker 中安装 FastDFS 总结
如题,参考各资料后,安装FastDFS总结.基于已有docker镜像 https://hub.docker.com/r/luhuiguo/fastdfs/ docker pull luhuiguo/f ...
- fastdfs通过docker安装
安装前准备 # yum install -y git #下载git # cd /data # mkdir fastdfs # cd fastdfs # git clone https://github ...
随机推荐
- Codeforces Round #604 (Div. 2) A,B,C【D题待补】
思路:直接暴力判断就OK了 #include<bits/stdc++.h> using namespace std; #define int long long signed main() ...
- java.security KeyPairGenerator
KeyPairGenerator 类用于生成公钥和私钥对.密钥对生成器是使用 getInstance 工厂方法(返回一个给定类的实例的静态方法)构造的. 特定算法的密钥对生成器可以创建能够与此算法一起 ...
- FTP与HTTP上传文件的对比
许多站点,比如facebook或一些博客等都允许用户上传或下载文件,比如论坛或博客系统的图片. 在这种情况下,通常有两种选择上传文件到服务器,那就是FTP协议和HTTP协议. 以下列出了一些两者的不同 ...
- fread和fwrite和feof读写二进制文件
#include <stdio.h> #include <stdlib.h> void text_to_bin(char *argv[]); void bin_to_text( ...
- (1)前端框架uni-app
前端框架uni-app 可编译到iOS.Android.H5.小程序等多个平台 一套代码编到7个平台 uni-app在跨端数量.扩展能力.性能体验.周边生态.学习成本.开发成本等6大关键指标上拥有极强 ...
- 7中漂亮的纯css字体
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 解释下Http协议
HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统. HTTP协议的主要特点可概括如下: 1.支持客户/服务器模式. 2.简单快速:客户向服务器请求服务时,只 ...
- 使用composer下载依赖包下载失败的解决方法
下载好的composer默认的下载地址是国外的,在下载的过程中网络不好或者可能被墙,将下载的地址换成国内的地址即可 有两种方式启用本镜像服务: 系统全局配置: 即将配置信息添加到 Composer 的 ...
- Spring boot Security 登陆安全配置
实现的效果 访问url时,如果未登录时跳转到Login界面,要求用户登陆,如果登陆过返回请求的数据. 效果图 访问数据时,未登录返回login界面 登陆操作 登陆成功进入登出界面 登陆成功后再次访问数 ...
- Windows下基于IIS服务的SSL服务器的配置
Windows下基于IIS服务的SSL服务器的配置 实验环境 Windows Server 2008 R1(CA) Windows Server 2008 R2(web服务器) Windows 7 x ...