Docker安装MinIO遇到的问题汇总——持续更新中

Docker安装MinIO遇到的坑

前言

本文章记录作者使用Docker安装MinIO过程中遇到的所有问题,将持续更新,如果你在使用Docker安装MinIO过程中遇到了一些问题,但是本文没有记载,你可以直接在本文评论区贴图、或打字描述,这样大家都能看到,可以给你一些建议,从而不断完善,让后来者少走更多的弯路,作者这一路也受到很多这样的博主的无形之中的帮助,所以作者也想成为这样能够无形之中帮助他人的人,这也算是一种善吧,“勿以善小而不为,勿以恶小而为之”,这也是我一直坚持记录Bug的出发点之一,一起加油吧,初学者

PS:由于笔者也是一个初学者,所以文中可能对于一些问题原因的解释不到位,如果您知道,还请及时告知在下,同时如果对于一些问题,你有更好的解决方案,也请你能够分享给笔者,万分感谢

问题1:执行docker run报错Error response from daemon

  • 问题:执行docker run报错Error response from daemon

    <span style="color:#000000"><span style="background-color:#282c34"><code>docker: 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)).
    </code></span></span>

    image-20231019155714037

  • 问题原因:没有开启防火墙

    我执行docker run进行端口映射时,需要使用防火墙,但是由于我是关闭了防火墙的原因,所以导致无法进行映射,从而出现报错

  • 问题解决:开启防火墙,重新启动MinIO容器

    <span style="color:#000000"><span style="background-color:#282c34"><code class="language-shell"><span style="color:#5c6370"># 查看防火墙状态</span>
    systemctl status firewalld.service 
    <span style="color:#5c6370"># 开启防火墙</span>
    systemctl start firewalld.service 
    <span style="color:#5c6370"># 关闭防火墙</span>
    systemctl stop firewalld.service 
    </code></span></span>

问题2:启动MinIO容器浏览器无法访问

  • 问题:启动MinIO容器浏览器无法访问

    image-20231019160116377

  • 问题原因:存在两个问题

    • 问题1:使用了过期的配置

      自从RELEASE.2021-02-10T23-14-37Z 版本开始引入了引入了鉴权功能,并且在首次启动时需要设置根用户和密码,MinIO就不在使用 MINIO_ACCESS_KEY 和 MINIO_SECRET_KEY 进行访问鉴权,而是直接使用MINIO_ROOT_USERMINIO_ROOT_PASSWORD

    • 问题2:没有为MinIO配置静态端口

      这个问题涉及到了Docker和MinIO的运行机制,当你使用Docker启动MinIO服务时,默认情况下,它会在一个动态的端口上监听,这个端口是由Docker守护程序选择的。这种动态监听的机制可以使得Docker容器能够更好地与其他容器进行通信,因为它们都在同一个Docker网络上。

      image-20231019160340588

  • 问题解决

    • 对于问题1:要么降低MinIO的版本,要么就将 MINIO_ACCESS_KEY 和 MINIO_SECRET_KEY 配置项改为MINIO_ROOT_USERMINIO_ROOT_PASSWORD

    • 对于问题2:使用下面配置项使得端口静态化

      <span style="color:#000000"><span style="background-color:#282c34"><code class="language-shell">--console-address <span style="color:#669900">":9000"</span> <span style="color:#ee9900">--address</span> <span style="color:#669900">":9001"</span>
      </code></span></span>
      • 1

问题3:上传文件报错InvalidResponseException

  • 问题:上传文件报错S3 API Request made to Console port. S3 Requests should be sent to API port.

    image-20231021202651845

    <span style="color:#000000"><span style="background-color:#282c34"><code class="language-shell">io.minio.errors.InvalidResponseException: Non-XML response from server. Response code: <span style="color:#98c379">403</span>, Content-Type: text/xml<span style="color:#999999">;</span> <span style="color:#ee9900">charset</span><span style="color:#669900">=</span>utf-8, body: <span style="color:#669900"><</span>?xml <span style="color:#ee9900">version</span><span style="color:#669900">=</span><span style="color:#669900">"1.0"</span> <span style="color:#ee9900">encoding</span><span style="color:#669900">=</span><span style="color:#669900">"UTF-8"</span>?<span style="color:#669900">></span>
    <span style="color:#669900"><</span>Error<span style="color:#669900">></span>
      <span style="color:#669900"><</span>Code<span style="color:#669900">></span>AccessDenied<span style="color:#669900"><</span>/Code<span style="color:#669900">></span>
      <span style="color:#669900"><</span>Message<span style="color:#669900">></span>S3 API Request made to Console port. S3 Requests should be sent to API port.<span style="color:#669900"><</span>/Message<span style="color:#669900">></span>
      <span style="color:#669900"><</span>RequestId<span style="color:#669900">></span><span style="color:#669900"><span style="color:#ee9900">0</span><</span>/RequestId<span style="color:#669900">></span>
    <span style="color:#669900"><</span>/Error<span style="color:#669900">></span>
    </code></span></span>
  • 问题原有:用错了MinIO的端口号

    前面我们通过--console-address ":9000" --address ":9001"配置了MinIO的网页控制台端口号是9000,而MinIO服务的端口是9090,我在项目中使用了控制台端口号

  • 问题解决:将端口号改为MinIO的服务端口号9001

