使用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 本身是由 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 的代理 - 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 set
,proxy unset
,proxy test
来进行proxy的设置、删除与测试,例如:
$ proxy test
Host ip: 172.22.80.1
WSL ip: 172.22.80.169
Current proxy: http://172.22.80.1:7890
使用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 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://:
默认的账号密码: