docker容器中文件的上传与下载

1. 操作环境

1. CentOS:

  • CentOS-7-x86_64-DVD-1611

2. Docker:

  • Docker version 1.12.6, build 88a4867/1.12.6

3. busybox:

  • latest

2. 启动一个容器

  启动一个容器,还是以之前我们所下载的busybox镜像为例来进行说明。

  在docker中镜像是静态的,是不能被拿来直接运行的,而我们要想运行镜像中的系统,那么我们就必须得把镜像放到容器中来运行才行。

  创建容器的指令为:

docker run -dit busybox

  创建的结果为:

这里写图片描述

  其中新创建的容器di为:

ecef8319d2c8d25d9c9b1e70b9a4c523c466d2f5e825ae651267f184c895813a

  查看新创建的容器:

docker ps

  创建的结果如下:

这里写图片描述

3. 上传文件

  上传文件还是以之前所上传到CentOS操作系统中的文本文件test.txt为例来进行说明。

  文件上传指令格式:

docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

  OPTIONS说明:

  • -L :保持源目标中的链接

  上传文件

docker cp /root/test.txt ecef8319d2c8:/root/

  该命令的意思是将当前操作系统(CentOS)家目录(root)下的文件test.txt拷贝到容器id为ecef8319d2c8的家目录(root)文件夹下。

4. 登录容器

1. 通过attach命令登录容器

  • attach登录

  要想查看上传的结果,那么这就得需要我们登录到目标容器中去,登录目标容器的方法有两个,分别是通过attach命令或者是exec命令。

  通过attach登录容器的语法:

docker attach [OPTIONS] CONTAINER

  要attach上去的容器必须正在运行才行,但是这样登录上去的容器有一个缺点,那就是一旦我们执行退出操作(比如说当我们执行exit指令),正在运行的容器也立即停止了。

  attach登录容器的指令为:

docker attach ecef8319d2c8

  • W3C官方挖坑

  这里存在一个误区有必要科普一下,那就是在docker的W3C的官方文档中是这样介绍的,那就是当执行下面的命令

docker attach –sig-proxy=false ecef8319d2c8

  后,再次执行CTRL-D不会关闭容器,但是实际操作并非如此,比如说我们在执行前查看一下正在运行的容器:

docker ps

  显示的结果如下:

这里写图片描述

  当我们执行了下面的命令

docker attach –sig-proxy=false ecef8319d2c8

  然后再点击CTRL-D,显示的结果如下:

这里写图片描述

  结果显示容器已经退出了,此时我们再次查看正在运行着的容器

docker ps

这里写图片描述

  上面显示的结果为没有任何容器正在执行,这说明容器确实已经关闭了。

  在不加–sig-proxy=false时,当我们执行CTRL-C命令时,容器也不会自动关闭,这个大家可以去做测试,我这里就不再复述了。

  总之大家在登录时一定要注意这一误区,以免误人子弟。

2. 通过exec命令登录容器

  • exec登录

  exec登录语法格式如下:

docker exec [OPTIONS] CONTAINER COMMAND [ARG…]

  OPTIONS说明:

  • -d :分离模式: 在后台运行
  • -i :即使没有附加也保持STDIN 打开
  • -t :分配一个伪终端

  exec登录容器指令为:

docker exec -it ecef8319d2c8 /bin/sh

  查看上传的文件:

ls /root/

  可以看到,文件确实是已经上传成功了,如下图:

这里写图片描述

  • 优点

  当我们执行CTRL-D或者exit命令后,退出容器,而该容器仍然在后台运行中。

  查看后台运行的容器:

docker ps

  结果如下:

这里写图片描述

  我们可以看到,容器仍然在后台照样运行中,所以说在连接容器的时候,我极力推荐大家采用这种方式。

5. 下载文件

  • 删除CentOS中的test.txt文件

  在下载busybox中的test.txt文件前,为了不致使CentOS中原有的test.txt文件出现干扰,所以说我们可以先删除该文件

  删除指令如下:

rm -rf /root/test.txt

  • cp指令下载

  cp指令下载语法格式

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-

  cp指令下载

docker cp ecef8319d2c8:/root/test.txt /root/

  查看下载的结果:

ll

  结果如下:

这里写图片描述

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Docker运行Java应用程序时,可能需要将文件上传容器的主目录(/home)。通常可以使用docker cp命令将文件从主机复制到容器,但在某些情况下,如果需要实现自动化,则需要将该过程包含在脚本或应用程序。 一个简单的解决方案是使用Java的标准类库的FileInputStream和FileOutputStream类。假设我们有一个名为file.txt的文件,位于主机的/home/user/目录下。在Docker容器,可以使用以下代码将该文件复制到容器的/home/目录: ```java import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class FileCopy { public static void main(String[] args) { String source = "/home/user/file.txt"; String destination = "/home/file.txt"; try (FileInputStream fis = new FileInputStream(source); FileOutputStream fos = new FileOutputStream(destination);) { byte[] buffer = new byte[1024]; int length; while ((length = fis.read(buffer)) > 0) { fos.write(buffer, 0, length); } } catch (IOException e) { e.printStackTrace(); } } } ``` 通过调用FileInputStream和FileOutputStream类的构造函数,可以将源文件和目标文件的路径传递给它们。然后,在while循环,逐个字节地将源文件的内容写入目标文件。 请注意,此解决方案依赖于Java类库而不是Docker命令。因此,它可以在任何支持Java的操作系统上运行,并且可以应用于从其他位置到/home目录的任何文件的复制过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值