一、概述

最近公司准备全面实施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地址映射宿主地址问题的更多相关文章

  1. docker安装fastdfs单机版

    docker search fastdfs INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/season/fas ...

  2. docker安装fastdfs与java客户端测试

    一.docker 安装FastDFS 1.拉取镜像 docker pull morunchang/fastdfs 2.创建并启动tracker容器 docker run -d --name=track ...

  3. docker 安装 fastdfs

    fastdfs 安装 //1.拉取镜像 docker pull morunchang/fastdfs //2.启动tracker docker run -d --name tracker --net= ...

  4. Docker安装nacos1.0.0固定ip单机模式

    1 从dockerHub拉取镜像到本地 docker pull nacos/nacos-server:1.0.0 2 创建目录(宿主机) 2.1 日志目录 mkdir -p /docker/nacos ...

  5. 使用Docker安装FastDFS(分布式文件系统)

    1. 获取镜像 可以利用已有的FastDFS Docker镜像来运行FastDFS. 获取镜像可以通过下载 docker image pull delron/fastdfs 也可是直接使用提前下载的镜 ...

  6. Docker安装FastDFS

    什么是FastDFS? FastDFS 是用 c 语言编写的一款开源的分布式文件系统.FastDFS 为互联网量身定制, 充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,使用 ...

  7. Docker与FastDFS的安装命令及使用

    Docker特点 1)上手快 用户只需要几分钟,就可以把自己的程序“Docker 化”.Docker 依赖于“写时复制” (copy-on-write)模型,使修改应用程序也非常迅速,可以说达到“随心 ...

  8. docker 中安装 FastDFS 总结

    如题,参考各资料后,安装FastDFS总结.基于已有docker镜像 https://hub.docker.com/r/luhuiguo/fastdfs/ docker pull luhuiguo/f ...

  9. fastdfs通过docker安装

    安装前准备 # yum install -y git #下载git # cd /data # mkdir fastdfs # cd fastdfs # git clone https://github ...

随机推荐

  1. php获取时期时间信息函数

    在正式学习日期函数前大家得了解几个概念: 1.时区 2.世界时 3.unix时间戳 时区 这个概念,之前大家听说过很多.我们来啰嗦两句,我们现实生活中使用的实区,在电脑里面也是一样有规定的.大理石机械 ...

  2. am335x system upgrade kernel i2c rtc eeprom(六)

    1      Scope of Document This document describes i2c bus hardware design and support i2c-devices: ee ...

  3. 洛谷P2751 工序安排Job Processing

    题目 任务调度贪心. 需要明确一点,任务调度贪心题,并不是简单地应用排序的贪心,而是动态的运用堆,使每次选择是都能保持局部最优,并更新状态使得下次更新答案可以取到正确的最小值. 这是A过程的解. 然后 ...

  4. [CTF]CTF中if (md5(md5($_GET[‘a’])) == md5($_GET[‘b’])) 的绕过

    原作者:KTWO 出处:https://www.k2zone.cn/?p=2019 0X00 摘要 CTF中md5判等可使用0e绕过,但是如果是双md5该如何绕过呢?本文将教你如何绕过md5(md5( ...

  5. js检测手机上是否有此APP,有的话打开应用,没有的话跳转到appstore

    //html代码中 的 a 标签,以微信为例,默认的是调用weixin scheme,去打开本机的微信,如果没有则跳转到相应连接 <a href="weixin://" cl ...

  6. ubuntu之路——day10.5 可避免偏差

    可避免偏差: 总结一下就是当贝叶斯最优误差接近于训练误差的时候,比如下面的例子B,我们不会说我们的训练误差是8%,我们会说我可避免偏差是0.5%.

  7. tail -f 加过滤功能

    实时查看日志 通过-f参数,我们可以实时查看文件的新增内容: $ tail -f itbilu.log 注意:使用-f参数时不会中断文件监视,需要通过ctrl+c手动结束. 实时日志查看与grep过滤 ...

  8. 清理Windows.edb

    解决Windows.edb文件巨大的windows 10问题的另一个快速解决方法是删除Windows.edb文件. 步骤1:在任务管理器中终止SearchIndexer.exe --按Ctrl + A ...

  9. SVN创建分支/合并/切换使用

    原文地址:https://blog.csdn.net/lisq037/article/details/17501327 最近接项目要求,要在svn主干上创建分支,用分支来进行程序的bug修改,而主干上 ...

  10. javaweb--Rest访问(RestTemplate)

    Rest访问(RestTemplate)在实际的项目中,往往需要发送一个Get/Post请求到其他的系统(Rest API),比如向人员管理部门请求,然后解析返回信息获取该用户的基本信息等.JDK传统 ...