问题4:上传文件报错Connection refused

  • 问题:上传文件报错Connection refused

    image-20231021204633332

  • 问题原因:没有配置MinIO端口映射。

    之前我只配置了MinIO控制台的端口映射,但是没有为MinIO服务配置端口映射,导致Docker容器中的端口没有对虚拟机开放,从而导致连接不上,这一点坑了我好久┭┮﹏┭┮(如果这一点大家也踩坑了,就给我点个赞吧,安慰一下我)

  • 问题解决:配置MinIO服务端口映射

    <span style="color:#000000"><span style="background-color:#282c34"><code class="language-shell"><span style="color:#ee9900">-p</span> <span style="color:#98c379">9001</span>:9001
    </code></span></span>

最终的启动指令

<span style="color:#000000"><span style="background-color:#282c34"><code class="language-shell"><span style="color:#61aeee">docker</span> run <span style="color:#999999">\</span>
<span style="color:#ee9900">-p</span> <span style="color:#98c379">9000</span>:9000 <span style="color:#999999">\</span>
<span style="color:#ee9900">-p</span> <span style="color:#98c379">9001</span>:9001 <span style="color:#999999">\</span>
<span style="color:#ee9900">--name</span> minio <span style="color:#999999">\</span>
<span style="color:#ee9900">-d</span> <span style="color:#999999">\</span>
<span style="color:#ee9900">--restart</span><span style="color:#669900">=</span>always <span style="color:#999999">\</span>
<span style="color:#ee9900">-e</span> <span style="color:#669900">"MINIO_ROOT_USER=root"</span> <span style="color:#999999">\</span>
<span style="color:#ee9900">-e</span> <span style="color:#669900">"MINIO_ROOT_PASSWORD=32345678"</span> <span style="color:#999999">\</span>
<span style="color:#ee9900">-v</span> /usr/local/soft/minio/data:/data <span style="color:#999999">\</span>
<span style="color:#ee9900">-v</span> /usr/local/soft/minio/config:/root/.minio <span style="color:#999999">\</span>
minio/minio <span style="color:#999999">\</span>
server <span style="color:#999999">\</span>
/data <span style="color:#999999">\</span>
--console-address <span style="color:#669900">":9000"</span> <span style="color:#999999">\</span>
<span style="color:#ee9900">--address</span> <span style="color:#669900">":9001"</span>
</code></span></span>
  • 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守护程序绑定到指定的端口上

成功启动并访问

image-20231019161516688

总结前四个问题,本质都是启动指令的问题

问题5:上传文件报错Unsupported OkHttp library found. Must use okhttp >= 4.8.1

