【FastDfs】Docker自定义构建ARM架构的FastDfs镜像

  • 1. 环境准备
    • 1.1 下载源码包
  • 2. 初步构建只包含安装包的基础镜像
  • 3. 在基础镜像上编译安装所需软件
  • 2022-11-09
  • 2023-07-01
    • 1. 单机部署
    • 2. 测试上传文件
    • 3. 分布式部署

由于服务器环境为ARM架构,在部署fastdfs时,发现网上的镜像几乎都是X86_64的,不同架构的镜像还不能通用,这个就有点烦了。。。。。

由于之前没有从头编译制作过镜像,步步都是坑,在折腾了几天之后,终于倒腾出来了,这里记录下构建过程。可以举一反三,定制自己的镜像。

这里贴一下官方的原贴:happyfish100/fastdfs,目前的源码,按照这个部署还是没问题的。

这里贴一下已经打包好的镜像,可直接拉取使用:docker pull onlyonelmm/fastdfs-arm64,使用方法可参考:https://hub.docker.com/r/onlyonelmm/fastdfs-arm64

下面是制作该镜像的过程。

1. 环境准备

1.1 下载源码包

拉取官方模块代码工具包,这里推荐使用github下载最新版代码,其中,我们需要的是这三个

fastdfs:

git clone https://github.com/happyfish100/fastdfs.git --depth 1

fastdfs-nginx-module

git clone https://github.com/happyfish100/fastdfs-nginx-module.git --depth 1

libfastcommon

git clone https://github.com/happyfish100/libfastcommon.git --depth 1

如果提示 git clone 出现fatal: unable to access ‘https://github ,将上面地址git clone https换成 git clone git

下载nginx压缩包

wget http://nginx.org/download/nginx-1.15.4.tar.gz

2. 初步构建只包含安装包的基础镜像

下载完成后,开始编写 Dockerfile :vi Dockerfile

FROM centos:7MAINTAINER lmm "1632284989@qq.com"WORKDIR /ADD libfastcommon /usr/local/src/libfastcommonADD fastdfs /usr/local/src/fastdfsADD fastdfs-nginx-module /usr/local/src/fastdfs-nginx-moduleADD nginx-1.15.4.tar.gz /usr/local/src

这里先制作一个基础镜像,将源码包整到镜像里面。构建基础镜像:docker build -t fastdfs:V1.0.0 . 注意这里最后的点,表示在当前目录下构建镜像。

这里并没有直接编译,等会可以进入容器里面手动编译,如果编译出错,可以直接使用基础镜像重新启动一个容器。

使用docker images 可以看到镜像 fastdfs:V1.0.0

3. 在基础镜像上编译安装所需软件

接着以交互式的方式运行上面的基础镜像:docker run -itd --name fastdfs_container fastdfs:V1.0.0 /bin/bash

进入容器内部,到特定文件夹下手动编译:

mkdir /home/fastdfs #创建数据存储目录
cd /usr/local/src #切换到安装目录准备下载安装包
  1. 初始化编译环境:
yum install git gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-devel wget vim -y
  1. 编译安装 libfastcommon :
cd libfastcommon/
./make.sh && ./make.sh install #编译安装
  1. 安装FastDFS
cd ../ #返回上一级目录
git clone https://github.com/happyfish100/fastdfs.git --depth 1
cd fastdfs/
./make.sh && ./make.sh install #编译安装
  1. 安装fastdfs-nginx-module
cd ../ #返回上一级目录
cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs
  1. 安装nginx
cd nginx-1.15.4/
#添加fastdfs-nginx-module模块
./configure --add-module=/usr/local/src/fastdfs-nginx-module/src/
make && make install #编译安装

至此编译构建完成,可以提交容器为新的镜像,留存下来。

docker commit -a 'linmengmeng' -m '编译完成,默认配置' 80a87ad6b80e  fastdfs:V1.0.3

接着可再次编写构建脚本,以 fastdfs:V1.0.3 为基础镜像进行构建。

首先编写启动软件的脚本:fastdfs_start.sh

#!/bin/shmkdir -p /home/fastdfsnew_val=$FASTDFS_IPADDR
old="192.168.0.165"new_WEB_PORT=$WEB_PORT
old_WEB_PORT="8888"echo 'FASTDFS_IPADDR=' ${new_val}
echo 'WEB_PORT=' ${new_WEB_PORT}sed -i "s/$old/$new_val/g" /etc/fdfs/client.conf
sed -i "s/$old/$new_val/g" /etc/fdfs/storage.conf
sed -i "s/$old/$new_val/g" /etc/fdfs/mod_fastdfs.confsed -i "s/$old_WEB_PORT/$new_WEB_PORT/g" /usr/local/nginx/conf/nginx.confecho "start trackerd"
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restartecho "start storage"
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restartecho "start nginx"
/usr/local/nginx/sbin/nginx tail -f  /dev/null

