在 OS X 上使用 Docker

在虚拟化技术盛行的当下,Docker 是其中的一支新兴力量。在使用 Linux 系统时,安装和使用 Docker 是十分容易的。但如果你和许多极客一样使用 OS X 作为你的主力开发系统呢?我们在这里讨论两种可能的解决方案,使用 boot2docker 或者通过 Linux 虚拟机间接使用它。

首先,我们以一个基于 Go 语言的 HTTP 服务器为简单的例子,并在容器中运行这个服务器。我已经提前准备好了一个示例程序 bitbucket.org/ariya/docker-hellogo 让你可以直接在接下来的教程中使用它。在终端中使用以下的代码来获取示例程序:

git clone https://bitbucket.org/ariya/docker-hellogo.git
cd docker-hellogo

下面是仓库中的 Dockerfile (简化过的)内容:

FROM centos:centos6
ADD . /src
RUN yum -y install golang
EXPOSE  8200
CMD ["go", "run", "/src/serve.go"]

Dockerfile 中将 CentOS 6 设置为基础镜像,安装 Go,并在最后开放了 8200 端口(稍后HTTP 服务器将工作在这个端口上)。最后一行的 CMD 命令指定了容器在执行时需要执行的操作,即运行我们提到的 HTTP 服务器。

sudo docker build -t hellogo .

行末的 . 指代当前路径(例如 Git 检出到本地的位置),并构建了叫做 hellogo 的镜像。要注意的是,如果 CentOS 6 在本地不可用,上述的指令将会从网上获取 CentOS 6 的基础镜像。

一旦构建的过程完成,想要运行这个镜像只需要简单的使用如下指令:

sudo docker run -p 8200:8200 -t hellogo

其中的参数项 -p 8200:8200 指定了转发的端口。打开你的浏览器并跳转到 http://localhost:8200/,你就能看到著名的 “Hello World!” 这条消息哦!

对那些使用 OS X 系统的用户来说,我们幸运的找到了至少两个可能的方法来实现以上的这些步骤,而不需要创建一个 Linux 虚拟机并在虚拟机中运行这些教程。

第一个选择是使用 boot2docker 软件,这是一个专门用于运行 Docker 的超级轻量化的 Linux 发行版本。一旦 boot2docker 安装 好之后,初始化他的过程如下(注意到第二行指令用于确保端口转发的正常工作):

boot2docker init
vboxmanage modifyvm boot2docker-vm --natpf1 "http,tcp,127.0.0.1,8200,,8200"
boot2docker up
export DOCKER_HOST=tcp://localhost:4243

这就大功告成了!现在你可以直接像我们在上文的教程中(跳到 sudo 部分)那样运行 docker builddocker run 了。非常的直接,不是吗?

第二个选择是使用一个 运行 Linux 的虚拟机,然后在虚拟机中使用 Docker。尽管这里额外引进了一个层级并因此导致了一些额外的开销,但在很多情况下这个方法都能很好的工作。显然,手动创建一个虚拟机在当下不是什么寻常的操作。我们可以使用 VagrantVirtualBox 这些工具来帮助你完成这一步。

为了说明这一点,在我们提供的 git 仓库中有一个 Vagrantfile 文件:

VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.network "forwarded_port", guest: 8200, host: 8200
  config.vm.provision "shell",
    inline: "apt-get -y update && apt-get -y install docker.io"
end

这个虚拟机基于最新的 Ubuntu 14.04可靠性声明)(译者注:上述代码现在运行时可能会使用新版的 Ubuntu 16.04)。这一配置脚本非常简单,它的工作就是安装 Docker。同样注意到对端口 8200 开启了转发。执行接下来这条指令来初始化虚拟机:

vagrant up

等候一两分钟后,虚拟机就应该已经准备好了。你可以运行 VirtualBox 来验证它。如果没有遇到任何问题,我们就可以连接到虚拟机了:

vagrant ssh

在这个 ssh 会话中,你可以像上文中一样执行 docker builddocker run。因为 8200 端口已经被正确地转发,你可以在 OS X (宿主系统)上使用浏览器(如 Safari) 访问 http://localhost:8200 来看看运行结果。

通过这些实践操作,你可以感受到虚拟化技术的力量。你的 OS X 机器上运行着一个基于 VirtualBox 的 Ubuntu 14.04 虚拟机。然后,在 Ubuntu 系统内,又有着一个运行着 CentOS 6.5 的容器。一个简单的基于 Go 语言的 HTTP 服务器正运行在这个容器内容。这一切很好玩,不是吗?

最后,最新发布的 Vagrant 1.6 发行版 作为一名新的 服务供应商 向 Docker 提供了官方支持。我还没有尝试过,但如果你在使用官方的 Docker 供应商时能进一步简化了工作流程,请一定要和我们分享它。

在容器中拥有整个世界吧!

本文的版权归 Weston Wu 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

如何在macOS上监听单个应用HTTPS流量

写在前面的话 如果你准备对网络协议进行逆向分析或进行任何与网络安全有关的活动时,可能是为了了解协议运行机制,也有可能是为了查找敏感信息,你或多或少都需要收集一定...

2215
来自专栏程序猿DD

使用 kubeadm 创建一个 kubernetes 集群

? 简介 kubeadm是一个 kubernetes官方提供的快速安装和初始化拥有最佳实践(best practice)的 kubernetes集群的工具,虽...

4028
来自专栏北京马哥教育

如何用几个简单的命令改善你的Linux安全

在最开始,我们需要问的一个问题是:Linux是已经足够被安全加固了吗?答案当然是否定的。那些娴熟的攻击者所带来的危险是与日俱增的。每天、甚至是每小时都有新的漏洞...

885
来自专栏北京马哥教育

Linux的10个最危险的命令

Linux命令行佷有用、很高效,也很有趣,但有时候也很危险,尤其是在你不确定你自己在正在做什么时候。

822
来自专栏noteless

eclipse svn插件卸载 重新安装 Subclipse卸载安装 The project was not built since its build path is incomplete T

使用的是eclipse kepler版本,崩溃了,想要重新安装,主要遇到了下面这几种问题

653
来自专栏FreeBuf

让木马病毒DNS数据传输成为历史:看我如何让XShell病毒失效

基础词汇解释: DnsA记录传输: 利用dns解析过程,在请求解析的域名中包含需外传的数据,如xxxxxx.hack.com。则最终hack.com的dns服务...

2167
来自专栏张戈的专栏

libmemcached编译安装报错解决记录

我负责的几个公司内部网站,仅集成了 php 原生 memcache 组件,不支持 memcached 分片存储的自动容灾方案,近期出现过几例因 memcache...

3619
来自专栏Petrichor的专栏

git: 四种git协议 (本地协议、HTTP 协议、SSH协议、 Git 协议)

到目前为止,你应该已经有办法使用 Git 来完成日常工作。 然而,为了使用 Git 协作功能,你还需要有远程的 Git 仓库。 尽管在技术上你可以从个人仓库进行...

991
来自专栏Laoqi's Linux运维专列

Ansible 搭建与配置(Ⅰ)

1444
来自专栏二进制文集

Git 30分钟简明教程

1991年,Linus创建了开源的Linux,世界各地的志愿者为Linux编写代码,但是绝大多数的内核维护工作,都花费在提交补丁和保存档案的繁琐事务上。这期间所...

563

扫码关注云+社区