带着 Docker 容器走吧(便携式 Docker)

简介

我们可以使用USB存储设备,在任何有Windows PC的地方,构建一个无需任何管理员权限即可运行Docker容器的环境。

关于USB存储设备的说明

如果不选择速度快的USB3.0兼容设备,写入速度将被拖慢,导致操作速度变慢。

我认为如果CrystalDiskMark的随机写入值(右下角1.0以上)没有超过1.0,会让人感到难受。(※个人感受会有差异)

顺便提一下,我自己使用的是I-O DATA的U3-MAX2/32K。

如果你可以容忍多少费用的话,选择便携式固态硬盘应该不会有速度方面的问题,除非是次品。

对于USB存储器容量为32GB以下的情况,初始状态通常采用FAT32格式进行格式化。然而,由于FAT32只支持单个文件最大4GB的限制,如果虚拟存储中的单个文件变得过大,容易出现写入错误并导致存储空间不足的情况发生。因此,需要重新以NTFS或exFAT格式进行格式化。

因为它的性质涉及大量写入操作,所以为了防止出现任何破坏,我们应该做好准备。

安装虚拟化软件

Qemu的中文释义是什么?

Docker只能在(64位的)Linux上运行,因此需要使用虚拟化软件来运行Linux,可以使用Qemu作为虚拟化软件。

Qemu虽然模拟速度不太理想,但可以在不启用需要管理员权限的各种加速器的情况下启动。换句话说,即使速度慢,也可以在没有管理员权限时启动。

WSL2和其他虚拟化软件需要管理员权限,并且无法进行便携式操作。而专为便携式操作设计的Portable-VirtualBox也需要管理员权限。

在没有加速器的情况下,要运行诸如Gnome等桌面环境是困难的,但在CUI(命令行)环境下可以相对顺利地工作。(※个人感受可能有所差异)
在Docker领域中,基本上UI由Web浏览器承担,所以这并不是太大的问题。
将默认的Web浏览器设置为私密模式,或者将可移动版本的Web浏览器一起安装是很方便的。

32位PC以及操作系统也能够模拟64位PC的能力也是一个重要的亮点。

顺便提一下,如果加速器无效,您也可以从运行在虚拟化环境中的Windows启动,也可以从运行在PC模拟器或VPS上的Windows启动,Docker也是可用的!

下载安装

从官方网站下载Qemu的Windows版本(32位版或64位版)。

由于Windows版的Qemu似乎只提供以管理员权限为前提的安装程序形式进行发布,因此我们将使用支持解压安装程序的Universal Extractor2(直接链接)将其解压到USB存储设备中。
实际上,我们也可以使用同样已经包括在其中的7-zip进行解压,但是7-zip似乎也只提供以管理员权限为前提的安装程序形式进行发布(虽然有一种从msi文件中提取文件的方法,但手动操作可能会有些麻烦)。

使用管理者权限进行安装,并将安装的文件复制到USB存储设备中可使用。

安装Linux

Alpine Linux可以被翻译为阿尔派纳Linux。

一旦将Qemu复制到USB闪存后,我们可以在虚拟计算机上安装Linux。

只要安装的Linux发行版支持64位并且可以安装Docker,我都无所谓,但我个人推荐使用Alpine Linux。

如果想从头开始安装Debian等常用的Linux发行版,即使在本来就很慢的Qemu上也要准备数小时,即使是最小配置。但是,如果使用Alpine Linux,安装只需几分钟就可以完成。

Alpine Linux是一种注重轻量化而牺牲兼容性的发行版,由于其小巧的大小,经常被选作Docker镜像的基础,并且在Docker领域中经常见到。如果您使用Docker,我认为了解这个发行版是非常有价值的。

由于为了减小大小,Alpine Linux使用了musl而不是glibc作为其标准C库,所以与其他Linux发行版一些使用的软件存在一些兼容性问题。然而,只要将Alpine Linux本身作为Docker主机,并将软件基本上作为Docker容器来运行,就不会出现问题。

在与Go语言相关的领域中,最著名的非互换应该是什么呢?使用Go语言创建的单一二进制文件可能需要添加特定的配置才能运行。在Docker领域中,这似乎是一个相当大的问题,如果进行一番调查,会发现许多相关信息。另外,据我所知,像Web管理工具Cockpit或者针对VSCode的远程插件服务器,在Alpine Linux上是无法运行的,但如果在其他Linux发行版为基础的Docker容器上运行,就可以正常工作(但将Cockpit运行在容器上并无法管理主机的Linux系统,所以意义不大)。

ISO下载。

因为官方网站提供了ISO下载页面,所以我们将下载x86_64版。

尽管标准版(124兆字节)也可以,但我建议您选择适用于虚拟电脑的更小尺寸的虚拟版(40兆字节)。

下载时,文件名可能会变得很长,如alpine-virt-3.12.0-x86_64.iso。为了方便后续操作,建议将其改为alpine.iso或其他简洁的文件名。