这里加入了动态参数:FASTDFS_IPADDRWEB_PORT,并赋予默认值,可接收启动命令中的 -e后面指定的参数值。

新建 Dockerfile : vi Dockerfile

MAINTAINER lmm "1632284989@qq.com"WORKDIR /ADD fastdfs_start.sh /home/fastdfs_start.shRUN chmod u+x /home/fastdfs_start.shEXPOSE 80 8888 23000 22122# 设置环境变量 USERNAME 默认值为 admin,后面可以通过docker run -e USERNAME="XXXXXX"修改,这个环境变量在容器里也可以$USERNAME获取
ENV FASTDFS_IPADDR=192.168.0.165 WEB_PORT=8888CMD ["/home/fastdfs_start.sh"]

构建镜像:docker build -t fastdfs:V1.0.4 ., 此时最终的镜像构建完成。

其中从 fastdfs:V1.0.3fastdfs:V1.0.4 的过程是一个逐渐调试的过程,进入 fastdfs:V1.0.3 的容器里面,手动调试,然后修改 fastdfs_start.sh 脚本的内容。最终才有了正常的 fastdfs:V1.0.4版本镜像。

调试了半天,整的眼都花了。。。。。。。

2022-11-09

如果项目中对文件服务器选型未确定的,可以看下Minio,这玩意作为一个轻量级的文件服务器也是蛮好用的。感兴趣的可以瞅一眼:http://docs.minio.org.cn/docs/master/minio-deployment-quickstart-guide

2023-07-01

上面贴了构建的过程,这里启动的命令:

1. 单机部署

拉取镜像后,单机部署可直接启动:

docker run -d \--restart=always \--privileged=true \--net=host \--name=fastdfs \-e FASTDFS_IPADDR=192.168.0.165 \-e WEB_PORT=8080 \-v /usr/soft/fastdfs:/home/fastdfs \onlyonelmm/fastdfs-arm64:latest

其中参数 IP 为当前机器的IP, 是必须要修改的,这里IP可以是内网IP,仅供局域网范围内使用,如果是生产服务器,则需要使用公网IP。否则在上传文件时,会提示 22122 端口连接超时或者 23000 端口超时。

WEB_PORT参数可要可不要,如果不加此参数, 默认nginx访问端口为 8888,这里在运行时改为8080。其中nginx的80端口为nginx默认使用了,这里并没有屏蔽,如果需要将fastdfs的资源访问端口改为80,则需要在启动容器后,手动进入容器内部修改。修改方式,在最后会贴出来。

容器中的文件统一挂到 /home/fastdfs 下了,这里将此目录挂载到宿主机的 /usr/soft/fastdfs 文件夹下。包含文件和日志。

正常启动后,可以查看容器日志:docker logs 容器ID ,正常如下所示,否则会有错误提示信息:

[root@ecs-603f-0002 ~]# docker logs ce32d48efc0e
FASTDFS_IPADDR= 192.168.0.165
WEB_PORT= 8080
start trackerd
start storage
start nginx
ngx_http_fastdfs_set pid=24
fastdfs start success........

这时,直接在宿主机上访问:curl localhost 正常可以看到nginx的欢迎页。如果后面修改了fastdfs的资源访问端口,则只能拿上传的文件测试预览下载。

2. 测试上传文件

正常启动后,在不借助其他任何工具的情况下,可以进入容器中,测试文件上传。

进入容器内部:docker exec -it ce32d48efc0e bash

新建一个html文件:echo '<h1>Hello World ! FastDfs .</h1>' > index.html

测试上传:/usr/bin/fdfs_test /etc/fdfs/client.conf upload index.html

[root@ecs-603f-0002 /]# /usr/bin/fdfs_test /etc/fdfs/client.conf upload index.html
This is FastDFS client test program v6.07Copyright (C) 2008, Happy Fish / YuQingFastDFS may be copied only under the terms of the GNU General
Public License V3, which may be found in the FastDFS source kit.
Please visit the FastDFS Home Page http://www.fastken.com/
for more detail.[2022-02-28 11:16:25] DEBUG - base_path=/home/fastdfs, connect_timeout=5, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0tracker_query_storage_store_list_without_group: server 1. group_name=, ip_addr=192.168.0.165, port=23000group_name=group1, ip_addr=192.168.0.165, port=23000
storage_upload_by_filename
group_name=group1, remote_filename=M00/00/00/wKgApWIcrwmACh0gAAAAITYrfZM95.html
source ip address: 192.168.0.165
file timestamp=2022-02-28 11:16:25
file size=33
file crc32=908819859
example file url: http://192.168.0.165:8888/group1/M00/00/00/wKgApWIcrwmACh0gAAAAITYrfZM95.html
storage_upload_slave_by_filename
group_name=group1, remote_filename=M00/00/00/wKgApWIcrwmACh0gAAAAITYrfZM95_big.html
source ip address: 192.168.0.165
file timestamp=2022-02-28 11:16:26
file size=33
file crc32=908819859
example file url: http://192.168.0.165:8888/group1/M00/00/00/wKgApWIcrwmACh0gAAAAITYrfZM95_big.html

