WSL2使用Docker运行ManageIQ(含Systemctl安装、脚本配置代理与Docker端口映射)

WSL2使用Docker运行ManageIQ(含Systemctl安装、脚本配置代理与Docker端口映射)

使用ManageIQ项目在Docker Hub上提供的映像来测试在Docker容器中运行的ManageIQ。解决了在使用WSL2上的一些问题:使用systemd启动、WSL2中访问宿主机Windows代理、安装ManageIQ并且将端口映射到windows宿主机上访问。

参考资料:

[DamionGans/ubuntu-wsl2-systemd-script: Script to enable systemd support on current Ubuntu WSL2 images Unsupported, no longer updated] (github.com)

WSL2 中访问宿主机 Windows 的代理 - ZingLix Blog

ManageIQ - Easy Install With Docker

Docker容器与win10访问wsl中的docker中容器_Canger_的博客-CSDN博客

文章目录

  • WSL2使用Docker运行ManageIQ(含Systemctl安装、脚本配置代理与Docker端口映射)
    • Systemctl
    • WSL2 中访问宿主机Windows 的代理
    • 使用Docker运行ManageIQ
    • Docker端口映射到宿主机

Systemctl

WSL2 本身是由 Windows 负责运行的,因此使用 tree 或 ps 命令时会看到根进程不是 systemd,这将导致无法启动 Linux 系统服务的守护进程(deamon)。当我们执行 systemctl 命令的时候,会显示出我们的 init system (PID 1) 并非 systemd,而是微软提供的 /init。

$ systemctl
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
$ ps u -q 1
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.0    908   592 ?        Sl   11:27   0:00 /init

这里使用一个脚本解决问题,这个脚本用于在Windows应用商店中的当前Ubuntu WSL2映像上启用systemd支持的脚本。这个脚本不受支持,将不再被维护。

需要安装git:

sudo apt install git

git并运行脚本:

git clone https://github.com/DamionGans/ubuntu-wsl2-systemd-script.git
cd ubuntu-wsl2-systemd-script/
bash ubuntu-wsl2-systemd-script.sh
# Enter your password and wait until the script has finished

测试一下,可以发现PID1进程从init变成了systemd:

$ ps u -q 1
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.0  26724 12236 ?        Ss   01:08   0:00 /lib/systemd/systemd --unit=basic.target

WSL2 中访问宿主机Windows 的代理

这部分内容是转载WSL2 中访问宿主机 Windows 的代理 - ZingLix Blog

获得宿主机ip:

cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }'

获得WSL2自己的ip:

hostname -I | awk '{print $1}'

在~下新建一个文件proxy.sh,这段代码首先分别获得宿主机的ip地址和WSL2的ip地址,并且手动将外部代理的端口写入常量port,将宿主机ip和代理端口组合成常量PROXY_HTTP,分别写set_proxy()unset_proxy()test_setting()三个函数,根据传入的参数判断执行:

#!/bin/sh
hostip=$(cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }')
wslip=$(hostname -I | awk '{print $1}')
port=

PROXY_HTTP="http://${hostip}:${port}"

set_proxy(){
    export http_proxy="${PROXY_HTTP}"
    export HTTP_PROXY="${PROXY_HTTP}"

    export https_proxy="${PROXY_HTTP}"
    export HTTPS_proxy="${PROXY_HTTP}"

    export ALL_PROXY="${PROXY_SOCKS5}"
    export all_proxy=${PROXY_SOCKS5}
}

unset_proxy(){
    unset http_proxy
    unset HTTP_PROXY
    unset https_proxy
    unset HTTPS_PROXY
    unset ALL_PROXY
    unset all_proxy
}

test_setting(){
    echo "Host ip:" ${hostip}
    echo "WSL ip:" ${wslip}
    echo "Current proxy:" $https_proxy
}

if [ "$1" = "set" ]
then
    set_proxy

elif [ "$1" = "unset" ]
then
    unset_proxy

elif [ "$1" = "test" ]
then
    test_setting
else
    echo "Unsupported arguments."
fi

