阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

使用 Vagrant 和 Docker 在一个 VM 中进行开发

101次阅读
没有评论

共计 7075 个字符,预计需要花费 18 分钟才能阅读完成。

理由

1. 用 Vagrant 开发很酷 - 一个项目 / 组件一个 VB

2. 用 Vagrant 开发很垃圾 - 缓慢的 Chef/Puppet/Ansible,多个巨大的 VM,遍地重复的软件。

3. Docker 带来独立的仅有一个 VM 的 VM 盒子。

4. CoreOS 内整合了 docker, 产品发布时候会做得很完美。

5.  开发者开心!编码和发布太容易了。

像我,你可以(或不可以)喜欢用 Vagrant 发布。为一个项目存储使用多个 VM 是不可思议的:像 Ansibe 之类的工具意味着你的 VM 将总是反映产品的环境。

假如你是揽活的人或者有许多项目,然而,可能是你有几十个 Vagrant 盒子在你的 dev 文件夹,慢慢吸收上亿磁盘空间。这是 vagrant 垃圾的地方。。。提别是有多个小 SSD 的时候。

进入:Docker. 一个从一个机器上管理容器的开源的工具。为所有我们的来自一个 VM 的项目,我们将使用容器作为“迷你 vagrants”. 我假设你这里用的是 Mac- 我不了解 windows.

让我们投入 docker! 

CentOS 6/ 7 系列安装 Docker http://www.linuxidc.com/Linux/2014-07/104768.htm

Docker 的搭建 Gitlab CI 全过程详解 http://www.linuxidc.com/Linux/2013-12/93537.htm

Docker 安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm

Docker 和一个正常的虚拟机有何区别? http://www.linuxidc.com/Linux/2013-12/93740.htm

在 Docker 中使用 MySQL http://www.linuxidc.com/Linux/2014-01/95354.htm

Docker 将改变所有事情 http://www.linuxidc.com/Linux/2013-12/93998.htm

Docker 安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm

步骤一:设置 CoreOS

我们要使用 CoreOS 和 Vagrant 来安装 Docker,取代 Docker 推荐的 Ubuntu vagrant 文件安装。Screw 的建议。

为什么用 CoreOS?

CoreOS 是一个雄心勃勃的旨在简单、可伸缩服务部署的 linux 发行版。它是轻量级的,并且自带 Docker 的预安装。它的目的是让服务 Docker-based 应用变得容易。这就是为什么选择该 OS(系统)的原因 - 文件体积小、建议的安装方式都值得称赞!所以、我真的想去实测一下它。

Note:CoreOS 在 alpha 中已被创建。这意味着它在 SSH 回话中,可能发生随机重启的现象,但从长远的角度来看,希望是有帮助的。这个是需要注意下的。

安装

你从 CoreOS 的 Github 的仓库中进行安装,CoreOS 团队做了一个非常棒的工作。

你只需要按照下面的要求去做:

  1. 安装 1.3.1 版本以上的 Vagrant 和 4.0 版本以上的 VirtualBox。
    你可以通过 vagrant –version 命令检查你的 vagrant 版本,如果需要下载新的版本可以从 vagrant 的官网上去下载。

  2. 下载已经提供含有你开发使用根目录文件夹的 CoreOS vagrant 文件。在 Vagrant 中会安装 CoreOS。
    vagrant 的文件在这里。

  3. 添加端口转发到 Vagrant 的 web 服务器:
    命令是:config.vm.network :forwarded_port, guest: 80, host: 8080

  4. 需要注意的是默认情况下共享文件夹没有启用:
    可以通过下面的命令开启你 vagrant 文件的共享文件夹:
    config.vm.network “private_network”,
    ip: “10.1.2.3” *config.vm.synced_folder “.”, 
    “/home/core/share”, id: “core”,
    :nfs => true,
    :mount_options => [‘nolock,vers=3,udp’]*
    我们已经修改了 IP 地址,CoreOS 提供了专用网络:他们使用的 IP 地址是在公共地址的范围内(即别人公开的可访问的机器)。整个 10.X.X.X 的 IP 地址段都是私有的,这样的话可以避免冲突。

