它依赖于 LXC(Linux Container),能从网络上获得配置好的 Linux 镜像,非常容易在隔离的系统中运行自己的应用。也因为它的底层核心是个 LXC,所以在 Mac OS X 下需要在 VirtualBox 中跑一个精小的 LXC(这里是一个 Tiny Core Linux,完全在内存中运行,个头只约 24MB,启动时间小于 5 秒的 boot2docker) 虚拟机,构建在 VirtualBox 中。以后的通信过程就是 docker --> boot2docker --> container,端口或磁盘映射也是遵照这一关系。

理解了上面的关系,开始说说 Docker 安装过程

1. 安装 VirtualBox, 不多讲, 因要在它当中创建一个 boot2docker-vm 虚拟机

2. 安装 boot2docker

brew install boot2docker

你也可以手工安装

curl https://raw.github.com/steeve/boot2docker/master/boot2docker > boot2docker; chmod +x boot2docker; sudo mv boot2docker /usr/local/bin

3. 安装 Docker

brew install docker

也可手工安装

curl -o docker http://get.docker.io/builds/Darwin/x86_64/docker-latest; chmod +x docker; sudo cp docker /usr/local/bin

4. 配置 Docker 客户端

export DOCKER_HOST=tcp://127.0.0.1:4243

把它写到 ~/.bash_profile 中,如果你是用的 bash 的话。我工作在 fish 下,所以在 ~/.config/fish/config.fish 中加了 set -x DOCKER_HOST tcp://127.0.0.1:4243

5. boot2docker 初始化与启动

boot2docker init

完成后就能在 VirtualBox 中看到一个叫做 boot2docker-vm 的虚拟机,以后只需用 boot2docker 命令来控制这个虚拟机的行为,启动,停止等。

boot2docker up

启动,boot2docker-vm 虚拟机,我们能在 VirtualBox 中看到该虚拟机变成 Running 状态

直接执行 boot2docker 可以看到可用的参数

Usage /usr/local/bin/boot2docker {init|start|up|save|pause|stop|restart|status|info|delete|ssh|download}

6. 启动 Docker 守护进程

sudo docker -d

这时可执行

boot2docker ssh,输入密码  tcuser 进到该虚拟机的控制台下,如果要用户名的话请输入 docker

上面看到 Mac 启动了 4243 端口,在 boot2docker 虚拟机中也有 4243 端口,并在 /var/run/docker.sock 上监听。借此回顾下 docker 的通信过程,dock 命令是与 Docker daemon 在  Mac 上开启的  4243 端口通信,该端口映射到 boot2docker 的  4243 端口上,进而通过 /var/run/docker.sock 与其中的容器进行通信。

所以在执行  docker version 时如果没有启动 Docker daemon 会提示

2014/05/16 06:52:48 Cannot connect to the Docker daemon. Is 'docker -d' running on this host?

如果没有启动 boot2docker 会得到提示

Get http:///var/run/docker.sock/v1.11/version: dial unix /var/run/docker.sock: no such file or directory

Mac OS X -- boot2docker -- container 三者之间的关系,这张图很好的说明了

图片来自:http://tech.uc.cn/?p=2726


上面  boot2docker, docker 都准备就绪了, 现在开始进入 dock  的操作了,有关于 docker 的命令可以参看这里 http://blog.tankywoo.com/docker/2014/05/08/docker-4-summary.html

1. 下载镜像,并加载启动容器

docker images    #现在没有一个镜像
docker pull learn/tutorial     #我们把这个拉下来试验,可用 docker search ubuntu 找到所有与 ubuntu 有关的镜像
docker run -i -t  learn/tutorial  #加载镜像 learn/tutorial 并进到 shell 下,这样就直接连接到该容器中,退出后容器也退了
docker ps     #在另一个终端中用这个命令,可以看到运行实例,即容器

