背景:按照往常逻辑下载了virtualbox 但是在macbook M1 上安装时候发现报错,这个时候才恍然M1是arm CPU,目前virtual box不支持。于是想了另个办法,我在mac上安装docker然后再在通过docker拉取centos镜像包,然后通过docker启动centos容器当成对应的虚拟机,不一样能达到在一台mac上启动多个虚拟机的目的吗?于是在macbook上先安装docker.
1、下载和安装docker
docker下载链接如下:Docker Desktop for Apple silicon | Docker Documentation
安装docker
安装成功后在桌面上看到如下图样式,此时说明docker后台进程已经启动了也就是launch了。
此时通过命令行得到docker版本:docker --version
由于docker拉取镜像大多从国外拉取因此受限于网络问题需要修改成国内镜像地址。此时修改桌面docker图标重的preferences sheet。选择docker engine选项,然后添加如下信息
"registry-mirror": [
"https://xx4bwyg2.mirror.aliyuncs.com",
"http://f1361db2.m.daocloud.io",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
],
此时已经有了docker进程,需要拉取一个镜像来驱动一个容器(当成虚拟机用),拉取一个centos镜像:docker pull centos:7 表示拉取的镜像叫centos,tag是7.
使用centos:7这个镜像来启动一个容器,也就是启动一个虚拟机,但是启动后因为多数镜像都是一些基础的镜像可能很多工具都没有需要进入容器中通过yum进行安装。
启动容器:docker run -d -p 5002:22 --name centos7-test --privileged=true centos:7 /usr/sbin/init
-d 后台启动,--name centos7-test 容器名字,centos:7用哪个镜像启动。-p 5002:22指的将容器内部的22端口映射到宿主机的5002端口上,也就是后续宿主机就可以通过5002端口去链接容器,比如ssh登录到容器中。
查看容器运行情况:
此时因为容器内部没有运行sshd服务,所以需要通过docker提供的命令方式去登陆容器:
docker exec -it centos7-test /bin/bash
此时登录到容器中也就是一个centos环境中了,可以当成虚拟机来用。此时可以通过yum进行工具安装,其他软件部署等操作,因为这个centos:7这个镜像只是一个基础镜像,好多东西没有安装,因此需要手动进行安装。比如这里需要安装网络ifconfig工具,git,ssh,gcc等包。
yum install net-tools openssh-server vim lrzsz wget gcc-c++ pcre pcre-devel zlib zlib-devel ruby openssl openssl-devel patch bash-completion zlib.i686 libstdc++.i686 lsof unzip zip openssh-server -y
安装完相关软件后,比如这里安装了ssh服务,此时需要在虚拟机内部启动sshd服务方便后面通过宿主机来访问该虚拟机:systemctl start sshd
为这台虚拟机创建一个root用户密码:passwd root
此时可以通过宿主机ssh来访问这台虚拟机:ssh root@localhost -p 5002 这里-p就是指定的5002端口去ssh容器中的ss端口。此时做到了ssh到这台容器虚拟机里面。
此时我们也遇到一个问题:基础镜像往往都是么有过多进场用到的软件安装,需要在基础镜像之上在安装对应的软件。因此如果我们已经安装了一些软件则可以将这个安装的工具的镜像在打包成一个镜像,后续就可以使用这个“基础镜像”来拉起容器,这个时候这个容器里面就可以有个有这些工具了。因此可以用docker命令对这个容器进行镜像制作。使用到的命令:
docker commit -m="提交的描述信息" -a="镜像作者" container_id image_name:TAG
docker commit -m="test make dockerimage" -a="zhangyi" 41ca9d52c1a5 centos7:v1
后面就可以以这个镜像来启动新的虚拟机了。
docker run -d -p 5003:22 --name centos7v1-container --privileged=true centos7:v1 /usr/sbin/init
此时可以直接ssh到这个新的container上去:ssh root@localhost -p 5003
这里大家其实还是发现一个问题:ssh 的时候是用的localhost,不是用的IP地址,如果我们要使用不同的IP地址来区分不同的container(虚拟机)怎么办呢?
这里就需要在创建容器时候需要制定网络类型:--network=host,使用 --network=host,此时,Docker 容器的网络会附属在主机上,两者是互通的。



