Docker从入门到出门


  最近测试NFV时接触了Docker,不禁惊为天人。相比虚拟机,Docker真是太方便了,那么就再来一个入门系列吧^-^。

什么是Docker

  Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在自己电脑上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。

  Docker通常用于如下场景:

  • web应用的自动化打包和发布
  • 自动化测试和持续集成、发布
  • 在服务型环境中部署和调整数据库或其他的后台应用
  • 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境

准备

  Docker系统有两个程序:docker服务端和docker客户端。其中docker服务端是一个服务进程,管理着所有的容器。docker客户端则扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程。大部分情况下,docker服务端和客户端运行在一台机器上。

  Docker的核心是镜像(image),和容器(container)。image 里面是一层层文件系统,叫做 Union FS,可以将几层目录挂载到一起,成为同一个虚拟文件系统。文件系统的目录结构就像普通 linux 的目录结构一样,docker 通过这些文件与宿主机的内核提供了一个 linux 的虚拟环境。每一层文件系统我们叫做一层 layer,联合文件系统可以对每一层文件系统设置三种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但是 docker 镜像中每一层文件系统都是只读的。

  构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层修改,增加了一层文件系统,一层层往上叠加,上层的修改会覆盖底层该位置的可见性,这也很容易理解,就像上层把底层遮住了一样。当你使用的时候,你只会看到一个完全的整体,你不知道里面有几层,也不清楚每一层所做的修改是什么。结构类似这样:

安装Docker

  推荐安装1.10.0以上版本的Docker客户端。可以通过阿里云的镜像仓库下载:docker-enginedocker-ce 或执行以下命令:

curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -

如何使用Docker加速器

  在伟大的GWF下,访问官方Docker网站速度感人,针对Docker客户端版本大于1.10的用户,可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["your own url"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

搜索Docker镜像

  使用docker最简单的方式莫过于从现有的容器镜像开始。Docker官方网站专门有一个页面来存储所有可用的镜像,网址是:https://hub.docker.com。你可以通过浏览这个网页来查找你想要使用的镜像,或者使用命令行的工具来检索。

  就像这样:

下载Docker镜像

  下载镜像的命令非常简单,使用docker pull命令即可。(docker命令和git有许多类似的地方,如果你会git,那么上手会很快)。在docker的镜像索引网站上面,镜像都是按照用户名/镜像名的方式来存储的。有一组比较特殊的镜像,比如ubuntu这类基础镜像,经过官方的验证,值得信任,可以直接用镜像名来检索到。

  能看到主流的应用/系统都有镜像,都有10M+的PULL量。那么现在把我之前做的镜像ixjx/ping 下载下来。(PS:务必使用加速器)

在容器中运行hello world

  docker容器可以理解为在沙盒中运行的进程,类似于虚拟机。这个沙盒包含了该进程运行所必须的资源,包括文件系统、系统类库、shell 环境等等。但这个沙盒默认是不会运行任何程序的。你需要在沙盒中运行一个进程来启动某一个容器。这个进程是该容器的唯一进程,所以当该进程结束的时候,容器也会完全的停止。

  老规矩,先来一个hello world:(–rm是为了在container结束时自动删除)

在容器中安装新的程序

  下一步要做的事情是在容器里面安装一个简单的程序(ping)。之前下载的镜像是基于ubuntu的,所以你可以使用ubuntu的apt-get命令来安装ping程序:apt-get install -y ping

备注:apt-get 命令执行完毕之后,容器就会停止,但对容器的改动不会丢失。

  另外在执行apt-get 命令的时候,要带上-y参数。如果不指定-y参数的话,apt-get命令会进入交互模式,需要用户输入命令来进行确认,但在docker环境中是无法响应这种交互的。(除非进入docker run -i -t /bash/bin模式)

  当你对某一个容器做了修改之后(通过在容器中运行某一个命令),可以把对容器的修改保存下来,这样下次可以从保存后的最新状态运行该容器。docker中保存状态的过程称之为committing,它保存的新旧状态之间的区别,从而产生一个新的版本。

  首先使用docker ps -l命令获得安装完ping命令之后容器的id,然后把这个镜像保存为ixjx/pingtest。(是不是和git一样?)   

  执行完docker commit命令之后,会返回新版本镜像的id号。

运行新的镜像

  ok,到现在为止,你已经建立了一个完整的、自成体系的docker环境,并且安装了ping命令在里面。它可以在任何支持docker环境的系统中运行啦!

  一定要使用新的镜像名learn/pingtest来运行ping命令。(最开始下载的镜像中是没有ping命令的)

  以上操作都是在CentOS7下完成,Docker目前也有for Windows版本,不过推荐在ubuntu下安装,因为docker是在ubuntu下面开发的,安装包测试比较充分,可以保证软件包的可用性。

  到此,入门阶段完毕。Docker原理、架构、常用命令这些就可以出门到官网或者社区去看,网上docker资料也多如牛毛。