【FastDfs】Docker自定义构建ARM架构的FastDfs镜像
由于服务器环境为ARM架构,在部署fastdfs时,发现网上的镜像几乎都是X86_64的,不同架构的镜像还不能通用,这个就有点烦了。。。。。由于之前没有从头编译制作过镜像,步步都是坑,在折腾了几天之后,终于倒腾出来了,这里记录下构建过程。可以举一反三,定制自己的镜像。这里贴一下官方的原贴:happyfish100/fastdfs,目前的源码,按照这个部署还是没问题的。1. 环境准备1.1 下载源码
【FastDfs】Docker自定义构建ARM架构的FastDfs镜像
由于服务器环境为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:7
MAINTAINER lmm "1632284989@qq.com"
WORKDIR /
ADD libfastcommon /usr/local/src/libfastcommon
ADD fastdfs /usr/local/src/fastdfs
ADD fastdfs-nginx-module /usr/local/src/fastdfs-nginx-module
ADD 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 #切换到安装目录准备下载安装包
- 初始化编译环境:
yum install git gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-devel wget vim -y
- 编译安装
libfastcommon
:
cd libfastcommon/
./make.sh && ./make.sh install #编译安装
- 安装FastDFS
cd ../ #返回上一级目录
git clone https://github.com/happyfish100/fastdfs.git --depth 1
cd fastdfs/
./make.sh && ./make.sh install #编译安装
- 安装fastdfs-nginx-module
cd ../ #返回上一级目录
cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs
- 安装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/sh
mkdir -p /home/fastdfs
new_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.conf
sed -i "s/$old_WEB_PORT/$new_WEB_PORT/g" /usr/local/nginx/conf/nginx.conf
echo "start trackerd"
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
echo "start storage"
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
echo "start nginx"
/usr/local/nginx/sbin/nginx
tail -f /dev/null
这里加入了动态参数:FASTDFS_IPADDR
和 WEB_PORT
,并赋予默认值,可接收启动命令中的 -e后面指定的参数值。
新建 Dockerfile
: vi Dockerfile
MAINTAINER lmm "1632284989@qq.com"
WORKDIR /
ADD fastdfs_start.sh /home/fastdfs_start.sh
RUN chmod u+x /home/fastdfs_start.sh
EXPOSE 80 8888 23000 22122
# 设置环境变量 USERNAME 默认值为 admin,后面可以通过docker run -e USERNAME="XXXXXX"修改,这个环境变量在容器里也可以$USERNAME获取
ENV FASTDFS_IPADDR=192.168.0.165 WEB_PORT=8888
CMD ["/home/fastdfs_start.sh"]
构建镜像:docker build -t fastdfs:V1.0.4 .
, 此时最终的镜像构建完成。
其中从 fastdfs:V1.0.3
到 fastdfs: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.07
Copyright (C) 2008, Happy Fish / YuQing
FastDFS 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: 0
tracker_query_storage_store_list_without_group:
server 1. group_name=, ip_addr=192.168.0.165, port=23000
group_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是否一致,这个坑了我好久。。。。。。
如果tracker
,storage
,任意一个没有正常启动,则nginx就无法访问,可以从nginx的启动日志里面看到,nginx启动会检测tracker
,storage
。所以留个nginx的欢迎页的端口还是有点用处的。
如果检测集群发现有错误的集群信息,则看下是否之前启动失败过,并且再次运行docker run 时,是否删除挂载的宿主机目录,否则集群配置可能读取到之前启动失败配置的信息。
更多推荐
所有评论(0)