docker run 目录挂载失败

一、发现问题

    在使用docker java镜像时发现使用docker run  命令启动spring boot项目没有反应命令如下:

    因为对docker不太熟悉,但是公司又需要部署,所以我在自己的环境上对命令试了一下


docker run -d --rm -p 7061:7061 -v /legrand/apps/legrand-cloud:/opt --name register-server --net=host java:8 java -jar /opt/register-server-1.0.0.jar

 查看所有容器发现没有刚刚启动的呢个

[root@localhost /]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost /]# 

然后分析了下上面呢段命令,去了后台运行 -d

[root@localhost /]# sudo docker run  --rm -e TZ="Asia/Shanghai" -p 7061:7061 -v /legrand/apps/legrand-cloud:/opt --name register-server --net=host java:8 java -jar /opt/register-server-1.0.0.jar
Error: Unable to access jarfile /opt/register-server-1.0.0.jar

 运行后发现报 Error: Unable to access jarfile /opt/register-server-1.0.0.jar

 然后就解了下这边的目录挂载 也就是后半段  将/legrand/apps/legrand-cloud 挂载到 /opt目录下

/legrand/apps/legrand-cloud:/opt

 二、解决方式

我在这里说了三种解决方式,个人比较建议前两种

 

第一种:猜测是不是权限出现了问题,就了解了下目录挂载权限问题,并且找到了对应的命令

 #默认是false
--privileged=true

 

 

然后修改了下启动命令发现就可以了

[root@localhost /]# docker run  --rm -e TZ="Asia/Shanghai" -p 7061:7061 -v /legrand/apps/legrand-cloud:/opt --name register-server --privileged=true --net=host java:8 java -jar /opt/register-server-1.0.0.jar

.........

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::       (v1.5.19.RELEASE)
.........

 然后再加上后台运行

[root@localhost /]# docker run -d --rm -e TZ="Asia/Shanghai" -p 7061:7061 -v /legrand/apps/legrand-cloud:/opt --name register-server --privileged=true --net=host java:8 java -jar /opt/register-server-1.0.0.jar

再使用docker ps 命令查看

[root@localhost /]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
ea3d2837e030        java:8              "java -jar /opt/re..."   29 seconds ago      Up 29 seconds                           register-server

停止刚才启动的容器 

[root@localhost /]# docker stop register-server

 

 

第二种:后来又在文档中发现了文件挂载时关于selinux的解决方式

需要在挂载的参数后面再追加一个参数 

 -v 本地目录:挂载目录:z

docker run -d --rm -p 7061:7061 -v /legrand/apps/legrand-cloud:/opt:z --name register-server --net=host java:8 java -jar xxxxxxxxx

 

 

 搞定

[root@localhost /]# docker run -d --rm -p 7061:7061 -v /legrand/apps/legrand-cloud:/opt:z --name register-server --net=host java:8 java -jar /opt/register-server-1.0.0.jar
6d465bea0b745778d40ea8cdd76f4f205e390fb64db5bc406413da999607a556
[root@localhost /]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
6d465bea0b74        java:8              "java -jar /opt/re..."   4 seconds ago       Up 3 seconds                            register-server
[root@localhost /]#

 

第三种: 关闭selinux 模块

经过上面一系列操作后导致问题的原因也就付出水面了,然后我关闭了CentOS内置的selinux 策略,使用本文开头第一个命令,发现可以正常启动,最后确定就是 selinux 搞得鬼导致docker 运行时权限不足无法挂载到指定目录。

分为三步:

1.降低selinux  安全级别:setenforce 0

2.执行运行命令

3.恢复selinux到最高安全级别:setenforce 1

[root@localhost /]# setenforce 0
[root@localhost /]# docker run -d --rm -p 7061:7061 -v /legrand/apps/legrand-cloud:/opt --name register-server --net=host java:8 java -jar /opt/register-server-1.0.0.jar
d0f0a4bb239ce0768f00585e2e8f2856ba3e831aa39e3c36e198a849ab872971
[root@localhost /]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
d0f0a4bb239c        java:8              "java -jar /opt/re..."   4 seconds ago       Up 3 seconds                            register-server
[root@localhost /]# 

注意:也可以直接将selinux 永久关闭(生产环境不建议)

 selinux 的几种关闭方式请查看 Selinux 简单操作

Logo

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

更多推荐