Docker 科普
  • Docker 是什么

    好吧这样的问题我也不知道怎么回答的好. 因为我并没有一个深刻的理解. 简单说 Docker 其实就是一个基于 LXC 的高级容器引擎, 可以做到 OS 级别的虚拟化, 我们可以用它来隔离资源, 用起来就好像在用虚拟机一样.

    比如你现在想在 Ubuntu 里跑一个 memcached, 同时在 CentOS 里跑一个 redis. 如果用虚拟机怎么办呢, 比如你在 Mac 下, 先装一个 VirtualBox, 然后下俩镜像, 一个 Ubuntu, 一个 CentOS, 然后创建俩虚拟机, 做好各种配置, 俩镜像分别安装系统, 进去了再装 memcached 和 redis, 嗯终于可以跑了. 这时候发现内存用掉了好几个 G 了…

    如果用 Docker 怎么玩呢? 从 docker-repository pull 俩 image 下来, 然后用这俩 image 创建俩 container, 然后 container 启动, 搞定. 咦内存? 内存什么的资源一点不多, memcached 和 redis 用多少就用多少, 并没有什么额外开销(非常小).

  • 安装 Docker

    其实可以直接参考 Docker 官方给出的文档. 我是用 Mac 的所以直接使用了 boot2docker. 首先得装 VirtualBox, 因为 Docker 是基于 LXC 的, 得有一个 Linux 系统才行, 所以 Mac 上的 Docker 相当于是运行在虚拟机里.

    安装好之后可以去看看 Docker 的新手文档, 有一些比较基本的用法.

  • Docker 的一些简单介绍

    • image

      这是你希望在 Docker 里用的 OS 环境. 是 Ubuntu, CentOS, 还是 ArchLinux, 都随便你. 可以自己从镜像文件制作, 也可以从 Docker 官方的 repository 里下载别人分享的. 当然我们在天朝使用最好自己搭一个, 比如用 docker-registry. 天朝的网络环境你懂的…

    • container

      这是我们使用中最重要的东西, 实际上我们就是在用他了. 构建一个 container 的方法很简单, 从一个 image 开始. 如果看完了新手引导, 我们可以这样:

      bash $ docker pull ubuntu $ docker run ubuntu apt-get install redis-server $ docker ps -l ID IMAGE COMMAND CREATED STATUS PORTS 6982a9948422 ubuntu:12.04 apt-get install redis 1 minute ago Exit 0 $ docker commit 6982a redis-ubuntu effb66b31edb $ docker run redis-ubuntu redis-server

      上面我们基于官网 repository 的 ubuntu 镜像, 自己做了一些改变, 安装了一个 redis 在镜像里, 同时创建了一个新的镜像, 叫做 redis-ubuntu, 这个镜像有 ubuntu 的所有内容, 同时还有 redis. 之后我们运行这个镜像里的 redis, 这样就新建了一个容器, 可以通过 docker ps 看到正在运行的容器.

      不过这样其实有挺多的问题的, 每一步都是交互式的, 根本没办法自动化运维啊!

      patpat, Docker 的开发者们当然不会让你这么玩他们… 于是就有了这个东西:

    • Docker file

      Docker file 类似一个配置文件, 我们可以在里面写每一步需要 Docker 做什么, 然后 Docker 就会顺序执行下来了. 比如这么一个 Docker file:

      ``` FROM ubuntu

      RUN apt-get update RUN apt-get install redis-server

      CMD redis-server EXPOSE 6379 ```

      上面这个的意思大概就是说, 我们从 ubuntu 镜像开始构建, 首先运行一下 apt-get update 升级依赖关系, 然后运行 apt-get install redis-server 这样装一个 redis. 然后运行 redis, 最后不要忘记把 redis 的端口暴露给外面环境. 这样外部可以通过他来连接 redis.

      bash $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d4dfb59035dd rds:latest /bin/sh -c redis-ser 13 days ago Up 2 hours 0.0.0.0:49156->6379/tcp elegant_carson $ redis-cli -p 49156 127.0.0.1:49156> set 'a' 1 OK 127.0.0.1:49156> get 'a' 1 127.0.0.1:49156> get 'a'

      我们用 docker ps 看到映射出来的端口, 就可以用了. 看, 一切正常吧.

    • 剩下就是一些基本的命令了

      比如给一个容器打个 tag 啦, 省得一串不知道是 sha1 还是 md5 的字符串看瞎狗眼什么的… 还有查看一个容器的各种信息啦, 把镜像push出去分享给别人啦之类的. 另外 Docker 他支持一些类似 git 的操作, 比如容器更新的时候只会更新有diff的部分, 并不会全部更新, 这样的操作非常的迅速和轻量级, 让 Docker 用起来很舒心.

      Docker 需要操作系统支持 aufs, 实际上的内容都是在 aufs 里的. 我用的 boot2docker, ssh 登录进去可以在 /var/lib/docker/aufs 下看到所有容器的哈希值, 进去就可以看到, 这里面其实就是一个完整的操作系统的根目录. 实际运行数据也都在这里面了, 所以外界也可以直接改这里.

好吧 iOS 的推送出了点问题, 我得看看去了… 下次再科普多一点…