Docker Toolbox

1st Start

Running pre-create checks...
(default) Image cache directory does not exist, creating it at C:\Users\James Zhan\.docker\machine\cache...
(default) No default Boot2Docker ISO found locally, downloading the latest release...
(default) Latest release for github.com/boot2docker/boot2docker is v19.03.12
(default) Downloading C:\Users\James Zhan\.docker\machine\cache\boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v19.03.12/boot2docker.iso...

2nd start

Running pre-create checks...
Creating machine...
(default) Copying C:\Users\James Zhan\.docker\machine\cache\boot2docker.iso to C:\Users\James Zhan\.docker\machine\machines\default\boot2docker.iso...
(default) Creating VirtualBox VM...
(default) Creating SSH key...
(default) Starting the VM...
(default) Check network to re-create if needed...
(default) Windows might ask for the permission to create a network adapter. Sometimes, such confirmation window is minimized in the taskbar.
(default) Found a new host-only adapter: "VirtualBox Host-Only Ethernet Adapter #2"
(default) Windows might ask for the permission to configure a network adapter. Sometimes, such confirmation window is minimized in the taskbar.
(default) Windows might ask for the permission to configure a dhcp server. Sometimes, such confirmation window is minimized in the taskbar.
Error creating machine: Error in driver during machine creation: Unable to start the VM: C:\Program Files\Oracle\VirtualBox\VBoxManage.exe startvm default --type headless failed:
VBoxManage.exe: error: Raw-mode is unavailable courtesy of Hyper-V. (VERR_SUPDRV_NO_RAW_MODE_HYPER_V_ROOT)
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component ConsoleWrap, interface IConsole

Details: 00:00:03.278002 Power up failed (vrc=VERR_SUPDRV_NO_RAW_MODE_HYPER_V_ROOT, rc=E_FAIL (0X80004005))
Looks like something went wrong in step ´Checking if machine default exists´... Press any key to continue...

3rd start

                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/

docker is configured to use the default machine with IP 192.168.99.100
For help getting started, check out the docs at https://docs.docker.com


Start interactive shell

