Docker 初探

Docker 与 Vagrant

Docker 和 Vagrant 是近期两个应用场景最像的计算机虚拟化技术了吧。Stackoverflow 上有一个问题是问在什么场景下应该用 Vagrant,什么场景
下应该使用 Docker,而 Vagrant 和 Docker 的作者也都出来争论了,有兴趣的可以去看看大牛是怎么撕逼的。

Docker 将 Git 版本管理的概念与 Linux 上 Container 的概念融合在一起,而 Vagrant 则是将 Git 版本管理的概念与虚拟机的概念融合在一起。

Docker 架构

Vagrant 架构

下面是我自己画的 Vagrant 架构,其实也是在虚拟机上抽象出一层类似于 Git 的管理工具。

Vagrant

OS X 下的 Docker

由于 Container 是 Linux 特有的概念,所以想要在 OS X 下玩 Docker,还是需要依赖虚拟机。官网上推荐的配套 Docker 虚拟机叫 boot2docker。可以到官网上按照教程安装。你也可以使用 Vagrant,然后在 Vagrant 中的 Linux 虚拟机中配置安装 Docker,在虚拟机中玩 Docker。

用户在命令行或者 GUI 下与 Docker 交互主要通过与 Docker daemon 对话,Docker daemon 再管理每个 Container。所以在 OS X 上会出现这样的架构:
Image

OS X 下的 Docker 的使用

下面是一些在 Docker 在 OS X 中使用的命令行。

  • 由于依赖于 boot2docker,所以一开始必须要先初始化 boot2docker。
    ```
    $ boot2docker init

$ boot2docker start

$ boot2docker shellinit


- 现在 virtual box 中的 docker 也是安装和初始化好了,直接用即可。  

$ docker run hello-world //开启一个Container,输出hello-world,然后结束Container

$ docker run -d -P —name web nginx //-d参数一直运行,-P参数将Container的端口映射到虚拟机的端口上


- boot2docker和Docker常用状态管理命令。  

$ boot2docker status //查看虚拟机状态

$ docker ps //查看虚拟机中所有的Container

$ docker port web/xxx //查看正在运行的Container的端口号

$ boot2docker ip //查看虚拟机在本机网络中的IP地址


- Docker 可以开启一个 Container,里面再运行一个虚拟机。  

$ docker pull ubuntu //从官方仓库中拉ubantu的镜像

$ docker run -t -i ubuntu /bin/bash //运行ubuntu虚拟机并使用bash,-t表示开启终端,-i表示交互显示

$ docker images //查看本地所有镜像


- 官方提供了一个类似于 Github 的平台叫 [Docker Hub](https://hub.docker.com),可以存储自己的镜像,或者与别人分享镜像。  

$ docker run -t -i training/sinatra /bin/bash //进入从镜像库中拉下来的镜像

gem install json //修改镜像

$ docer commit -m “install json gem” container_id new_contailer_name //确认修改镜像

$ docker images //查看新的修改过的镜像

$ docker tag 91c95931e552 ftandy/hello_sss //为自己的镜像修改别名

$ docker push ftandy/hello_sss //push到自己的账号仓库上


- 分享的话也可以通过本地导出导出镜像文件分享。  

$ docker save -o hello-world.tar hello-world

$ docker load < hello-world.tar


另外想要进阶的话,推荐[这本电子书](http://dockerpool.com/static/books/docker_practice/introduction/README.html),和陈皓的[博客](http://coolshell.cn/articles/17010.html)。里面包含了Docker的方方面面。

### 参考资料

1. http://dockerpool.com/static/books/docker_practice/introduction/README.html  
2. https://www.docker.com/