注意:这几个问题不是同一个项目中遇到的,前面4个问题是在SpringBoot整合MinIO遇到的,后面的问题是平常开发中遇到的

  • 问题:上传文件报错Unsupported OkHttp library found. Must use okhttp >= 4.8.1

    image-20231022113117214

  • 问题原因:SpringBoot版本问题(本质是OkHttp和MinIO版本不兼容)

    MinIO依赖中有使用到OkHttp依赖,因为客户端与服务端发送文件都是需要发送Http请求的,这个OkHttp依赖的版本会受到SpringBoot版本的影响,SpringBoot2.3版本使用的是OkHttp3,SpringBoot2.7版本使用的是OkHttp4,而我当前项目中使用的MinIO是8.5.2,这个版本最低要求是是4.x,而我使用的SpringBoot2.3,自动就引入了OkHttp3.x,导致不兼容

    image-20231022113230138

    一下是常见的MinIO版本与OkHttp版本的对照情况:

    MinIO 版本最低 OkHttp 版本要求兼容 OkHttp 版本
    8.x.x4.8.14.x.x, 5.x.x
    7.x.x3.14.03.x.x
    6.x.x3.12.03.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

      <span style="color:#000000"><span style="background-color:#282c34"><code class="language-xml">        <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>dependency</span><span style="color:#999999">></span></span>
                  <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>groupId</span><span style="color:#999999">></span></span>io.minio<span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"></</span>groupId</span><span style="color:#999999">></span></span>
                  <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>artifactId</span><span style="color:#999999">></span></span>minio<span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"></</span>artifactId</span><span style="color:#999999">></span></span>
                  <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>version</span><span style="color:#999999">></span></span>8.5.2<span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"></</span>version</span><span style="color:#999999">></span></span>
                  <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>exclusions</span><span style="color:#999999">></span></span>
                      <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>exclusion</span><span style="color:#999999">></span></span>
                          <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>artifactId</span><span style="color:#999999">></span></span>okhttp<span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"></</span>artifactId</span><span style="color:#999999">></span></span>
                          <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>groupId</span><span style="color:#999999">></span></span>com.squareup.okhttp3<span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"></</span>groupId</span><span style="color:#999999">></span></span>
                      <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"></</span>exclusion</span><span style="color:#999999">></span></span>
                  <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"></</span>exclusions</span><span style="color:#999999">></span></span>
              <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"></</span>dependency</span><span style="color:#999999">></span></span>
              <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>dependency</span><span style="color:#999999">></span></span>
                  <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>groupId</span><span style="color:#999999">></span></span>com.squareup.okhttp3<span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"></</span>groupId</span><span style="color:#999999">></span></span>
                  <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>artifactId</span><span style="color:#999999">></span></span>okhttp<span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"></</span>artifactId</span><span style="color:#999999">></span></span>
                  <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"><</span>version</span><span style="color:#999999">></span></span>4.9.3<span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"></</span>version</span><span style="color:#999999">></span></span>
              <span style="color:#e06c75"><span style="color:#e06c75"><span style="color:#999999"></</span>dependency</span><span style="color:#999999">></span></span>
      </code></span></span>

      PS:还有一个注意点,如果我这个minio是一个starter,那么在starter中排除OkHttp版本再引入是无效的,需要到引用starter的项目中去排除OkHttp版本,然后再引用对应的OkHttp版本

参考文章

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker是一个开源的应用容器引擎,它使得开发者可以打包他们的应用以及依赖包到一个可移植的容器,然后发布到任何流行的Linux机器或Windows机器上,也可以实现虚拟化。MinIO 是一个开源的对象存储服务器,常用于构建云存储服务。 要在 Docker 安装 MinIO,你需要按照以下步骤操作: 1. **安装 Docker**(如果你还没有安装): - 对于 Ubuntu/Debian: `sudo apt-get update && sudo apt-get install docker.io` - 对于 CentOS/RHEL: `sudo yum install docker-ce` - 对于 macOS (通过 Docker Desktop): [官方下载](https://docs.docker.com/docker-for-mac/install/) - 对于 Windows: [官方下载](https://docs.docker.com/docker-for-windows/install/) 2. **拉取 MinIO 镜像**: 使用 Docker 命令行,运行: ``` docker pull minio/minio ``` 3. **运行 MinIO 容器**: 可以选择以守护进程模式运行 (`-d` 参数表示 detached, 后台运行),例如: ``` docker run -p 9000:9000 -v minio-data:/data -e MINIO_ACCESS_KEY=your-access-key -e MINIO_SECRET_KEY=your-secret-key minio/minio server /data ``` 这里 `-p 9000:9000` 将容器内的 9000 端口映射到主机的 9000 端口,`-v` 挂载宿主机目录(如 `minio-data`)为容器数据卷,`-e` 设置访问密钥和秘密密钥。 4. **配置和验证**: 访问 `http://localhost:9000`(如果在本地运行),使用你刚才设置的 `MINIO_ACCESS_KEY` 和 `MINIO_SECRET_KEY` 登录,检查是否成功安装并能正常工作。 **相关问题--:** 1. Docker镜像的作用是什么? 2. 除了运行,还可以如何管理和控制 MinIO 容器? 3. 如何在 Docker Compose 文件定义并运行 MinIO 服务?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值