文章目录
[3.添加vim cloudstack.repo为以下内容](#3.添加vim cloudstack.repo为以下内容)
4.前期我们已经搭好了cloudstack平台,这里需要映射几个目录到容器里面,
[8.创建docker网络,使用docker network ls查看](#8.创建docker网络,使用docker network ls查看)
[10.更改 /etc/cloudstack/agent/agent.properties](#10.更改 /etc/cloudstack/agent/agent.properties)
概要
前面我们在物理机上创建了cloudstack平台,是成功了的,现在尝试使用docker去启动多个cloudstack虚拟主机节点。前提是需要在物理机上面进行搭建,然后通过物理机进行映射到容器里面
物理机搭建cloudstack单节点:cloudstack概要及单节点安装部署_docker部署cloudstack-CSDN博客
在当前目录下创建一个目录并进入目录
环境准备:
1.使用rockyLinux:8镜像
2.配置yum源
编辑 vim epel.repo添加以下内容
[epel]
name=Extra Packages for Enterprise Linux 8 - $basearch
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-8&arch=basearch\&infra=infra&content=$contentdir
enabled=1
gpgcheck=1
countme=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8
[epel-debuginfo]
name=Extra Packages for Enterprise Linux 8 - $basearch - Debug
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-8&arch=basearch\&infra=infra&content=$contentdir
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8
gpgcheck=1
[epel-source]
name=Extra Packages for Enterprise Linux 8 - $basearch - Source
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-source-8&arch=basearch\&infra=infra&content=$contentdir
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8
gpgcheck=1
3.添加vim cloudstack.repo为以下内容
[cloudstack]
name=cloudstack
baseurl=Index of /centos$releasever/4.19/
enabled=1
gpgcheck=0
4.前期我们已经搭好了cloudstack平台,这里需要映射几个目录到容器里面,
需要映射以下内容,可以先将所需要的目录进行cp到我们前面创建好的目录
/etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8
/etc/cloudstack/agent/
/etc/pki/CA
/etc/pki/libvirt/
需将以上四个目录进行cp到创建的目录
5.创建Dockerfile
内容如下:
FROM rockylinux:8
COPY epel.repo /etc/yum.repos.d/epel.repo
COPY cloudstack.repo /etc/yum.repos.d/cloudstack.repo
COPY Rocky-BaseOS.repo /etc/yum.repos.d/Rocky-BaseOS.repo
COPY RPM-GPG-KEY-EPEL-8 /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8
COPY agent/ /etc/cloudstack/
COPY CA/ /etc/pki/
COPY libvirt/ /etc/pki/
RUN yum makecache \
&& yum clean packages \
&& yum install -y \
openssh-server \
epel-release \
java-11-openjdk-devel \
cloudstack-agent \
iptables
RUN mkdir -p /var/run/sshd \
&& echo 'root:root' | chpasswd \
&& sed -i 's/^#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config \
&& ssh-keygen -A
CMD ["/usr/sbin/sshd", "-D"]
6.构建镜像
使用命令:docker build -t dockercloudstack:v1 .(镜像名可随意)
使用docker images进行查看已经构建好的镜像我这里是随意取的
7.使用命令创建容器
docker run -uroot --privileged --rm -v /etc/sysconfig/libvirtd:/etc/sysconfig/libvirtd -v /etc/libvirt/:/etc/libvirt/ -v /lib/udev/rules.d/:/lib/udev/rules.d/ -v /etc/cloudstack/agent:/etc/cloudstack/agent -v /etc/pki/:/etc/pki/ -v /run/dbus/:/run/dbus/ -e JAVA_OPTS="-Djava.io.tmpdir=/usr/share/cloudstack-agent/tmp -Xms256m -Xmx2048m" -e CLASSPATH="/usr/share/cloudstack-agent/lib/*:/usr/share/cloudstack-agent/plugins/*:/etc/cloudstack/agent:/usr/share/cloudstack-common/scripts" -e JAVA_CLASS=com.cloud.agent.AgentShell -it -d --hostname cloud --name cloud --network=my_macvlan_network --ip xxxxxxxxxxxxxxxx dockedahi:latest(替换IP地址)
使用docker run的时候发现docker创建的网络出现了以下问题,突然想到使用docker虚拟的容器,需要进行自定义bond0,然后重新设置网络。如果想了解docker网络模式可参看这篇文章:Docker不同的网络模式特点_docker网络类型 以及特点-CSDN博客
报错信息:docker: Error response from daemon: failed to create endpoint cloudworker160-2 on network my_macvlan_network: network id "9e54b8391319ab53087fea1a043c6cd0152bc5ddb1769d6cbe210732f529b240" not found.
8.创建docker网络,使用docker network ls查看
使用命令创建网络
docker network create -d macvlan --subnet=子网地址/24 --gateway=xxxxxxxxxxxxxxx -o parent=cloudbr0 my_macvlan_network
这里的subnet需要更改为所属自己的网络 ip a 的24位子网地址,以及对应网关,parent需要对应cloudbr0前面一篇cloudstack物理机搭建所讲解的,这是必要的
9.在使用第七部的命令进行创建
当我进入网页进行查看是否有这个主机时发现没有,这时候感到纳闷,就进入到容器进行查看,才发现没有启动服务,就试着去尝试systemctl status libvirtd才发现容器里面是没有systemctl这个指令,这不前功尽弃嘛,有试想这不用systemctl启动,或者尝试绕过这个命令不就可以了。尝试了很多次还是不行。就一直困恼着,后来在部门老大的的研究下,就尝试着拆解systemctl start libvirt这个命令
进入到/usr/lib/systemd/system/libvirtd.service配置信息如下
通过配置文件我们看到,他在启动时会去调用sbin下面的libvirtd进行启动,那好就回到根目录下面,确实发现有,然后使用libvirtd -h看一下指令,发现他需要的参数很少,就尝试加参数 - l 进行启动,还是失败,就去查看官方文档,发现,在进行启动libvirtd的时候,他会去调用cloudstack这个服务,那也就是意味着这个服务是不是也得开启。
然后我就去看systemctl status cloudstack-agent.server 发现确实有这个服务,然后进入到/usr/lib/systemd/system/cloudstack-agent.service
查看文件后,发现他在启动时会调用/etc/default/cloudstack-agent这个配置。
然后进入到etc/default/cloudstack-agent配置发现是调用的如下信息,也是环境变量,就export到用户的环境变量里面,然后在进行启动使用命令java $JAVA_OPTS $JAVA_DEBUG -cp $CLASSPATH $JAVA_CLASS进行启动。
10.物理机测试启动服务
这时候我们拆解了libvrited启动服务,需要启动libvirtd -l ,以及java $JAVA_OPTS $JAVA_DEBUG -cp $CLASSPATH $JAVA_CLASS这两条命令,需要加三条环境变量才能启动成功,就开始测试,启动后登录网页发现成功了。
11.容器测试
这时候我们得到了两台启动命令后在容器里面迫不及待进行尝试,发现报错,这又是什么原因呢,看看报错信息。
从报错的信息看看
No libvirt.vif.driver specified. Defaults to BridgeVifDriver
Failed to get private nic name
这时候想想,网络接口,虚拟化,那是不是容器里面起的服务也需要更改网络呢,就用ip a去查看,发现是eth0
就上网查资料,说是在vi /etc/cloudstack/agent/agent.properties下面进行更改
发现这个配置文件是我们之前从物理机上面映射过来的,这不埋下了坑,然全部更改为eth0在进行启动,没有报错,看网页成功了。算是松了一口气,就尝试搞第二台。
10.更改 /etc/cloudstack/agent/agent.properties
在进行第二台的时候,同样的配置启动,然后登录网页,发现160.2不见了只发了160.3,过一会又变回去了,发现还存在bug,就看了一下这个文件的配置,发现这两个容器的uuid是一模一样的是不是这个影响呢,就尝试更改一下,使用uuidgen生成新的修改这个配置然后在启动试试发现实成功的。
小结
以上就是在docker里面创建虚拟的cloudstack虚拟主机,但是在后续的研究中也存在一定的问题就是无法继续创建示例,需要在进行研究一下,因为这涉及到在容器里面在进行安装虚拟的,已经违背了docker的原则,但是可以进行docker里面套结docker,都需要各位大佬继续开发。提供批量创建云主机的脚本:docker批量创建cloudstack虚拟主机脚本-CSDN博客