返回介绍

搭建一个能运行的虚拟机环境

发布于 2025-04-20 18:52:13 字数 6812 浏览 0 评论 0 收藏

Ubuntu 是 Linux 发行版里面被用作个人桌面最多的系统,现在已经有很多公司选择使用 Ubuntu Server 作为生产环境的操作系统。

笔者选择了发布于 2016 年 4 月 21 日,版本代码名为“Xenial Xerus”的 Ubuntu 16.04 LTS。LTS 是 Long Term Support (长期支持)的缩写,这样的版本一般桌面版官方支持 3 年,服务器版支持 5 年。

下面使用 Docker 和 Vagrant 安装 Ubuntu 的章节是根据写作本书时的官方文档编写的,当你阅读到这里的时候有可能某些内容已经变更,请以官方文档为准。

安装 VirtualBox

VirtualBox 是 Oracle 开源的虚拟化系统,它支持 Linux、OS X、Windows 等平台,Docker 和 Vagrant 环境都需要使用它作为宿主机。到官方网站下载对应平台的最新版并安装。安装过程很傻瓜化,按提示一步一步执行到安装完成即可。

使用 Vagrant 安装

为什么选择 Vagrant?原因如下:

1.Vagrant 是一个操作虚拟机的工具,它会很快地完成一套开发环境的部署,也解决了各个开发环境不一致的问题,减少了重复配置环境而造成的时间和精力上的浪费。举个例子,在没有用 Vagrant 之前,新员工加入后常常需要一到两天的时间搭建完整的开发环境,而有了 Vagrant,直接启动就好了。先不需要了解所有相关环境的知识和细节,在工作中再慢慢熟悉就行了。

2.它底层支持 VirtualBox、VMware 甚至 AWS 作为虚拟机系统,可以满足不同用户的需要。

3.可以通过“vagrant provision”,使用 Shell 脚本或者主流的配置管理工具(如 Puppet、Ansible 等)对软件进行自动安装、更新和配置管理。

安装 Vagrant

目前 Rubygems 上 Vagrant 只更新到 1.5.0,不支持 VirtualBox 5.0 及以上版本。需要到官方网站选择对应的平台下载并安装。

安装完成后检查一下是否安装成功:

> vagrant--version
Vagrant 1.8.3

需要使用 Vagrant 1.8.3 及以上版本支持 Ubuntu 16.04 LTS。

使用 Vagrant

一个打包好的操作系统在 Vagrant 中称为 Box,实际上它是一个 zip 包,包含了 Vagrant 的配置信息和 VirtualBox 的虚拟机镜像文件。

默认的 Ubuntu 系统需要进行配置,如改成使用 aliyun 的源,安装 Python 等软件,添加用户 ubuntu 等。为了方便读者,可以使用笔者打包好的 Box(dongweiming/web_develop)。首先,克隆本书源代码并进入项目目录:

> git clone https://github.com/dongweiming/web_develop
> cd web_develop

项目中包含了 Vagrantfile 文件,不需要初始化:

Vagrant.configure(2) do|config|
   config.vm.box="dongweiming/web_develop"
   config.vm.hostname="WEB"
   config.vm.network:forwarded_port, guest:9000, host:9000
   config.vm.network:forwarded_port, guest:3141, host:3141
   config.vm.network:forwarded_port, guest:5000, host:5000
   config.ssh.username="ubuntu"
   config.ssh.password="ubuntu"
   config.ssh.insert_key=false
   config.ssh.private_key_path=["~/.ssh/id_rsa"]
   config.vm.provision"file", source:"~/.ssh/id_rsa.pub", destination:"~/.ssh/
        authorized_keys"
   config.vm.provider"virtualbox"do|v|
     v.customize ["modifyvm",:id,"--name","web_dev","--memory","1536"]
   end
   config.vm.network"public_network", bridge:"en0:Wi-Fi (AirPort)"
end

Vagrantfile 保存了虚拟机的各项配置。上述设置的用途如下:

1.使用笔者定制的 Box,名字为 dongweiming/web_develop。

2.设置虚拟机的主机名。

3.forwarded_port 用来设置端口转发,“guest:9000, host:9000”表示访问本机 9000 端口的流量就会转发到虚拟机上的 9000 端口,反之亦然。

4.没有使用 vagrant 作为默认用户,这是因为代码中有些指定了目录地址,为了兼容 Docker 容器,使用中立的用户 ubuntu。

5.customize 语句把虚拟机在 VirtualBox 中的显示名改为 web_dev,内存为 1536 MB。

6.config.vm.network 用来添加一个桥接网卡,它将使用 DHCP 获得 IP。

定制的 Box 基于官方的 ubuntu/xenial64,笔者在实际使用中发现不能直接登录,这里我们将创建一个 SSH 密钥用于自动登录。如果之前没有创建过 SSH 密钥,需要执行如下命令并回车:

> ssh-keygen

执行完毕会生成~/.ssh/id_rsa(密钥)和~/.ssh/id_rsa.pub(公钥)。

现在启动虚拟机:

> vagrant up

启动的时候会检查本地是否有这个 Box,没有的话就会下载。所以第一次花的时间会比较长。

第一次启动完成后需要使用配置脚本来初始化系统环境:

> vagrant provision
==>default:Running provisioner:file...

provision 会执行 Vagrantfile 中定义的 file 命令,把本机的~/.ssh/id_rsa.pub 拷贝到目标服务器并保存为~/.ssh/authorized_keys。

启动完成就可以登录虚拟机了:

> vagrant ssh

登录之后就可以直接验证本书提到的内容了。

使用 Docker 安装