现在我们在容器的控制台上 oot@95903c1a2bf7:/#,可以安装一个 apche2, curl 并启动 apache2,来测试下

root@95903c1a2bf7:/# apt-get update
root@95903c1a2bf7:/# apt-get install apache2 curl
root@95903c1a2bf7:/# apachectl start
root@95903c1a2bf7:/# curl http://localhost
<html><body><h1>It works!</h1>
<p>This is the default web page for this server.</p>
<p>The web server software is running but no content has been added, yet.</p>
</body></html>

Apache2 正常启动了,在容器内可访问。但现在还无法从 Mac OS X 上对该 apache 服务进行访问,这需要端口映射,有两种方式。不过在端口映射之前还需保存下镜像的修改。

2. 保存镜像

如果前面用 docker run -i -t learn/tutorial 运行的镜像

在运行该镜像的容器中安装了软件,需要把新的内容保存到该镜像中去,否则下次启动该镜像又恢复成原样

uqiu@localhost ~> docker ps -l
CONTAINER ID        IMAGE                   COMMAND             CREATED             STATUS              PORTS               NAMES
95903c1a2bf7        learn/tutorial:latest   /bin/bash           6 minutes ago       Up 5 minutes        80/tcp              thirsty_colden

看到容器的 ID,然后执行

docker commit 95903c1a2bf7 learn/tutorial:latest  #把当前容器的修改提交到镜像 learn/tutorial  中去

以后再次运行该镜像就有了最新安装的内容了。

2. 端口映射

比如我们现在要做的映射关系是 Mac OS X(50080) --> boot2docker(40080) --> container(80),如下图:

图片修改自:http://tech.uc.cn/?p=2726

可以有两种办法

1)

boot2docker ssh -L 50080:localhost:40080  #这条命令可以在  boot2docker-vm  运行时执行,建立多个不同的映射就是执行多次

docker run -i -t -p 40080:80 learn/tutorial
root@c79b5070a972:/# apachectl start

然后在 Mac 的浏览器中打开 http://localhost:50080

2)

VBoxManage modifyvm "boot2docker-vm" --natpf1 "tcp-port_50080:80,tcp,,50080,,40080"

docker run -i -t -p 40080:80 learn/tutorial
root@c79b5070a972:/# apachectl start

这是直接修改了  boot2docker-vm 的配置,可以在 VirtualBox 中看到这条配置,配置 nat 命令见 http://www.virtualbox.org/manual/ch06.html#natforward. 也能建立许多的端口映射

还能直接在这里编辑端口映射关系


Docker  的世界很精彩,其他内容基本就是怎么用好 Docker 命令,如管理镜像,容器,创建自己的镜像; Docker 有三种运行命令的方式,短暂方式,交互方式,daemon方式; 使用 ssh 来管理容器等等。

在 Mac 下使用 Docker 除了可用 boot2docker 作为 LXC,还有个替代品 VAGRANT 。

参考:

1. 利用Docker构建开发环境
2. Docker学习笔记之一,搭建一个JAVA Tomcat运行环境
3. Installing Docker on Mac OS X
4. https://github.com/boot2docker/boot2docker
5. Docker 快速入门

