文章目录
- Docker安装MinIO遇到的坑
- 前言
- 问题1:执行`docker run`报错Error response from daemon
- 问题2:启动MinIO容器浏览器无法访问
- 问题3:上传文件报错`InvalidResponseException`
- 问题4:上传文件报错`Connection refused`
- 最终的启动指令
- 问题5:上传文件报错`Unsupported OkHttp library found. Must use okhttp >= 4.8.1`
Docker安装MinIO遇到的坑
前言
本文章记录作者使用Docker安装MinIO过程中遇到的所有问题,将持续更新,如果你在使用Docker安装MinIO过程中遇到了一些问题,但是本文没有记载,你可以直接在本文评论区贴图、或打字描述,这样大家都能看到,可以给你一些建议,从而不断完善,让后来者少走更多的弯路,作者这一路也受到很多这样的博主的无形之中的帮助,所以作者也想成为这样能够无形之中帮助他人的人,这也算是一种善吧,“勿以善小而不为,勿以恶小而为之”,这也是我一直坚持记录Bug的出发点之一,一起加油吧,初学者
PS:由于笔者也是一个初学者,所以文中可能对于一些问题原因的解释不到位,如果您知道,还请及时告知在下,同时如果对于一些问题,你有更好的解决方案,也请你能够分享给笔者,万分感谢
问题1:执行docker run
报错Error response from daemon
-
问题:执行
docker run
报错Error response from daemondocker: Error response from daemon: driver failed programming external connectivity on endpoint minio (b78ded203d04164bc5d4a2e9dae2a4cdda9f4377950d38e9d0b46d033ca4608c): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 9000 -j DNAT --to-destination 172.17.0.3:9000 ! -i docker0: iptables: No chain/target/match by that name. (exit status 1)).
-
问题原因:没有开启防火墙。
我执行
docker run
进行端口映射时,需要使用防火墙,但是由于我是关闭了防火墙的原因,所以导致无法进行映射,从而出现报错 -
问题解决:开启防火墙,重新启动MinIO容器
# 查看防火墙状态 systemctl status firewalld.service # 开启防火墙 systemctl start firewalld.service # 关闭防火墙 systemctl stop firewalld.service
问题2:启动MinIO容器浏览器无法访问
-
问题:启动MinIO容器浏览器无法访问
-
问题原因:存在两个问题
-
问题1:使用了过期的配置
自从
RELEASE.2021-02-10T23-14-37Z
版本开始引入了引入了鉴权功能,并且在首次启动时需要设置根用户和密码,MinIO就不在使用MINIO_ACCESS_KEY
和MINIO_SECRET_KEY
进行访问鉴权,而是直接使用MINIO_ROOT_USER
和MINIO_ROOT_PASSWORD
-
问题2:没有为MinIO配置静态端口
这个问题涉及到了Docker和MinIO的运行机制,当你使用Docker启动MinIO服务时,默认情况下,它会在一个动态的端口上监听,这个端口是由Docker守护程序选择的。这种动态监听的机制可以使得Docker容器能够更好地与其他容器进行通信,因为它们都在同一个Docker网络上。
-
-
问题解决:
-
对于问题1:要么降低MinIO的版本,要么就将
MINIO_ACCESS_KEY
和MINIO_SECRET_KEY
配置项改为MINIO_ROOT_USER
和MINIO_ROOT_PASSWORD
-
对于问题2:使用下面配置项使得端口静态化
--console-address ":9000" --address ":9001"
-
问题3:上传文件报错InvalidResponseException
-
问题:上传文件报错
S3 API Request made to Console port. S3 Requests should be sent to API port.
io.minio.errors.InvalidResponseException: Non-XML response from server. Response code: 403, Content-Type: text/xml; charset=utf-8, body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>S3 API Request made to Console port. S3 Requests should be sent to API port.</Message> <RequestId>0</RequestId> </Error>
-
问题原有:用错了MinIO的端口号
前面我们通过
--console-address ":9000" --address ":9001"
配置了MinIO的网页控制台端口号是9000,而MinIO服务的端口是9090,我在项目中使用了控制台端口号 -
问题解决:将端口号改为MinIO的服务端口号9001
问题4:上传文件报错Connection refused
-
问题:上传文件报错
Connection refused
-
问题原因:没有配置MinIO端口映射。
之前我只配置了MinIO控制台的端口映射,但是没有为MinIO服务配置端口映射,导致Docker容器中的端口没有对虚拟机开放,从而导致连接不上,这一点坑了我好久┭┮﹏┭┮(如果这一点大家也踩坑了,就给我点个赞吧,安慰一下我)
-
问题解决:配置MinIO服务端口映射
-p 9001:9001
最终的启动指令
docker run \
-p 9000:9000 \
-p 9001:9001 \
--name minio \
-d \
--restart=always \
-e "MINIO_ROOT_USER=root" \
-e "MINIO_ROOT_PASSWORD=32345678" \
-v /usr/local/soft/minio/data:/data \
-v /usr/local/soft/minio/config:/root/.minio \
minio/minio \
server \
/data \
--console-address ":9000" \
--address ":9001"
-
docker run
:命令用于创建和运行Docker容器。 -
-p
:选项指定了端口映射-p 9000:9000
:将主机的9000端口映射到容器内部的9000端口,以便通过主机的9000端口访问MinIO控制台。-p 9001:9001
:将主机的9001端口映射到容器内部的9001端口,以便通过注解的9001端口访问MinIO服务
-
--name minio
:选项为容器指定了一个名称,即"minio",这样可以方便地引用该容器。 -
-d
:选项将容器设置为“后台模式”,使得容器在后台运行。 -
--restart=always
:选项指定了容器的重启策略,即容器在退出时总是自动重新启动。 -
-e "MINIO_ROOT_USER=root"
:选项通过环境变量设置MinIO的访问密钥(Access Key)为"root"。 -
-e "MINIO_ROOT_PASSWORD=32345678"
:选项通过环境变量设置MinIO的密钥(Secret Key)为"32345678"。 -
-v /usr/local/soft/minio/data:/data
:选项指定了数据卷的挂载,将主机的"/home/data"目录挂载到容器的"/data"目录,用于持久化存储MinIO的数据。 -
-v /usr/local/soft/minio/config:/root/.minio
:选项指定了配置卷的挂载,将主机的"/home/config"目录挂载到容器的"/root/.minio"目录,用于持久化存储MinIO的配置文件。 -
minio/minio
:指定使用的镜像名称为minio/minio,即MinIO官方提供的Docker镜像。 -
server /data
:参数指定了MinIO服务器的配置。"/data"是MinIO服务器将用于存储数据的目录路径。 -
--console-address ":9000"
:指定MinIO控制台端口,确保任何尝试连接到这个端口的客户端或应用程序都可以使用这个端口 -
--address ":9001"
:指定MinIO服务端口,将Docker守护程序绑定到指定的端口上
成功启动并访问:
总结:前四个问题,本质都是启动指令的问题
问题5:上传文件报错Unsupported OkHttp library found. Must use okhttp >= 4.8.1
注意:这几个问题不是同一个项目中遇到的,前面4个问题是在SpringBoot整合MinIO遇到的,后面的问题是平常开发中遇到的
-
问题:上传文件报错
Unsupported OkHttp library found. Must use okhttp >= 4.8.1
-
问题原因:SpringBoot版本问题(本质是OkHttp和MinIO版本不兼容)
MinIO依赖中有使用到OkHttp依赖,因为客户端与服务端发送文件都是需要发送Http请求的,这个OkHttp依赖的版本会受到SpringBoot版本的影响,SpringBoot2.3版本使用的是OkHttp3,SpringBoot2.7版本使用的是OkHttp4,而我当前项目中使用的MinIO是8.5.2,这个版本最低要求是是4.x,而我使用的SpringBoot2.3,自动就引入了OkHttp3.x,导致不兼容
一下是常见的MinIO版本与OkHttp版本的对照情况:
MinIO 版本 最低 OkHttp 版本要求 兼容 OkHttp 版本 8.x.x 4.8.1 4.x.x, 5.x.x 7.x.x 3.14.0 3.x.x 6.x.x 3.12.0 3.x.x -
解决方法:
-
方案一:提高SpringBoot版本,将SpringBoot版本提高至2.4,2.4版本的SpringBoot版本默认改用了OkHttp4,刚好和 MinIO8.x兼容(不推荐,因为项目更换SpringBoot版本成本比较高)
-
方案二:降低MinIO版本,将MinIO的版本降低至7.x,这个版本的MinIO兼容OkHttp3.x(不太推荐)
-
方案三:直接手动引入OkHttp4.x,覆盖掉SpringBoot中的OkHttp3.x
<dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.5.2</version> <exclusions> <exclusion> <artifactId>okhttp</artifactId> <groupId>com.squareup.okhttp3</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.9.3</version> </dependency>
PS:还有一个注意点,如果我这个minio是一个starter,那么在starter中排除OkHttp版本再引入是无效的,需要到引用starter的项目中去排除OkHttp版本,然后再引用对应的OkHttp版本
-
参考文章:
- docker搭建最新minio访问不了页面解决及注意事项-CSDN博客
- Java MINIO使用踩坑&解决_-CSDN博客
- Minio Unsupported OkHttp library found. Must use okhttp >= 4.8.1_嘟嘟Listing的博客-CSDN博客