Docker 是 dotCloud 开源的一个使用 Go 语言编写的基于 Linux 容器(Linux Containers,LXC)的容器引擎。它有以下优点:

  • 性能卓越。在以前的虚拟化方案中,虚拟机都是一个完整的操作系统,这本身就会占用 CPU、内存、硬盘等资源。而 Docker 是“操作系统级别的虚拟化”,可以达到秒级启动。IBM 曾发表过一篇关于虚拟机和 Linux Container 性能对比的论文(http://domino. research.ibm.com/library/cyberdig.nsf/papers/0929052195DD819C85257D2300681E7B/$File/rc25482.pdf ),论文中实际测试了虚拟机和 LXC 在 CPU、内存、网络的负载等方面的情况,结果显示 Docker 容器本身几乎不占用什么开销。
  • 可移植性带来了工作效率的提升。没有 Docker 之前,运维和开发工作中经常会发生这样的情况:本地开发环境正常,但是上线就出问题。这就需要花时间找原因然后解决。而 Docker 是“一次封装,到处运行”,开发者只需要关注开发,运维人员只需要关注部署,比如要做服务器迁移,重新部署和调试这样的工作就可以省去了 - 在新的服务器上启动需要的容器就可以了。

安装 Docker

Docker 官网的文档非常详细。打开菜单第一栏“Install”,根据你当前使用的桌面系统选择对应的版本:如果使用 Max OS X,就选择“Installation on Mac OS X”;如果使用 Ubuntu,就先打开“Linux”子菜单,再选择“Installation on Ubuntu”。也可以选择直接安装 Docker 的二进制文件“Installation from binaries”。

这时候可能会显示对你选择的系统的要求。比如选择“Ubuntu”,会提示支持如下版本的 Ubuntu:

Ubuntu Xenial 16.04 (LTS)
Ubuntu Wily 15.10
Ubuntu xenial 14.04 (LTS)
Ubuntu Precise 12.04 (LTS)

如果你使用的系统不在上述列表中,不代表不能正常使用 Docker,只是如果出现问题可能不会得到官方的修复支持,所以笔者建议升级到它要求的版本范围。

对于 Max OS X,按照官方文档进行,然后点击“Docker Quickstart Terminal”选项就可以进入 Docker Shell。它会进行一系列的初始化,最后会提示:

docker is configured to use the default machine with IP 192.168.99.100
For help getting started, check out the docs at https://docs.docker.com

上面提到的 192.168.99.100 是 Docker 创建的虚拟机的 IP,之后访问应用其实都是在请求这个 IP。如果忘记了也可以通过如下命令获得:

> docker-machine ip
192.168.99.100

如果看到类似如下的输出就说明 Docker 安装成功了:

$docker--version
Docker version 1.11.2, build b9f10c9

下载镜像

在 Docker 中镜像称为 Image。为了节省读者的时间,笔者已经上传了基于 Ubuntu:16.04 LTS 的镜像。

1.dongweiming/web_develop:dev:dev 标签包含了基本环境,比如使用 aliyun 的源,安装 Python、Git、IPython、net-tools 等软件,克隆本书源码,添加用户 ubuntu 并默认使用 ubuntu 这个用户等。所做的全部前期工作都可以参考项目下的 Dockerfile 文件。这个版本适合从零开始跟着笔者一起完成每一节例子的读者。

2.dongweiming/web_develop:也就是默认的 latest 标签,它可以直接运行绝大多数应用和例子。这个版本会经常更新,适合有一定基础,想直接看到运行效果或者会跳跃着看书的读者。

执行如下命令会自动下载镜像:

> docker pull dongweiming/web_develop:dev

Docker 会查看镜像是否已经加载到 Docker 主机上,如果没有,它就会从镜像仓库 Docker Hub 下载这个镜像。下载完成后可以看到类似如下的镜像列表:

> docker images
REPOSITORY                 TAG       IMAGE ID        CREATED           SIZE
dongweiming/web_develop    dev       43fb02d9c1a3    2 weeks ago       292.2 MB
dongweiming/web_develop    latest    5895e8d64924    34 seconds ago    6.075 GB

要进入容器应该使用如下命令:

> docker run--name web_dev-it-p 9000:9000-p 3141:3141-p 5000:5000 dongweiming/
     web_develop/bin/zsh

这个命令有如下含义:

  • --name 指定了容器的名字为 web_dev,如果不指定,将由系统随机取一个名字。
  • -p 可以显式地暴露特定端口,比如 9000:9000,就表示 web_dev 这个容器里面的 9000 端口可以通过 192.168.99.100:9000 访问。
  • /bin/zsh 是登录容器的默认 Shell。

进入容器后,默认使用 ubuntu 这个用户,并切换到/home/ubuntu/web_develop 目录下。

从容器退出之后,容器就关闭了,重新登录容器的方法如下:

> docker start web_dev #启动容器
web_dev
> docker attach web_dev #要回车 2 次

Docker 虚拟机端口转发

之前提到,在 Docker 环境中访问应用需要使用 http://192.168.99.100:PORT 这个地址,由于 Vagrant 做了端口转发,直接在宿主机上访问 http://127.0.0.1:PORT 即可。那么,可不可以统一呢?当然可以。

首先获得 Docker 虚拟机的名字:

> docker-machine inspect|grep MachineName
         "MachineName":"default",

Docker 虚拟机的名字是 default。通过如下的 Shell 命令即可添加本机与容器的端口镜像:

> for port in 3141 5000 9000
do
VBoxManage controlvm"default"natpf1"tcp-port$port,tcp,127.0.0.1,$port,,$port";echo
    $port
done

VBoxManage 是 Virtualbox 提供的命令行管理工具,通过它能完成很多用 GUI 不能实现的工作。现在已经可以用 http://127.0.0.1:PORT 这样的地址访问了。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。