访问:curl http://192.168.0.165:8888/group1/M00/00/00/wKgApWIcrwmACh0gAAAAITYrfZM95_big.html 正常可以预览上传的html文件内容。

注意:这里有一点小问题,上面上传成功后,提示的地址example file url的端口有点问题,不是docker run 命令里面的端口。但是这个并不影响文件的正常访问,在容器内可能会访问不了这个地址,回到宿主机上面,改下 example file url的端口为上面命令中的WEB_PORT,即可正常访问该文件内容。

如果需要修改fastdfs的访问端口为80端口,需要修改的地方为:

如果感觉vi编辑器修改不太方便,这里可以先将容器中的文件给拷贝出来,下载到本地,修改后,再拷到容器里面去。

vim /etc/fdfs/client.conf 需要修改的内容如下:

http.tracker_server_port = 8888  # http访问文件的端口(默认8888,看情况修改,和nginx中保持一致)

vim /etc/fdfs/storage.conf 需要修改的内容如下:

http.server_port=80 # http访问文件的端口(默认8888,看情况修改,和nginx中保持一致)

vim /etc/fdfs/tracker.conf 需要修改的内容如下:

http.server_port=80 # http访问文件的端口(默认8888,看情况修改,和nginx中保持一致)

vim /usr/local/nginx/conf/nginx.conf 修改监听80端口的server块配置:

server {listen       80;    ## 该端口为storage.conf中的http.server_port相同server_name  localhost;location ~/group[0-9]/ {ngx_fastdfs_module;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}
}

定制化修改

可以进入容器中看到启动的脚本/home/fastdfs_start.sh 这是启动tracker, storage, nginx的脚本,以及动态替换配置文件中的IP和端口。可以基于此脚本自定义修改。fastdfs的配置文件目录为:/etc/fdfs 里面文件为:

client.conf  http.conf  index.html  mime.types  mod_fastdfs.conf  storage.conf  storage_ids.conf  tracker.conf

3. 分布式部署

在多台机器上运行此镜像后,进入容器内部,修改配置文件,支持多个 tracker_server即可。 vim /etc/fdfs/storage.conf

#需要修改的内容如下
tracker_server=192.168.52.2:22122  # 服务器1
tracker_server=192.168.52.3:22122  # 服务器2
tracker_server=192.168.52.4:22122  # 服务器3
http.server_port=8888  # http访问文件的端口(默认8888,看情况修改,和nginx中保持一致)

vim /etc/fdfs/client.conf

#需要修改的内容如下
tracker_server=192.168.52.2:22122  # 服务器1
tracker_server=192.168.52.3:22122  # 服务器2
tracker_server=192.168.52.4:22122  # 服务器3

vim /etc/fdfs/mod_fastdfs.conf

#需要修改的内容如下
tracker_server=192.168.52.2:22122  # 服务器1
tracker_server=192.168.52.3:22122  # 服务器2
tracker_server=192.168.52.4:22122  # 服务器3
url_have_group_name=true

如果进入容器手动修改了配置文件,可以尝试直接在容器内重启fastdfs,重启的命令是: restart trackerd

/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart

restart storage

/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

检测集群

/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
# 这里会显示会有几台服务器 有3台就会 显示 Storage 1-Storage 3的详细信息

说明:
tracker_server #有几台服务器写几个
group_name #地址的名称的命名
bind_addr #服务器ip绑定
store_path_count #store_path(数字)有几个写几个
store_path(数字) #设置几个储存地址写几个 从0开始

问题:
如果上传成功 但是nginx报错404 先检查mod_fastdfs.conf文件中的store_path0是否一致
如果nginx无法访问 先检查防火墙 和 mod_fastdfs.conf文件tracker_server是否一致,这个坑了我好久。。。。。。
如果trackerstorage,任意一个没有正常启动,则nginx就无法访问,可以从nginx的启动日志里面看到,nginx启动会检测trackerstorage。所以留个nginx的欢迎页的端口还是有点用处的。
如果检测集群发现有错误的集群信息,则看下是否之前启动失败过,并且再次运行docker run 时,是否删除挂载的宿主机目录,否则集群配置可能读取到之前启动失败配置的信息。