安装

与其他虚拟化软件不同,Qemu完全通过命令行进行配置和启动(虽然有很多用于操作界面的前端)。

创建虚拟存储文件

> qemu-img create -f qcow2 linux.qcow2 20G

最后的20G将成为虚拟存储文件的最大容量,因此我们需要根据环境进行调整。它不是立刻就分配全20G的存储空间,而是根据需要逐渐增大大小,直到达到最大容量为止的机制。

使用iso文件作为引导磁盘来启动

请参考Qemu的文档以查看选项,我自己的设置如下所示。

> qemu-system-x86_64.exe -display sdl -rtc clock=vm,base=utc -smp 2 -boot d -m 2048 -net nic,model=virtio -hda linux.qcow2 -cdrom alpine.iso

如果一切正常,Linux便会弹出一个窗口并开始引导。引导过程大约需要1分钟到几分钟的时间。

安装

当引导完成后,控制台将显示登录界面。输入“root”,然后按下回车键即可无需密码登录。

localhost login: root

一旦登录成功,

# setup-alpine

在开始安装前,请运行安装程序。您将在命令行中回答几个问题,然后开始安装过程。

请参考以下给出的参考资料来了解具体的内容。由于篇幅较长,这里省略了。

当安装完成后

# poweroff

关闭。

Linux启动和配置

启动

> qemu-system-x86_64.exe -display sdl -rtc clock=vm,base=utc -smp 2 -m 2048 -net nic,model=virtio -net user,hostfwd=tcp::22-:22,hostfwd=tcp::2375-:2375,hostfwd=tcp::9000-:9000 -hda linux.qcow2

我是这样启动的(除了一部分)。

通过指定的端口连接到Qemu内的Linux服务器,这样可以使用端口转发来实现。

在这种情况下,您可以通过localhost:22连接到在Qemu内部监听22端口的Linux服务器,而不是Windows主机。

在这里,我为SSH分配了22号端口,为Docker CLI分配了2375号端口,为Portainer分配了9000号端口。您可以通过使用逗号连接,打开多个端口,就像上面所示。但是请注意,如果指定了已经被其他服务器使用的端口,Qemu本身将无法启动,并出现错误。请注意这一点。

顺便提一下,这也适用于连接Docker容器上的服务器。也就是说,如果在Qemu启动时启用了对9000端口的监听,那么在Linux主机上启动的Docker容器将以监听Linux主机上9000端口的配置启动,从Windows主机可以通过9000端口连接它(有点复杂…)。

Linux的启动时间因环境而异,大约需要1-2分钟。不清楚是慢还是正常速度,但如果要频繁启动和停止作为便携操作,可能会成为瓶颈。

SSH的配置

如果在安装过程中出现登录界面,您需要使用ID为root,密码为您在安装时设定的密码进行登录。

因为在Qemu窗口中无法执行命令并复制粘贴,所以为了方便,我们将启用SSH。

虽然 Alpine Linux 在安装时已经包含了 SSH 服务器(如果在安装时选择不设置 SSH 服务器,则不包含),但是根据 SSH 服务器的规定,无法直接使用 root 用户登录。所以在这里我们将快速新增配置文件,以使得可以使用 root 账户进行登录。

# echo "PermitRootLogin yes" >> /etc/ssh/sshd_config

如果您想要无需密码运营,还需要输入以下内容。

# echo "PermitEmptyPasswords yes" >> /etc/ssh/sshd_config

如果更改了设置文件,则一次性关闭并重新启动Qemu,或重新启动SSH服务器。

# service sshd restart

连接

最近的Windows 10中默认安装了OpenSSH客户端,但是直接使用的话会忽略环境变量,在Windows系统用户文件夹中创建.ssh文件夹,导致不再是便携式的。因此,为了避免这个问题,可以通过以下方式启动,不加载配置文件、不进行密钥检查,也不保留KnownHosts文件。

> ssh -F /dev/null -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@localhost

使用Telnet连接到Qemu

如果您不想在像上述SSH服务器设置一样的不安全状态下运行,您可以使用Telnet来显示控制台,而不是使用“-display sdl”来打开窗口。

> qemu-system-x86_64.exe -display none -serial telnet:localhost:4321,server,nowait -rtc clock=vm,base=utc -smp 2 -m 2048 -net nic,model=virtio -net user,hostfwd=tcp::22-:22,hostfwd=tcp::2375-:2375,hostfwd=tcp::9000-:9000 -hda linux.qcow2

只需在运行Qemu之后通过Telnet连接到4321端口,即可显示控制台。

在Windows 10中,默认情况下没有启动Telnet客户端,因此需要使用Tera Term或Putty等支持Telnet的终端软件(两者都有便携版)。

因为两者都可以进行命令的复制粘贴,非常方便。

