一、概述

最近公司准备全面实施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. Acwing P283 多边形 题解

    Analysis 总体来说是一个区间DP 此题首先是一个环,要你进行删边操作,剩下的在经过运算得到一个最大值 注意事项: 1.删去一条边,剩下的构成一条线,相当于求此的最大值,经典区间DP该有的样子: ...

  2. Linux中三种SCSI target的介绍之SCST

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/scaleqiao/article/deta ...

  3. leetcode解题报告(31):Kth Largest Element in an Array

    描述 Find the kth largest element in an unsorted array. Note that it is the kth largest element in the ...

  4. 2017.10.7 国庆清北 D7T2 第k大区间

    题目描述 定义一个长度为奇数的区间的值为其所包含的的元素的中位数. 现给出n个数,求将所有长度为奇数的区间的值排序后,第K大的值为多少. 输入输出格式 输入格式: 输入文件名为kth.in. 第一行两 ...

  5. Luogu4294 【WC2008】游览计划

    斯坦纳树(我也不知道为什么叫这个名字)是一种状压dp的套路,求在无向带花连通图中,选取边使一些特殊点连通起来的最小花费. 具体到这题就是这样的,设\(f_{u,S}\)表示当前根是\(u\),与它连通 ...

  6. Pytest权威教程07-Monkeypatching,对模块和环境进行Mock

    目录 Monkeypatching,对模块和环境进行Mock 简单示例如: 猴子补丁方法 Monkeypatching 返回对象: 构建mock类 全局补丁示例如:阻止"requests&q ...

  7. hive 属性随笔记录

    set hive.mapred.mode=strict; //设置hive执行模式,默认为nonstrict(非严格模式),这里设置为严格模式 set hiveconf:hive.cli.print. ...

  8. windows--zabbix-agent添加主机

        1.首先在 C 盘根目录下创建 zabbix 的文件夹 2.将需要的文件拖到该文件夹内(bin/win64) 3.修改 windows 配置文件(zabbix.agent.win.conf)的 ...

  9. fluent中interpolate的用法

    原视频下载地址: https://pan.baidu.com/s/1hTD6tIlYL1S0nm30riAD9w 密码: ngv9

  10. arts打卡13周

    算法: 报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数.其前五项如下: 1. 12. 113. 214. 12115. 1112211 被读作  "one 1" ...