docker使用基础镜像创建自己的镜像,并利用springboot-web项目jar包+Dockerfile文件创建项目容器。

业务场景:

  • 项目中实现有一个上传图片文件的接口,后台将接收到的图片格式合法的文件上传到学校的服务器,接口的代码中写的文件上传路径为想要实际存放到学校服务器的路径:/home/gmall。图片上传成功后,将图片存放的地址存到数据库中。

遇到学校服务器的坑

  • 部署后的项目可能图片无法访问,端口被关闭
  • 学校的服务器做了一层防火墙
  • 容器间的访问做了IP限制,阻止如Delete等敏感的请求

部署项目时遇到的问题

  1. 分别创建运行项目、数据库的容器,简称v1、v2,均使用docker默认的网络模式——bridge,创建容器时没有指定,为了可以通过外网访问容器,做了端口映射,此时v1和v2在同一个局域网中,但是访问图片上传接口的时候,不能访问数据库,没有实现容器互联(不知道是不是学校服务器的特殊原因)。使用curl访问v2的ip地址(可以使用命令查看ip:docker network inspect 容器名),提示connect refused。

    解决办法:创建一个新网络,取名:imagedataset,创建两个容器,分别运行项目数据库、springboot后台项目代码,可以实现容器互联。

docker network create imagedataset

docker run -d --name imagedataset -p 9090:8100 --network datasetbuilder img:dataset

docker run --name image_mysql --privileged=true -p 8099:3306 --network datasetbuilder -v /home/data/mysql/datadir:/var/lib/mysql -v /home/data/mysql/conf.d:/etc/mysql/conf.d -e  MYSQL_ROOT_PASSWORD=123456 -d  mysql:latest
  1. 上述过程,又产生新的问题:生产环境下,数据库url连接错误,不能使用外网访问,但是开发环境下可以使用外网访问。

    开发环境下数据库连接配置:
    -
    生产环境下数据库连接配置:
    在这里插入图片描述

  2. 问题描述:以上实现可以访问数据库,访问图片上传的接口,但是不能实现图片文件上传到服务器,查看服务器/home/imageFile文件夹,没有我们上传的图片。

    问题分析:按照创建mysql容器的思路,联想到项目运行在容器中,图片不能上传的原因无非就是找不到存放图片的路径,那么很有可能就是需要将宿主机目录挂载到容器目录(相当于做了个映射)。

-v /宿主机绝对路径:/容器目录

原本创建容器的命令如下:

docker run -d --name imagedataset -p 9090:8100 --network datasetbuilder img:dataset

错误修改方式如下:

docker run -d --name imagedataset -p 9090:8100 --network datasetbuilder img:dataset -v /home/imageFile:/home/imageFile

执行以上创建容器命令,服务器报错信息如下:

/usr/bin/docker-current: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "exec: \"-v\": executable file not found in $PATH".

根据提示,可以判断创建创建容器的命令中“-v”附近错误,百度了很多博主的文章,报错问题大同小异,但是都没有解决我的问题,如在命令中添加过“/bin/bash”等。我猜测是-v参数位置不对,尝试以下修改:

docker run -d  -v /home/imageFile:/home/imageFile --name imagedataset -p 9090:8100 --network datasetbuilder img:dataset

成功创建容器。
经过测试,图片文件到服务器成功。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