【FastDfs】Docker自定义构建ARM架构的FastDfs镜像相关推荐

  1. 【Docker系列】 Docker 多架构支持 和 Docker Buildx 构建多架构

    Docker 的多架构支持 docker自适应了CPU的架构 会自动选择架构的版本 镜像 多架构的标签,会自动选择适合的标签. 使用 buildx 构建多架构镜像 Windows和Mac的桌面版Doc ...

  2. docker buildx 构建arm64架构镜像

    文章目录 buildx测试 前提条件 安装 构建镜像 推送http私库问题 docker容器里运行docker buildx 在x86架构下如何打包arm64架构的镜像,docker buildx 是 ...

  3. 甲骨文云上使用arm架构实例和对象存储搭建Harbor

    今天尝试使用甲骨文云的arm实例(4ocpus+24Gb memory)搭建Harbor,并且存储使用甲骨文云兼容S3协议的对象存储. 事情准备 准备好arm架构的实例,防火墙开放80和443端口,设 ...

  4. ARM架构Docker镜像构建-基础知识

    介绍ARM版本的Docker镜像的构建,包括ARM机器上Docker的安装,在ARM机器上构建镜像,及在amd64机器上使用buildx交叉构建arm版本镜像. 前言 现在很多地方都对服务的国产化适配 ...

  5. Java高级架构之FastDFS分布式文件集群

    FastDFS简介 FastDFS是一款开源的轻量级分布式文件系统,使用C实现,支持Linux.BSD等unix-like操作系统.值得注意的是,fastdfs并不是通用的文件系统,只能通过专用的AP ...

  6. arm架构linux运行docker失败,armdocker:在x86上模拟运行arm容器

    一.背景 docker 可以在 arm 平台上运行,验证 docker 镜像最直接的方式是在 arm 平台上,但有时候需要在 PC 平台上验证 arm 平台的镜像.本文对此进行介绍. 二.x86依赖环 ...

  7. 巧用 Docker Buildx 构建多种系统架构镜像

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! Docker Buildx 是一个 Docker CLI 插件,其扩展了 Docker 命令,支持 Moby Bu ...

  8. Nginx+Lua+FastDFS+Docker实现图片缩略图

    Nginx+Lua+FastDFS实现图片缩略图 1.Docker安装 2.Docker安装FastDFS 2.1 搜索镜像 2.2 拉取镜像 2.3 查询镜像 2.4 容器安装 2.5 修改配置 3 ...

  9. 华为云麒麟arm架构docker启动redis报错:<jemalloc>: Unsupported system page size

    在 ARM 架构的华为云服务器上,运行 Redis 容器时出现 "jemalloc: Unsupported system page size" 错误,这通常是因为服务器的页面大小 ...

最新文章

  1. Scriptaculous创始人作序推荐——《Ajax实战:Prototype与Scriptaculous篇》
  2. NeurIPS2019 入选论文数据深度剖析!!!
  3. python小游戏编程实例-Python实现的弹球小游戏示例
  4. 【DBMS 数据库管理系统】OLAP 核心技术 : 数据方体 ( 数据方体 | 数据方体格结构 | 数据单元 )
  5. C# new()约束简单介绍
  6. 【转】各种媒体数据以 base64 编码方式直接嵌入网页中的写法
  7. 1.Office 365系列(-)
  8. 简述相关与回归分析的关系_分类数据与分类数据的相关关系分析
  9. prim算法 最小生成树
  10. .NET处理异常--zt
  11. spark学习 小汇集
  12. iPhone的屏幕尺寸和分辨率
  13. Class 类文件结构解析
  14. FPGA实现DDRIP核配置(Memory Interface Solutions)
  15. UNCTF 2022 部分WP
  16. gdb、ida调试笔记
  17. 读stormzhang的笔记
  18. CNN卷积神经网络案例程序源代码合集matlab/Python等
  19. 1.7 编程基础之字符串 15 整理药名 python
  20. 燃气热水器的主要部件及维修常识

热门文章

  1. 上网卡,流量卡的使用
  2. 【android】五种控制Android应用的权限的方法
  3. NewCoder 剖分
  4. Tomcat服务器集群搭建
  5. Spring Boot入门(09):使用MyBatis的XML配置方式访问MySQL实现增删改查 | 超级详细,建议收藏
  6. thymeleaf格式化日期传参写法隐藏域
  7. 突发!因为这个原因,ChatGPT又双叒大面积封号了...
  8. 数据采集系统的主要特点
  9. python django前端框架_Python的Web应用框架–Django
  10. cass参考手册_cass9.0 参 考 手 册.doc