Vmware虚拟机作为Docker宿主+端口穿透转发

Vmware虚拟机作为Docker宿主+端口穿透转发

Why

在Windows上直接使用docker-desktop需要WSL, WSL需要开启Hyper-V, Hyper-V是Type1 虚拟化,开启后对宿主Windows有性能损失~~(影响我打游戏)~~, 而Type2的Vmware不会。当然影响不大,但不妨碍我折腾。

参考文章:https://salesforcedevops.net/index.php/2020/01/24/make-a-docker-host-fast-and-easy-with-vmware-esxi-and-photon-os-3/ (不过这篇使用ISO,我们使用OVA)

下载photonOS镜像

download:

https://github.com/vmware/photon/wiki/Downloading-Photon-OS

OVA_version:

https://packages.vmware.com/photon/5.0/GA/ova/photon-hw15-5.0-dde71ec57.x86_64.ova

下载后直接在Vmware中打开就能导入,默认用户root,密码changeme,第一次登录后会要求修改。

扩展磁盘空间

photon-os默认根目录空间15GB,对于大一点的镜像不够。参考这个链接文档扩展磁盘大小:

  1. 在Vmware虚拟机设置中扩展虚拟磁盘大小。

  2. 启动photon,执行如下命令:

    1
    2
    3
    4
    5
    6
    
    # 重新扫描磁盘
    echo 1 > /sys/class/block/sda/device/rescan
    # 使用tdnf安装parted软件包
    tdnf install parted
    # 使用parted打开sda
    parted /dev/sda
  3. 在parted交互环境内输入print,然后按提示修复GPT分区表以使用所有磁盘空间

  4. 上述命令会显示当前的所有分区和编号,除grub外默认ext4是第2个分区,将其扩展以使用全部空间:

    1
    
    (parted) resizepart 2 100%
  5. 退出parted,使用resize2fs扩展文件系统:

    1
    
    resize2fs /dev/sda2
  6. 最后可用df -h检查

Pull代理设置

首先需要你在宿主机具有一个开启了允许局域网连接的代理客户端。

参考官方文档设置docker pull 代理:

在虚拟机创建/etc/systemd/system/docker.service.d/http-proxy.conf,配置如下内容:

1
2
3
[Service]
Environment="HTTP_PROXY=http://[proxy ip]:[port]"
Environment="HTTPS_PROXY=http://[proxy ip]:[port]"

注意一部分代理软件用于HTTPS_PROXY的协议仍然是HTTP。

然后重启docker服务:

1
2
sudo systemctl daemon-reload
systemctl start docker.service

然后才能开始pull。

网络端口设置

如果需要在宿主机局域网内访问docker容器内的服务,需要配置两层端口转发:

  • 宿主机(Windows)->虚拟机(Photon)
  • 虚拟机(Photon)->docker容器

宿主机->虚拟机

OVA导入时默认桥接,处于LAN内的机器可以直接,但是与主机IP不同,为了在外连接时不用多记一个ip,这里改成采用NAT模式+端口转发。

如果是Workstation版本可以直接使用菜单-编辑-虚拟网络编辑器。

对于VmwarePlayer,需要修改文件:C:\ProgramData\VMware\vmnetnat.conf

例如我们希望外部连接宿主机的[hostPortA]端口时,自动转发到:

1
2
[incomingtcp]
[hostPortA] = [vm ip]:22

注意:Vmware Player更新后会覆盖该文件。

宿主机增加防火墙规则允许外部Inbound 连接到端口[hostPortA]:。

1
New-NetFirewallRule -DisplayName "DockerHost SSH Inbound" -Direction Inbound -Protocol TCP -LocalPort [hostPortA] -RemoteAddress x.0.0.0/24 -Action Allow -Profile Any

重要:最后需要重启vmnat服务(CMD):net stop "VMware NAT Service"&net start "VMware NAT Service",仅重启电脑无效。

虚拟机->docker容器

在创建容器时配置端口转发,例如将虚拟机的2222端口转发到容器的22端口。

注意-p端口参数一定要在image name前面。

1
docker create --name xxx -it ... -p 2222:22 [image name]

可以查看docker程序监听端口来验证: netstat -tuln | grep 2222

查看iptables 规则确认允许2222入站:iptables -L -v -n

外部SSH分别登录虚拟机/docker容器

追加编辑虚拟网络,或修改文件:C:\ProgramData\VMware\vmnetnat.conf

1
2
3
[incomingtcp]
[hostPortA] = [vm ip]:22
[hostPortB] = [vm ip]:2222

同样需要追加设置防火墙入站允许规则。

此时在局域网内SSH连接宿主机的[hostPortA]端口则登录到虚拟机Photon;若连接 [hostPortB]端口则穿透登录到docker容器。

杂项设置

开机启动docker的特定容器

1
2
systemctl enable docker.service
docker update --restart=always [name]

允许SSH登录root

https://vmware.github.io/photon/docs-v5/troubleshooting-guide/solutions-to-common-problems/permitting-root-login-with-ssh/

解决SSH时 docker环境变量与直接登录不一致

参考:

https://xuxinkun.github.io/2019/03/12/docker-env/

添加如下内容到~/.profile

1
export $(cat /proc/1/environ |tr '\0' '\n' | xargs)
0%