你可能已经清楚了安装步骤:我们已经创建了一个 vagrant 文件,添加了连接 CoreOS 分布式的 URL,设置了共享文件夹的网络。和其他 Vagrant 的配置步骤相似,只是没有其他的 Chef/Puppet/Ansible。

CoreOS 已经预先安装好了 docker,所以不需要马上做一些配置和软件的安装。

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2014-10/107824p2.htm

第二步: 设置 Docker

Docker 已经安装了, 但是它需要一个“基础图像”来运行。我们所有的容器都将会在这个 OS 中运行。本质上, 是所有项目的 OS 虚拟机。
我们使用 Ubuntu:

> docker pull ubuntu

这下载了所有我们会用到的 ubuntu 基础图像(12.04, 12.10)。让我们来确认一下这个步骤创建了一个新的容器(说明如下):

> docker run -name=”test” -t -i ubuntu /bin/bash

下面我们要做的依次是:

  1. 让 Docker 创建开始并且运行一个新的容器(docker run)

  2. 命名新的容器为“test”(name=”test”).
    这让我们操作容器变得更简单,并且当我们列出容器时,我们就知道哪个是哪个了。

  3. 创建一个违终端,并让其保持打开(-t -i)

  4. 让 ubuntu 成为新容器的基础图像(ubuntu)

  5. 在新容器中运行 /bin/bash.

Docker 需要一个程序来运行一个容器. 更重要的。这包括两层意思: 容器不能脱离程序而运行,    并且当程序结束时容器也将结束. 我们以后将继续讨论这个问题.

你现在在 CoreOS 的一个 Ubuntu 容器中. 一个小型的 Ubuntu 虚拟机就可以用了。

第三步: 创建开发环境

现在我们可以离开 Docker 了. 我们要设置一个基础的 LAMP 堆栈, 这是很容易安装的. 根据你自己的需要调整这个堆栈也是很重要的.

我们将通过命令行来操作容器, 而不是通过 Docker 文件. 这是对 docker 如何工作的介绍.

初始设置

我们已经在 Ubuntu 容器中了。如果不是, 重新运行上面的命令来启动一个 Ubuntu 容器.

Ubuntu 是一个很小的容器. 其中有很多我们需要的东西都没有装. 基本操作如下:

  1. 增加 universe/multiverse 到 apt 源:
    > echo “$(cat /etc/apt/sources.list) universe multiverse” > /etc/apt/sources.list
    这是增加 ‘ universe multiverse’ 到 apt-get 的源列表. 正如之前所说, 这是一个准 Ubuntu 系统的安装,并且在默认时是不具备的.

  2. > apt-get update

  3. 安装 curl, wget, vim, build-essential, git:
    > apt-get install curl wget vim-tiny

我们基本上完成了环境的搭建. 首先, 将这些改变提交给新的 Docker 容器。这样我们就不用每次都这么做了(注: 这也是你使用 Dockerfiles 文件的原因.)

理由

1. 用 Vagrant 开发很酷 - 一个项目 / 组件一个 VB

2. 用 Vagrant 开发很垃圾 - 缓慢的 Chef/Puppet/Ansible,多个巨大的 VM,遍地重复的软件。

3. Docker 带来独立的仅有一个 VM 的 VM 盒子。

4. CoreOS 内整合了 docker, 产品发布时候会做得很完美。

5.  开发者开心!编码和发布太容易了。

像我,你可以(或不可以)喜欢用 Vagrant 发布。为一个项目存储使用多个 VM 是不可思议的:像 Ansibe 之类的工具意味着你的 VM 将总是反映产品的环境。

假如你是揽活的人或者有许多项目,然而,可能是你有几十个 Vagrant 盒子在你的 dev 文件夹,慢慢吸收上亿磁盘空间。这是 vagrant 垃圾的地方。。。提别是有多个小 SSD 的时候。

