将虚拟开发环境从CentOS迁移到CoreOS+Docker+CentOS
我之前一直在MacOS/Ubuntu上使用Vagrant虚拟化CentOS进行开发,但是我发现虚拟化的CentOS并不紧凑,可移植性非常低。为了使用与生产环境相同的操作系统,将CentOS在Ubuntu上运行也是无用的。
我最近决定开始使用备受关注的Docker进行虚拟化,并迁移至容器化虚拟环境。一旦Docker更加稳定,我也想尝试将其应用到生产环境中。
主页- Docker: Linux 容器引擎
https://www.docker.io/
由于这篇帖子可能会很长,所以我会分几次发布。在本篇帖子中,我将介绍如何在虚拟环境中构建CoreOS并确认Docker的运行。
在Ubuntu上,Docker可以本地运行,但是在Mac上呢?
由于Docker最初是基于LXC实现容器虚拟化的(目前不再依赖LXC驱动程序),因此它支持Ubuntu,但是在Mac上自然没有LXC等虚拟化功能。
想要在Mac上最简单地搭建Docker开发环境,最快捷的方法是使用boot2docker这个基于TinyCoreLinux的虚拟环境,但是无法共享主机机器的文件夹是个问题。
通过boot2docker来使用boot2docker
http://boot2docker.io/
因此,我们决定使用CoreOS作为Linux发行版。CoreOS的核心操作系统功能非常小,并且专为在Docker中提供应用程序而设计。它还提供了Vagrantfile,以便从Vagrant中轻松使用。由于可以使用NFS进行文件夹共享,因此还可以在本地的SublimeText中编辑的源代码进行调试(实际上,为了持久化数据,需要单独创建一个容器来存储应用程序)。
CoreOS是面向大规模服务器部署的Linux系统。网址:https://coreos.com/
使用Mac创建CoreOS虚拟环境
要在Mac上使用CoreOS的虚拟环境,最快捷的方法是使用Vagrant。安装方法按照文档进行,但是Vagrantfile中的config.vm.synced_folder的描述被注释掉了,通过取消注释,即可启用文件夹共享功能。
Vagrant – CoreOS
https://coreos.com/docs/running-coreos/platforms/vagrant/
Vagrant – CoreOS
https://coreos.com/docs/running-coreos/platforms/vagrant/
...
# Uncomment below to enable NFS for sharing the host machine into the coreos-vagrant VM.
config.vm.synced_folder ".", "/home/core/share", id: "core", :nfs => true, :mount_options => ['nolock,vers=3,udp']
...
当执行vagrant up命令时,您需要输入登录用户的密码来允许从Mac进行NFS挂载。
安装Mac的命令行界面
一旦CoreOS启动后,您就可以使用Docker了。要从Mac上操作Docker,您可以运行vagrant ssh命令通过SSH在虚拟环境上进行操作,或者直接在Mac上安装Docker客户端来操作。
如果尚未安装,请在安装之前先安装以下内容。
-
Xcode
MacAppStoreからインストール
Homebrew
ruby -e “$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)”
截至2014年5月9日,Docker的版本为0.11,但CoreOS中集成的Docker版本为0.10,因此如果直接运行会提示“版本不一致”而无法执行。所以,在用Homebrew安装之前,需要先指定版本。
$ brew versions docker
0.11.1 git checkout eefa235 Library/Formula/docker.rb
0.11.0 git checkout f4560d2 Library/Formula/docker.rb
0.10.0 git checkout c26c37d Library/Formula/docker.rb
0.9.1 git checkout 6bd6532 Library/Formula/docker.rb
0.9.0 git checkout a90b40e Library/Formula/docker.rb
0.8.1 git checkout 4ee0389 Library/Formula/docker.rb
0.8.0 git checkout 9880ace Library/Formula/docker.rb
$ cd /usr/local
$ git checkout c26c37d Library/Formula/docker.rb
$ brew install docker
这样就完成了安装,但是默认情况下,Docker命令会引用本地已安装的Docker,请指定CoreOS的IP地址作为连接目标。
$ docker info
2014/05/09 17:50:54 dial unix /var/run/docker.sock: no such file or directory
$ docker -H tcp://172.17.8.101:4243 info
Containers: 0
Images: 0
Storage Driver: btrfs
Execution Driver: native-0.1
Kernel Version: 3.14.1+
因为每次都指定也很麻烦,所以我认为可以将以下内容添加到.bash_profile文件中。通过在环境变量DOCKER_HOST中指定连接目标,我们就不再需要每次都指定。
export DOCKER_HOST=tcp://172.17.8.101:4243
确认Docker是否可运行。
接下来,我们将验证Docker是否正常工作。我们将使用一个简单的CentOS容器来启动shell。
$ docker run -i -t centos /bin/sh
sh-4.1# cat /etc/redhat-release
CentOS release 6.5 (Final)
您心动了吗?一旦退出,容器就会停止。通过在docker start中指定容器ID,您可以再次启动一次创建的容器。
sh-4.1# exit
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
454fc16a6edc centos:centos6 /bin/sh 11 minutes ago Exited (0) 3 seconds ago sad_torvalds
$ docker start -i 454fc16a6edc
sad_torvalds
sh-4.1#
接下来的是第2部。
首先,我們簡要地進行了導入前的準備,省略了許多說明,但如果您參考官方文件等可以了解詳細的架構。下次我們將整理關於構建容器的Dockerfile的要點。