只要始终启用此选项,并且知道端口,就可以连接到SSH服务器并进行上述设置,和始终启用此选项的区别不大,所以让我们只在需要时启用它。

使用作为连接的临时手段,直到完成适当的SSH服务器设置等是一个明智的选择。

仔细考虑的话,TeraTerm具有宏功能,只要能够进行Telnet连接,就可以通过宏自动操作Linux系统,因此,如果与批处理文件结合使用,可以将这篇文章的所有工作全部自动化完成…→ 已经实现了。

安装Docker

Alpine Linux具备一种名为apk的独特包管理器,但初始状态下无法安装Docker,因此需要使用vi等编辑器修改/etc/apk/repositories以使其可安装。

在初始状态下,第二行的社区存储库被注释掉了,但是请删除注释符号“#”以使其生效。

#/media/cdrom/apks
http://dl-cdn.alpinelinux.org/alpine/v3.12/main
http://dl-cdn.alpinelinux.org/alpine/v3.12/community
#http://dl-cdn.alpinelinux.org/alpine/edge/main
#http://dl-cdn.alpinelinux.org/alpine/edge/community
#http://dl-cdn.alpinelinux.org/alpine/edge/testing

保存后,使用apk安装docker和docker-compose软件包。

# apk update
# apk add docker docker-compose

当安装完成后,启动Docker。

# service docker start

我会将其设置为在启动时自动开始。

# rc-update add docker boot

如果要确认它是否正常运作(可能),您可以下载提供的hello-world镜像并将其作为容器运行。

# docker run --rm hello-world

如果一切顺利,应该会出现如下所示的显示。

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:49a1c8800c94df04e9658809b006fd8a686cab8028d33cfba2cc049724254202
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

使用Windows版Docker CLI进行容器操作

你也可以使用Windows版本的Docker CLI从Windows主机操作Qemu内的Docker。

由于我从未使用过,所以很难说,但我认为最终可能会是一种在虚拟化软件上操作Linux内的Docker的Windows版本(例如Docker Tookbox或Docker for Windows等)。

虽然建议使用Docker CLI自行构建,但也有人发布已构建好的二进制文件,如果不想自行构建的话,可以使用这些已构建的文件。

建议使用Docker Compose的官方预编译二进制文件,然后将其重命名为docker-compose.exe。

由于不设置任何内容,无法连接,因此我们需要创建以下/etc/docker/daemon.json文件,以便从Windows主机进行连接。还需要更改启动选项以使Qemu能够连接到2375端口。

{"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]}

创建文件后重新启动Docker。

# service docker restart

在Windows系统中,需要将路径设置为之前下载的exe文件,然后设置环境变量以连接到localhost:2375。

> set DOCKER_HOST=localhost:2375

我会试着运行docker ps来确认是否正常工作。如果一切顺利,应该是这样的。

> docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                                          NAMES
5b07a88001c9        portainer/portainer   "/portainer"             5 days ago          Up 9 minutes        0.0.0.0:9000->9000/tcp                         portainer

说实话,在Windows的命令行中操作Docker并没有太多意义。最好通过SSH或Telnet直接从Linux操作。

如果强行寻找优点的话,那可能就是通过在Windows上运行的Visual Studio Code中的Docker扩展功能和Remote-Containers扩展功能,可以实现对Docker操作和远程开发到容器的能力吧…虽然即使没有这些功能,也可以在容器端启动SSH服务器并通过SSH进行远程开发,但这也是一个微妙的方案。

安装Portainer

如果你觉得在命令行中管理所有的Docker容器很麻烦,我建议你使用Portainer,在Web浏览器上可以管理Docker容器。

如果您已经成功安装了Docker,那么只需执行以下一行命令即可完成安装。

# docker run -d -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

安装完成后,如果在Web浏览器中访问 http://localhost:9000 ,应该会出现Portainer的登录页面。

请根据这里的参考,进行初期设置。

网络

如果在Qemu中没有特殊配置,可以在Windows上通过localhost访问Qemu中的Linux系统(仅限于Qemu设置的端口),当然也可以在Qemu的Linux系统中通过固定IP访问Windows服务器。

方向アドレス備考Windows → Qemu・Dockerコンテナ localhost(127.0.0.1)Qemu起動時に設定したポート番号のみQemu・Dockerコンテナ → Windows 10.0.2.2
Qemu → Dockerコンテナlocalhost(127.0.0.1)
Dockerコンテナ → Qemu(別のDockerコンテナ)172.17.0.1Docker共通?

安全

在这种情况下,仅当将USB存储设备连接到计算机并运行Qemu时才能正常工作,并且通常仅能进行本地连接,因此并不是太大的问题,但基本上不建议这种操作。此外,要注意USB存储设备的丢失和盗窃。

最后

现在使用USB存储设备可以携带Docker容器的环境已经完成。
对于没有自行管理的个人电脑的人来说,这是一个推荐的选择。

bannerAds