阿男的小窝

View the Project on GitHub

使用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当中加载项目

接下来就可以用intellijhost这边加载这个目录了。第一步是在intellij里面加载hibernate-orm这个项目:

注意上面的Gradle JVM设置sdkman的当前jvm,其他的配置保持不变。点击ok加载项目,此时intellij会花一些时间加载和配置项目:

等待加载过程完成,打开MigrationTest并运行其中一个测试:

耐心等待测试运行出结果,第一次运行会失败:

可以看到是默认的language level设置不对,使用intellij的自动fix功能就可以解决这个问题:

点击上面intellij给出的Set language to 9,然后等待设置处理完成即可。此外还有一处需要设置,打开intellijpreferences

如上所示,进入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

以上就是要介绍的内容。