进入:Docker. 一个从一个机器上管理容器的开源的工具。为所有我们的来自一个 VM 的项目,我们将使用容器作为“迷你 vagrants”. 我假设你这里用的是 Mac- 我不了解 windows.

让我们投入 docker! 

CentOS 6/ 7 系列安装 Docker http://www.linuxidc.com/Linux/2014-07/104768.htm

Docker 的搭建 Gitlab CI 全过程详解 http://www.linuxidc.com/Linux/2013-12/93537.htm

Docker 安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm

Docker 和一个正常的虚拟机有何区别? http://www.linuxidc.com/Linux/2013-12/93740.htm

在 Docker 中使用 MySQL http://www.linuxidc.com/Linux/2014-01/95354.htm

Docker 将改变所有事情 http://www.linuxidc.com/Linux/2013-12/93998.htm

Docker 安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm

步骤一:设置 CoreOS

我们要使用 CoreOS 和 Vagrant 来安装 Docker,取代 Docker 推荐的 Ubuntu vagrant 文件安装。Screw 的建议。

为什么用 CoreOS?

CoreOS 是一个雄心勃勃的旨在简单、可伸缩服务部署的 linux 发行版。它是轻量级的,并且自带 Docker 的预安装。它的目的是让服务 Docker-based 应用变得容易。这就是为什么选择该 OS(系统)的原因 - 文件体积小、建议的安装方式都值得称赞!所以、我真的想去实测一下它。

Note:CoreOS 在 alpha 中已被创建。这意味着它在 SSH 回话中,可能发生随机重启的现象,但从长远的角度来看,希望是有帮助的。这个是需要注意下的。

安装

你从 CoreOS 的 Github 的仓库中进行安装,CoreOS 团队做了一个非常棒的工作。

你只需要按照下面的要求去做:

  1. 安装 1.3.1 版本以上的 Vagrant 和 4.0 版本以上的 VirtualBox。
    你可以通过 vagrant –version 命令检查你的 vagrant 版本,如果需要下载新的版本可以从 vagrant 的官网上去下载。

  2. 下载已经提供含有你开发使用根目录文件夹的 CoreOS vagrant 文件。在 Vagrant 中会安装 CoreOS。
    vagrant 的文件在这里。

  3. 添加端口转发到 Vagrant 的 web 服务器:
    命令是:config.vm.network :forwarded_port, guest: 80, host: 8080

  4. 需要注意的是默认情况下共享文件夹没有启用:
    可以通过下面的命令开启你 vagrant 文件的共享文件夹:
    config.vm.network “private_network”,
    ip: “10.1.2.3” *config.vm.synced_folder “.”, 
    “/home/core/share”, id: “core”,
    :nfs => true,
    :mount_options => [‘nolock,vers=3,udp’]*
    我们已经修改了 IP 地址,CoreOS 提供了专用网络:他们使用的 IP 地址是在公共地址的范围内(即别人公开的可访问的机器)。整个 10.X.X.X 的 IP 地址段都是私有的,这样的话可以避免冲突。

你可能已经清楚了安装步骤:我们已经创建了一个 vagrant 文件,添加了连接 CoreOS 分布式的 URL,设置了共享文件夹的网络。和其他 Vagrant 的配置步骤相似,只是没有其他的 Chef/Puppet/Ansible。

CoreOS 已经预先安装好了 docker,所以不需要马上做一些配置和软件的安装。

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2014-10/107824p2.htm

提交容器

试想想 Docker 当做是 git.  我们已经对 Ubuntu 做了一些修改, 必须承认这减少了我们的工作量.

