使用ssh和sshfs实现容器内目录的反向映射
docker
支持把「主机」上的目录映射到「容器」内部,但并不支持,反方向的映射,即「容器」内的目录映射到「主机」。
本文介绍一种「反向映射」的方法:通过ssh
服务,和macos
上面的sshfs
工具,把容器内部的目录挂装到主机。
包含ssh服务的容器
首先准备一个容器:
这个容器包含hibernate
源代码项目和编译好的相关jar文件,并且包含「ssh服务」。把这个项目使用git clone
命令下载到本地:
$ git clone https://github.com/alchemy-studio/docker-hibernate-build.git
clone完项目以后,需要安装java环境。
安装java
使用sdkman
安装java
:
$ sdk install java 11.0.3.hs-adpt
$ sdk use java 11.0.3.hs-adpt
$ java -version
下面是运行结果:
启动容器
启动容器,注意容器会启动postgresql
服务,要停掉host
的本地postgresql
服务:
$ pg_ctl -D /usr/local/var/postgres stop
停掉本地服务以后,运行下面的命令:
$ docker-compose -f docker-compose-production.yml up
下面是运行结果:
在host
连接容器的数据库试试看,连接数据库时候,foo_usr
的密码是foo
:
$ psql -U foo_usr -h localhost foo_db
下面是运行结果:
如上所示,可以在host
这边通过端口访问容器的数据库。
测试容器的ssh连接
查看容器映射出来的ssh
服务的接口:
$ docker ps
下面是运行结果:
如上所示,映射出来的端口是32773
。使用ssh
登录试试看:
$ ssh root@localhost -p 32773
命令的执行过程和结果:
如上所示,成功登录。注意root
的登录密码是foo
。
准备host的挂装目录
在「主机」这边创建一个工作目录,用于挂装「容器内」的目录:
$ sudo mkdir /work
然后设置目录owner
:
$ sudo chown `whoami` /work
命令的运行过程和结果:
这个目录准备好以后,接下来就是安装sshfs
,用来将容器内的目录挂装到host
的这个/work
目录里面。然后要在docker的配置里面,把/work
目录的共享权限加上:
这样「主机」这边的准备工作就完成了。
安装sshfs,挂装容器内部的hibernate工程目录至host
通过ssh
挂装容器里的目录至host
,需要安装sshfs
:
$ brew install sshfs
安装好以后,使用sshfs
挂装容器目录(注意每次容器重新启动,端口号会变):
$ sshfs -p 32768 root@localhost:/work /work
第一次挂装的时候,MacOS会弹出安全设置的提示,允许sshfs
的权限操作就可以了。点击Open System Preferences
:
点击「允许」:
此时再重新执行挂装命令就可以了:
如果挂装成功,可以看到host
的/work
目录里面已经是挂装了容器里面的work
目录了:
$ ls /work
命令的执行过程和结果:
可以看到容器里面的hibernate-orm
这个容器里面的目录被挂装到host
了:
以上就是容器目录的反向挂装过程。接下来我们可以在「主机」这边使用挂装出来的目录和里面的文件数据。
在intellij当中加载项目
接下来就可以用intellij
在host
这边加载这个目录了。第一步是在intellij
里面加载hibernate-orm
这个项目:
注意上面的Gradle JVM
设置sdkman
的当前jvm
,其他的配置保持不变。点击ok
加载项目,此时intellij
会花一些时间加载和配置项目:
等待加载过程完成,打开MigrationTest
并运行其中一个测试:
耐心等待测试运行出结果,第一次运行会失败:
可以看到是默认的language level
设置不对,使用intellij
的自动fix功能就可以解决这个问题:
点击上面intellij
给出的Set language to 9
,然后等待设置处理完成即可。此外还有一处需要设置,打开intellij
的preferences
:
如上所示,进入Java Compiler
的设置,全选所有Per-module bytecode version
里面的配置,点击-
,删掉所有配置,然后点击Apply
:
设置完成后,重新运行测试:
耐心等待测试完成,测试编译过程比较慢:
最终得到测试结果:
以上就是这个容器的完整使用方法,后续可以用这个容器做各种hibernate源代码的学习,分析,测试。
开发模式
这个容器支持开发模式的docker-compose
配置,使用下面的命令启动容器:
$ docker-compose -f docker-compose-development.yml up
登录容器
如果需要登录容器进行调试,使用下面的命令即可:
$ docker exec -it docker-hibernate-build_default_1 bash
以上就是要介绍的内容。