在 docker 容器中装载 linux 图像
Mount linux image in docker container
对于一个项目,我需要在 docker 容器 运行 ubuntu 中安装一个 linux 图像。我要挂载的镜像是Raspbian。我需要访问图像的 linux 文件系统并添加一个文件。
我通过挂载带有卷标志的文件夹来访问图像:
docker run -it -v /path/to/image/folder:/default ubuntu /bin/bash
使用 fdisk -l raspbian.img
我找到了偏移量:
Disk raspbian.img: 1.3 GiB, 1389363200 bytes, 2713600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x5a7089a1
Device Boot Start End Sectors Size Id Type
raspbian.img1 8192 137215 129024 63M c W95 FAT32 (LBA)
raspbian.img2 137216 2713599 2576384 1.2G 83 Linux
现在,当我尝试使用 mount -o loop,offset=$((137216*512)) raspbian.img /mnt/
装载图像时,我得到 mount: /mnt/: mount failed: Unknown error -1
。有人可以解释一下我是否可以在 运行 docker 容器中安装 linux 图像,如果可以,如何安装?
编辑
在 vagrant 中执行相同的挂载操作效果很好。 docker 安装文件系统有一些限制吗?
Are there some limitations to docker mounting filesystems?
是的。标准 Docker 容器有许多安全限制。正如您所发现的,您无法挂载新的文件系统。您也无法修改容器的网络环境。
一种解决方案是简单地在主机上执行挂载操作,然后使用 docker run
的 -v
参数将挂载的目录公开到容器中。类似于:
# losetup -fP --show raspbian.img
/dev/loop0
# mount /dev/loop0p2 /mnt
# docker run -v /mnt:/raspbian ubuntu bash
但是如果你真的想在容器内执行挂载,你可以运行一个特权容器,使用--privileged
选项到docker run
。这消除了通常放在 Docker 容器上的大部分限制:
- 您将可以完全访问主持人的
/dev
。
- 您将能够挂载文件系统。
- 您将能够修改容器内的网络配置。
例如:
# docker run -it --rm --privileged -v /images:/images ubuntu bash
现在我可以检查图像了:
root@30f80d4598dc:/# fdisk -l /images/2016-09-23-raspbian-jessie-lite.img
Disk /images/2016-09-23-raspbian-jessie-lite.img: 1.3 GiB, 1389363200 bytes, 2713600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x5a7089a1
Device Boot Start End Sectors Size Id Type
/images/2016-09-23-raspbian-jessie-lite.img1 8192 137215 129024 63M c W95 FAT
/images/2016-09-23-raspbian-jessie-lite.img2 137216 2713599 2576384 1.2G 83 Linux
并安装它:
root@952a75f105ee:/# mount -o loop,offset=$((137216*512)) /images/2016-09-23-raspbian-jessie-lite.img /mnt
root@952a75f105ee:/# ls /mnt
bin dev home lib64 media opt root sbin sys usr
boot etc lib lost+found mnt proc run srv tmp var
root@952a75f105ee:/#
对于一个项目,我需要在 docker 容器 运行 ubuntu 中安装一个 linux 图像。我要挂载的镜像是Raspbian。我需要访问图像的 linux 文件系统并添加一个文件。
我通过挂载带有卷标志的文件夹来访问图像:
docker run -it -v /path/to/image/folder:/default ubuntu /bin/bash
使用 fdisk -l raspbian.img
我找到了偏移量:
Disk raspbian.img: 1.3 GiB, 1389363200 bytes, 2713600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x5a7089a1
Device Boot Start End Sectors Size Id Type
raspbian.img1 8192 137215 129024 63M c W95 FAT32 (LBA)
raspbian.img2 137216 2713599 2576384 1.2G 83 Linux
现在,当我尝试使用 mount -o loop,offset=$((137216*512)) raspbian.img /mnt/
装载图像时,我得到 mount: /mnt/: mount failed: Unknown error -1
。有人可以解释一下我是否可以在 运行 docker 容器中安装 linux 图像,如果可以,如何安装?
编辑
在 vagrant 中执行相同的挂载操作效果很好。 docker 安装文件系统有一些限制吗?
Are there some limitations to docker mounting filesystems?
是的。标准 Docker 容器有许多安全限制。正如您所发现的,您无法挂载新的文件系统。您也无法修改容器的网络环境。
一种解决方案是简单地在主机上执行挂载操作,然后使用 docker run
的 -v
参数将挂载的目录公开到容器中。类似于:
# losetup -fP --show raspbian.img
/dev/loop0
# mount /dev/loop0p2 /mnt
# docker run -v /mnt:/raspbian ubuntu bash
但是如果你真的想在容器内执行挂载,你可以运行一个特权容器,使用--privileged
选项到docker run
。这消除了通常放在 Docker 容器上的大部分限制:
- 您将可以完全访问主持人的
/dev
。 - 您将能够挂载文件系统。
- 您将能够修改容器内的网络配置。
例如:
# docker run -it --rm --privileged -v /images:/images ubuntu bash
现在我可以检查图像了:
root@30f80d4598dc:/# fdisk -l /images/2016-09-23-raspbian-jessie-lite.img
Disk /images/2016-09-23-raspbian-jessie-lite.img: 1.3 GiB, 1389363200 bytes, 2713600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x5a7089a1
Device Boot Start End Sectors Size Id Type
/images/2016-09-23-raspbian-jessie-lite.img1 8192 137215 129024 63M c W95 FAT
/images/2016-09-23-raspbian-jessie-lite.img2 137216 2713599 2576384 1.2G 83 Linux
并安装它:
root@952a75f105ee:/# mount -o loop,offset=$((137216*512)) /images/2016-09-23-raspbian-jessie-lite.img /mnt
root@952a75f105ee:/# ls /mnt
bin dev home lib64 media opt root sbin sys usr
boot etc lib lost+found mnt proc run srv tmp var
root@952a75f105ee:/#