背景:按照往常逻辑下载了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服务打成另一个镜像,然后在通过这个新的镜像起一个虚拟机。

1、docker commit -m="test make dockerimage" -a="zhangyi" 2c0f16d1a7e5(代表源容器ID) centos:copy   通过源同期镜像制作一个新的镜像

2、docker run -d -p 5001:22 --name centos-copy --privileged=true centos:copy /usr/sbin/init

通过这个新的镜像在启动一个新的容器实例,但是端口需要改变一下,因为5002这个本级端口被上一个虚拟机占用。

3、ssh root@localhost -p 5001 登陆虚拟机

4、此时可以查看到两个虚拟机有自己的IP,而且两台虚拟机IP是互通的

这里大家其实还是发现一个问题:ssh 的时候是用的localhost,不是用的IP地址,如果我们要使用不同的IP地址来区分不同的container(虚拟机)怎么办呢?搞了半天搞不定,因此还是只能使用不同的端口来作为不同的虚拟机。可以在.bash_profile中增加一个别名来登陆虚拟机

vim ~.bash_profile

alias test="docker exec -it my_docker /bin/bash"

----------

下面host方式好像也不行。 

这里就需要在创建容器时候需要制定网络类型:--network=host,使用 --network=host,此时,Docker 容器的网络会附属在主机上,两者是互通的。

----------

如果要把宿主机的目录挂在到容器的某个目录下,可以docker run启动参数的时候就可以指定,如下命令:

docker run -d -t -i -p 5002:22 --hostname mycontainer2 --name mycontainer2 -v /Users/zhangyi/git_space:/test --privileged=true zhangyi0833/centos-8.0:cgdb /usr/sbin/init

其中:-v /Users/zhangyi/git_space:/test 就是将宿主机目录/Users/zhangyi/git_space挂载到容器的/test目录下。如下容器内部看到的宿主机/Users/zhangyi/git_space下的内容

这样就相当于将宿主机和容器把目录共享了,此时不论在宿主机还是容器内部对这个目录操作比如创建文件 两边都可以看见。如容器内部创建了一个文件,此时在宿主机目录下也可以看到 

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