第 4 行 换成自己宿主机代理的端口,这里使用的是什么就不说了(只能说懂得都懂,端口号为7890。

~/.bashrc中加上下面两句话,并将里面的路径修改成放这个脚本的路径:

alias proxy="source /path/to/proxy.sh"
. /path/to/proxy.sh set

我的目录为/home/shark

shark@LAPTOP-NJ5APBFE:~$ pwd
/home/shark

所以加的是:

alias proxy="source /home/shark/proxy.sh"
. /home/shark/proxy.sh set

这样就可以在任何路径使用三个命令proxy setproxy unsetproxy test来进行proxy的设置、删除与测试,例如:

$ proxy test
Host ip: 172.22.80.1
WSL ip: 172.22.80.169
Current proxy: http://172.22.80.1:7890

使用Docker运行ManageIQ

使用ManageIQ项目在Docker Hub上提供的映像来测试在Docker容器中运行的ManageIQ。

ManageIQ - Easy Install With Docker

启动docker:

sudo systemctl start docker

Step 1:官方提供的镜像:

docker pull manageiq/manageiq:lasker-1

这里提供的镜像是有问题的,因为在Docker Hub上找不到这个镜像,所以替换为

docker pull manageiq/manageiq:latest-lasker

Step 2:运行容器:

docker run -d -p 8443:443 manageiq/manageiq:latest-lasker

看一下是否正常跑了起来:

$ docker ps
CONTAINER ID   IMAGE                             COMMAND                  CREATED         STATUS         PORTS
                                     NAMES
c564bf9ffae8   manageiq/manageiq:latest-lasker   "/usr/bin/dumb-init …"   4 seconds ago   Up 3 seconds   3000/tcp, 0.0.0.0:8443->443/tcp, :::8443->443/tcp   eager_joliot

但是这个时候只能从docker内部访问,无法在windows宿主机上访问,所以需要进行端口映射。

Docker端口映射到宿主机

通过docker container ls当前运行的容器以及端口映射情况:

$ docker container ls
CONTAINER ID   IMAGE                             COMMAND                  CREATED          STATUS          PORTS                                               NAMES
c564bf9ffae8   manageiq/manageiq:latest-lasker   "/usr/bin/dumb-init …"   50 minutes ago   Up 50 minutes   3000/tcp, 0.0.0.0:8443->443/tcp, :::8443->443/tcp   eager_joliot

此时只能在WSL2中访问容器的8443端口,可以通过 ifconfig 查看Docker的ip,但是直接在win10的浏览器上访问还是不行,因此需要建立映射。以管理员身份打开powershell:

netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8443 connectaddress= connectport=

例如:上面我是用WSL2的ubuntu中的8443端口映射到了容器的443端口,所以我这边的connectport要填8443,再利用上面配置的proxy查看一下WSL2的ip地址:

$ proxy test
Host ip: 172.22.80.1
WSL ip: 172.22.80.169
Current proxy: http://172.22.80.1:7890

查到WSL ip: 172.22.80.169:

netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8443 connectaddress=172.22.80.169 connectport=8443

建立映射后可以查看:

netsh interface portproxy show all

侦听 ipv4:                 连接到 ipv4:

地址            端口        地址            端口
--------------- ----------  --------------- ----------
0.0.0.0         8443        172.22.80.169   8443

现在就可以用本机8443端口访问到容器的443端口(WSL2的8443端口)了。

如果使用host模式暴露端口,则:

docker run -d -p 8443:443 --network host manageiq/manageiq:latest-lasker

只需要建立443到宿主机的映射:

netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8443 connectaddress=172.22.80.169 connectport=443

查看映射:

 netsh interface portproxy show all

侦听 ipv4:                 连接到 ipv4:

地址            端口        地址            端口
--------------- ----------  --------------- ----------
0.0.0.0         8443        172.22.80.169   443

如果需要删除,可以使用delete命令:

netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=8443

访问一下ManageIQ,注意要使用https://:

默认的账号密码:

  1. Login: admin
  2. Password: smartvm
WSL2使用Docker运行ManageIQ(含Systemctl安装、脚本配置代理与Docker端口映射)_第1张图片

你可能感兴趣的:(学习笔记,docker,linux,容器,ubuntu,cmp)