使用Docker for Windows时,我们实际上正在使用在特殊Hyper-V VM中运行的小型(自定义)LinuxKit Linux。使用了相当多的方式使在Windows中使用Docker更加便利,似乎容易让人忘记它还在在Linux内核上运行。
请注意,这是关于默认的“Linux容器”模式。它不适用于“Windows容器”模式。
这只是一个可以访问Linux VM的容器,因此您可以执行诸如ps aux查看在VM中运行的守护程序之类的操作。这不是一个完整的操作系统。
首先需要创建一个具有完全root访问权限的容器,然后从那里访问文件系统。
- 获取可访问Docker守护程序的容器
- 运行具有完全root访问权限的容器
- 切换到主机文件系统
构建镜像
使用Docker构建一个镜像,Dockerfile如下所示:
FROM ubuntu
RUN set -xe \
&& echo '#!/bin/sh' > /usr/sbin/policy-rc.d \
&& echo 'exit 101' >> /usr/sbin/policy-rc.d \
&& chmod +x /usr/sbin/policy-rc.d \
&& dpkg-divert --local --rename --add /sbin/initctl \
&& cp -a /usr/sbin/policy-rc.d /sbin/initctl \
&& sed -i 's/^exit.*/exit 0/' /sbin/initctl \
&& echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup \
&& echo 'DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' > /etc/apt/apt.conf.d/docker-clean \
&& echo 'APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' >> /etc/apt/apt.conf.d/docker-clean \
&& echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean \
&& echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/docker-no-languages \
&& echo 'Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes \
&& echo 'Apt::AutoRemove::SuggestsImportant "false";' > /etc/apt/apt.conf.d/docker-autoremove-suggests
RUN rm -rf /var/lib/apt/lists/*
RUN sed -i 's/^#\s*\(deb.*universe\)$/\1/g' /etc/apt/sources.list
RUN mkdir -p /run/systemd && echo 'docker' > /run/systemd/container
CMD ["/bin/bash"]
RUN apt-get update && \
apt-get install -y --no-install-recommends apt-utils docker.io
通过以上 Dockerfile来构建一个镜像
docker build -t skyfinder/accessdockerdesktopvm:v1 .
镜像构建完成以后依次执行以下操作:
docker run --privileged -it -v /var/run/docker.sock:/var/run/docker.sock skyfinder/accessdockerdesktopvm:v1
docker run --net=host --ipc=host --uts=host --pid=host -it --security-opt=seccomp=unconfined --privileged --rm -v /:/host alpine /bin/sh
chroot /host
以上处理方式仅仅运行查看MobyLinuxVM中的信息内容。