James Zhan@win10-j4125 MINGW64 /c/Program Files/Docker Toolbox
$ docker-machine ssh default
   ( '>')
  /) TC (\   Core is distributed with ABSOLUTELY NO WARRANTY.
 (/-_--_-\)           www.tinycorelinux.net

docker@default:~$ netstat -lntp
netstat: can't scan /proc - are you root?
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp        0      0 :::22                   :::*                    LISTEN      -
tcp        0      0 :::8000                 :::*                    LISTEN      -
tcp        0      0 :::2376                 :::*                    LISTEN      -
tcp        0      0 :::3306                 :::*                    LISTEN      -

附录

Q/A

Q:如何在Windows 7 Home上安装Docker

Docker 对于 Windows 7 Home 版本的支持并不理想。Docker Desktop 需要 Windows 10 专业版或企业版,并且需要启用 Hyper-V 功能。然而,您仍然可以尝试使用 Docker Toolbox,在 Windows 7 Home 上部署 Docker。请注意,Docker Toolbox 已经被官方标记为过时,因此可能会遇到一些问题。

接下来,我将为您提供在 Windows 7 Home 上使用 Docker Toolbox 安装 Docker 并部署服务的步骤:

  1. 下载 Docker Toolbox:访问 Docker Toolbox releases 页面,下载最新版本的 Docker Toolbox 安装程序。
  2. 安装 Docker Toolbox:双击下载的安装程序,然后按照提示操作。安装过程中会同时安装 VirtualBox,因为 Docker Toolbox 会使用 VirtualBox 创建虚拟机来运行 Docker。
  3. 启动 Docker Quickstart Terminal:安装完成后,在开始菜单中找到并启动 Docker Quickstart Terminal。这个终端会自动创建一个名为 default 的虚拟机,然后在该虚拟机中启动 Docker。请耐心等待,这个过程可能需要一些时间。
  4. 检查 Docker 状态:在 Docker Quickstart Terminal 中输入 docker version 和 docker info,确保 Docker 安装成功并正在运行。
  5. 准备服务所需的 Dockerfile 和代码:在您的项目目录中创建一个 Dockerfile 文件,编写用于构建服务镜像的 Docker 指令。以及确保您的服务代码已经准备好。
  6. 构建 Docker 镜像:在 Docker Quickstart Terminal 中,切换到您的项目目录,然后执行 docker build -t your_image_name .,以构建 Docker 镜像。请将 your_image_name 替换为您选择的镜像名称。
  7. 运行 Docker 容器:在 Docker Quickstart Terminal 中,执行以下命令,将容器的端口 8000 映射到宿主机器的端口 8000:

    bash docker run -d -p 8000:8000 --name your_container_name your_image_name

    请将 your_container_name 替换为您选择的容器名称,将 your_image_name 替换为之前构建的镜像名称。

  8. 获取虚拟机 IP 地址:在 Docker Quickstart Terminal 中执行 docker-machine ip default,获取虚拟机的 IP 地址。这是局域网内其他设备需要访问的 IP 地址。

现在,您的服务已经在 Docker 容器中运行,并且端口映射已完成。局域网内的其他设备可以通过虚拟机的 IP 地址和端口 8000 访问您的服务。

请注意,Docker Toolbox 是一个过时的解决方案,主要用于在较旧的 Windows 系统(如 Windows 7 Home)上运行 Docker。在较新的 Windows 系统上(如 Windows 10 专业版和企业版),建议使用 Docker Desktop,它使用 Windows 内置的 Hyper-V 虚拟化技术,而不是 VirtualBox。Docker Desktop 提供了更好的性能和集成体验。

Q: docker toolbox 是如何做到把宿主机端口映射到容器内部服务端口的?

Docker Toolbox 使用 VirtualBox 创建名为 default 的虚拟机,并在其中运行 Docker。Docker Toolbox 在宿主机器和虚拟机之间配置端口转发,以实现从宿主机器到容器的端口映射。以下是 Docker Toolbox 实现端口映射的工作原理:

  1. 创建虚拟机:Docker Toolbox 安装时,它会创建一个名为 default 的虚拟机。这个虚拟机使用 VirtualBox 运行,并配置为使用 NAT 网络模式。NAT 模式允许虚拟机访问外部网络,同时将虚拟机的 IP 地址与宿主机器隔离。
  2. 配置端口转发:当您运行一个 Docker 容器并映射端口时(例如 docker run -d -p 8000:8000 --name flask_container flask_app),Docker Toolbox 会自动在虚拟机中设置端口转发。这将虚拟机中的端口映射到宿主机器上的相应端口。在这个例子中,宿主机器上的 8000 端口将映射到虚拟机中的 8000 端口。
  3. Docker 内部的端口映射:在 Docker 虚拟机内部,Docker 会将容器中的端口映射到虚拟机的端口。在这个例子中,Docker 将容器中的 8000 端口映射到虚拟机的 8000 端口。这是通过 Linux 的网络命名空间和 iptables 规则实现的。
  4. 端到端的端口映射:经过上述步骤,我们实现了从宿主机器到虚拟机,再到 Docker 容器的端口映射。当发起请求时,请求会从宿主机器的 8000 端口发送到虚拟机的 8000 端口,然后进一步转发到 Docker 容器中的 8000 端口。容器内的服务处理请求并返回响应,响应经过相同的路径返回给发起请求的设备。

以下是在 Windows 系统中设置端口转发的方法:

  1. 打开 Windows PowerShell (以管理员身份运行)。
  2. 使用以下命令创建一个端口转发规则,将宿主机的 8000 端口转发到虚拟机的 8000 端口。请替换<虚拟机IP地址>为实际的虚拟机 IP 地址。

    bash netsh interface portproxy add v4tov4 listenport=8000 listenaddress=0.0.0.0 connectport=8000 connectaddress=<虚拟机IP地址>

    例如,如果虚拟机的 IP 地址是 192.168.99.100,则命令应为:

    bash netsh interface portproxy add v4tov4 listenport=8000 listenaddress=0.0.0.0 connectport=8000 connectaddress=192.168.99.100

  3. 现在,您应该能够从局域网内的其他设备访问宿主机的 8000 端口。在其他设备上,输入http://<宿主机IP地址>:8000,其中<宿主机IP地址>是运行 Docker Toolbox 的 Windows 7 机器的局域网 IP 地址(如192.168.1.5)。

  4. 如果您需要删除此端口转发规则,可以使用以下命令:

    bash netsh interface portproxy delete v4tov4 listenport=8000 listenaddress=0.0.0.0

请注意,端口转发规则可能会受到防火墙的影响。确保 Windows 防火墙或任何其他安全软件允许通过 8000 端口的传入和传出流量。

如果无法使用netsh interface portproxy来添加端口映射,则可以考虑使用名为 "PassPort" 的第三方工具来实现端口转发。

请按照以下步骤操作:

  1. 访问以下网址下载 PassPort 工具:https://sourceforge.net/projects/pjs-passport/
  2. 下载 ZIP 文件并解压缩。
  3. 双击解压缩文件夹中的 PassPort.exe 以运行 PassPort。
  4. 单击 "Add" 按钮以创建新的端口转发规则。
  5. 在 "Local address" 和 "Remote address" 栏中,分别输入0.0.0.0和虚拟机的 IP 地址。例如,如果虚拟机的 IP 地址是 192.168.99.100,请在 "Remote address" 栏中输入该地址。
  6. 在 "Local port" 和 "Remote port" 栏中,分别输入 8000。
  7. 单击 "OK" 按钮以保存规则。

现在,您应该能够从局域网内的其他设备访问宿主机的 8000 端口。在其他设备上,输入http://<宿主机IP地址>:8000,其中<宿主机IP地址>是运行 Docker Toolbox 的 Windows 7 机器的局域网 IP 地址(如192.168.1.5)。