Mac OS X 下安装使用 Docker的更多相关文章

  1. Mac OS X 下安装使用 Docker (2017年7月)

    两年前的一篇 Mac OS X 下安装使用 Docker 安装时还是用的 boot2docker, 如今进化到了在 Mac OS X 下用 Docker Toolbox, 而且命令也由 boot2do ...

  2. 在Mac OS X下安装Android Studio

    在Mac OS X下安装Android Studio只需要几步. 1. 下载Android Studio安装包(.dmg). 2. 打开Terminal输入java -version命令查看是否已安装 ...

  3. 在Mac OS环境下安装MySQL服务

    在Mac OS环境下安装MySQL服务 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我之前介绍过window环境下安装mysql服务,以及在Linux环境下安装mysql服务,今 ...

  4. 在MAC OS X下安装usb转串口驱动(PL2303主控芯片)

    本文原创于http://www.cnblogs.com/humaoxiao,非法转载者请自重!       因为最近手里有一块STM32Discovery开发板,所以想搞一下STM32的开发,我前面的 ...

  5. Mac OS X 下安装python的MySQLdb模块

    参考资料: mac os x下python安装MySQLdb模块   http://www.codeif.com/post/1073/ MAC OSX使用Python安装模块有关问题  http:// ...

  6. 如何在MAC OS X下安装配置java开发工具

    简介: Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征.Java语言作为静态面向对象编程语 ...

  7. mac OS X下安装Redis及Thinkphp3.1使用Redis

    一.安装Redis 1.安装Homebrew 在终端输入ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/install/maste ...

  8. Mac OS 环境下 安装 Asp.Net及使用Yeoman 创建Asp.Net 项目

    本文是按照英文原文:Installing ASP.NET 5 On Mac OS安装时遇到的问题的总结Blog. 原文提示如下: Installing ASP.NET 5 On Mac OS XBy ...

  9. Mac OS X下安装Vue脚手架(vue-cli)

    前言 Vue作为前端三大框架(Angular,React,Vue)之一,号称是最简单,最容易上手的框架,同时也是行内的大趋势,还可以用来开发最火的小程序.具有开发快,双向数据流等特点,有些人认为Vue ...

随机推荐

  1. Oracle自学笔记(一)

    1.创建用户并指定表空间 create user gy_3004 identified by gy_3004 default tablespace gy_3004_data temporary tab ...

  2. js判断当前移到浏览器版本

     navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i) 

  3. Java Exceptions

    invalid end header( bad central directory size) 异常描述 java.util.zip.ZipException: invalid END header ...

  4. java struts2入门学习--OGNL语言常用符号和常用标签学习

    一.OGNL常用符号(接上一篇文章): 1.#号 1)<s:property value="#request.username"/> 作用于struts2的域对象,而不 ...

  5. Weex开发之路(1):开发环境搭建

    一.Weex介绍 Weex是阿里巴巴在2016年6月份对外开源的一款移动端跨平台的移动开发工具,Weex的出现让我们的应用既有了Native的性能和H5的动态性,只要通过前端JS语法就能写出同时兼容i ...

  6. LNMP分离式部署实例[转]

    很多人在练习部署LNMP环境的时候,大都数是部署在同一个虚拟机上面的.但是实际工作中,我们一般都是分离部署的. 今天我就用3台虚拟机,部署下LNMP环境.以供参考! 网络拓扑图: 首先准备3台虚拟机: ...

  7. linux下网络配置小节[from 老男孩的linux运维笔记]

    对于linux高手看似简单的网络配置问题,也许要说出所以然来也并不轻松,因此仍然有太多的初学者徘徊在门外就不奇怪了, 这里,老男孩老师花了一些时间总结了这个文档小结,也还不够完善,欢迎大家补充,交流. ...

  8. [think]关于个人发展值得记住的一些建议 听别人的话,即使你不想听 不要只做不想 成功不能被复制,但失败总在不停复制。看看别人是怎么倒下的,你可以更早地成功

    [think]关于个人发展值得记住的一些建议 偶然看到一篇采访周爱民的文章,里面的一些建议虽然朴实无华,却感觉很有道理,特此记录: 记者:对于程序员的技术发展和职业规划能否给大家一些建议呢?----- ...

  9. 利用hadoop来解决“单表关联”的问题

    已知 child parent a b a c d b d c b e b f c g c h x g x h m x m n o x o n 则 c 2+c+g 2+c+h 1+a+c 1+d+c ...

  10. FluentValidation:C#后端输入验证框架的官方文档解读

    参照 FluentValidation 的官方文档写的例子,方便日后查看和使用. 原文:https://github.com/JeremySkinner/FluentValidation/wiki H ...