docker容器共享宿主机环境(目录挂载)

本文探讨了在Docker容器中共享宿主机JDK环境的方法,通过调整Dockerfile配置和容器启动参数,实现了减少镜像体积的目标。该方案适用于SpringBoot等Java Web项目的部署,但增加了容器对宿主机环境的依赖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、背景介绍

  如果开发的服务均需要将打成docker镜像,可是随着服务越来越多,镜像也越来越多。每次制作镜像的时候都需要将依赖打进容器,这样一个jre的环境就是100多M。有一天突发奇想,容器能不能共用宿主机的环境?这样每次打镜像时体积就会少不少。

二、测试

  我们测试用的是java的web项目做的测试,框架用的springboot,由于集成了tomcat插件,所以web项目打成jar包即可运行。

  1、在宿主机上安装jdk环境,目录在/home/softwares/jdk1.8.0_151。

  2、制作没有jdk环境的镜像。

  Dockerfile文件内容如下:

  *****************************************************************************

  From debian:latest

  ADD springWeb.jar /app.jar

  ENV JAVA_HOME="/home/softwares/jdk1.8.0_151"

  ENV PATH="${PATH}:${JAVA_HOME}/bin:${JAVA_HOME}/sbin"

  ENTRYPOINT [ "java", "-jar", "/app.jar" ]

  ******************************************************************************

  以上镜像是没有jdk环境的,所以在生成容器的时候一定要把宿主机jdk目录挂载到容器中。

  3、生成镜像

  docker build -t jdktest .

  注释:jdktest是镜像的名字。

  4、生成容器

  docker run -d --name jdktest -p 8088:8081 -v /home/softwares:/home/softewares --restart=always jdktest

  5、打开8088端口,然后用浏览器访问项目地址,成功!

三、优点

  1、它的优点很明显,减少许多镜像体积。

    debian系统有的只有5M不到,加上自己的一个jar包,镜像可能也就30M不到。而一个jre1.8的环境就得100多M。可以所体积减少很多。

四、缺点

  1、增加了容器对宿主机的依赖性。

    一旦宿主机的运行环境进行升级或改动,必定影响容器的运行。

  2、增加了新人交接的难度。

    生成容器时必须要将宿主机的运行环境目录挂载到容器中,也就是上面的 -v /home/softwares:/home/softewares操作。若没有此操作,容器是生成后就退出了。若进

   行新人交接时,他不知道要进行环境目录挂载,后面就GG了。

 

### Docker 容器宿主机发送数据的方法 #### 使用 `docker cp` 命令复制文件 为了将容器内的文件传输至宿主机,可以使用命令行工具提供的 `docker cp` 功能。此功能允许用户指定源路径(即容器内路径)以及目标路径(即宿主机上的绝对或相对路径),从而完成文件的拷贝操作[^3]。 例如,假设有一个名为 `Tomcat_kr` 的正在运行的容器,并希望从中获取 `/abc.txt` 文件并保存到宿主机的根目录下,则可执行如下指令: ```bash docker cp Tomcat_kr:/abc.txt /root/ ``` 这会把位于容器 `Tomcat_kr` 中的 `/abc.txt` 复制到宿主机的 `/root/` 目录中。 #### 利用挂载(Volumes) 实现持续的数据共享 除了直接通过 `docker cp` 手动迁移单个文件外,更常见的方式是在启动容器时设置持久化存储机制——挂载卷。这种方式使得容器能够实时读写宿主机特定位置下的文件夹,而无需每次都需要手动复制文件[^4]。 当创建新容器实例的时候,可以通过 `-v` 参数来定义要映射的本地磁盘空间作为容器的工作区的一部分。比如下面的例子展示了怎样建立一个 Redis 服务并将它的配置文件夹绑定到了当前用户的家目录之下: ```bash docker run -d --name my_redis \ -v ~/redis-conf:/usr/local/etc/redis \ redis:latest ``` 这样一来,在后续的操作过程中,任何对于该Redis服务器所做的更改都会被同步记录下来;反之亦然,修改宿主机上对应的文件也会反映给容器内部的应用程序看到最新的状态变化。 #### 配置网络连接以便远程访问资源 如果目的是为了让容器能主动发起请求去存取宿主机所提供的某些服务接口或者API端点的话,则需要注意调整两者间的通信方式。特别是在Windows环境下,可能需要用到特殊的DNS名称如 `host.docker.internal` 来指代外部世界中的本机地址[^2]。 这意味着只要确保应用程序正确设置了这些预定义好的环境变量或者是硬编码形式的目标URL即可达成目的。不过值得注意的是这种方法依赖于具体的平台特性支持情况有所不同,因此建议查阅官方文档获得最准确的信息指导。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值