和 Git 一样, Docker 减少了每个容器的差别,而不是整个系统. 这意味着我们至于要保存我们安装的软件以及我们改变的文件. 多厉害!

  1. 退出 Ubuntu 容器:
    > ctrl-d
    这将使容器消失. 我们用 the/bin/bash 程序开始容器 (> docker run -name=”test” -t -i ubuntu /bin/bash), 并且当这个开始程序结束时这个容器也就消失了.

  2. 列出所有 Docker 容器:
    > docker ps -a
    - a 选项列出了所有的容器.docker ps 列出了运行的容器.

  3. 我们在列表中可以看见自己的容器:

    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    4bf2ba69c69c        ubuntu:12.04        /bin/bash           5 seconds ago       Exit 0                                  test
  4. 提交改变给新的容器:
    > docker commit test custom/base
    我们已经使用 ID 而不是名字写了 docker commit 4bf2b custom/base 来只是我们改变的那个容器.

这创建了一个叫做 custom/base 的新容器,这个新容器保存了所有已经做过的修改. 和 Ubuntu 一样我们可以启动这个容器 docker run […] custom/base. 这就好了.

可以通过键入 docker images 查看可用的容器. 你会看见新的 Ubuntu 图像, 以及新的 custom/base 图像.

这是基础: 创建一个包含部分修改的新容器(用命令行也行, 但最好使用 Docker files 文件), 并且提交和运行.

建立协议栈

我们将安装一个基于我们创建的容器的 LAMP 协议栈. 这不是必须的,安装 Python, ruby, golang 可以由你自己来选择.

首先,用下列步骤来创建一个新的容器:

> docker run -name=”lamp” -t -i custom/base /bin/bash

这个 shell 已经装载了我们刚才修改的那个容器. 再为我们的基础协议栈安装 mysql、apache 和 PHP.

> apt-get install apache2 mysql-server php5 libapache2-mod-php5

厉害. 跳过这些服务的配置,因为其中有很简单的向导. 如果失败了就加入头 Linode Library.

软件安装和配置完成了, 将这些修改提交给新的容器. 按 ctrl- d 回到 CoreOS, 然后按照如下方法提交容器:

> docker commit lamp custom/lamp

运行协议栈并且转发端口

我们已经做到了可以开始使用 Docker 容器这一步. 不过有几个前提条件: 转发端口, 并且是数据库和网络服务可以自动运行.

幸运的, 端口可以通过命令行轻松设置(用 dockerfiles 文件设置更简单):

> docker run -t -i -p 80:80 -p 3306:3306 -v /home/core/vagrant/project:/var/www/project custom/lamp /bin/bash

接下来我们要做:

  1. 再次使用伪 shell 运行容器(-t -i)

  2. 将容器端口 80 和 3306 设置的和 CoreOS 相同的端口 (-p 80:80 -p 3306:3306)

  3. 从 CoreOS 安装一个卷到容器, 同时这个卷也被安装在 Vagrant 上. 这是装在我们机器上的开发文件(-v /from:/to)

现在, 我们可以通过 localhost:8080(由 Vagrant 转发的端口)在容器中运行的网络服务了. 整理一下环境,现在可以开始开发我们的应用了.

从这里开始

你应该熟悉 docker 的高级功能,如提交、运行、图像以及通过向导创建新的工作开发环境。

通过 docker 可以做很多事情. 以下一些你可以参考:

  • 使用 docker 的 supervisord – 需要一个在容器中运行的程序来保持它处于活动状态. Supervisord 是一个可以再前台运行的管理程序. 在 supervisord.conf 文件中设置你的服务并且通过 docker 启动 supervisord 来保持你的容器处于活动状态.

  • 通过 Docker 资料库分享图像

  • 在你的机构里面分享容器和图像. 保持你的开发环境健全, 使开发更简单.

  • docker的数据库管理 – 在 Docker 中数据存储 (storage in general, actually) 是较难管理的. 在 docker 中有一个相关的向导. 更多信息 here,here, and here.

  • 使用 dockerfiles文件 - 这将使你不必手动创建容器.

Docker 的详细介绍:请点这里
Docker 的下载地址:请点这里

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计7075字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中