Docker是个新生的事物,概念相似虚拟化。网上关于Docker入门的东西已经不少了。不过本文探讨了Docker的特色、特性、原理,还介绍了具备中国特点的安装测试过程,另外还谈到了Docker的社区生态和Dockerfile,并使用Dockerfile构建一个nginx环境。原文:Docker简介与入门html
在几个月前据说Docker,可是一直没有时间去研究,前一段时间趁着azure免费试用,赶忙实验一下,可是卡在了ubuntu基础镜像的下载上(因为国内网络的特殊缘由),因此也就搁浅了。在逛Segmentfault的时候,看到上面有个Docker子站问答,逛了逛果真有干货,因而从新试了一下,这里把经验和体会分享一下。linux
我以为简单来讲,Docker就是一个应用程序执行容器,相似虚拟机的概念。可是与虚拟化技术的不一样点在于下面几点:nginx
Docker的主要特性以下(摘自Docker:具有一致性的自动化软件部署):git
目前Docker正处在开发阶段,官方不建议用于生产环境。另外,Docker是基于Ubuntu开发的,因此官方推荐将其安装在Ubuntu的操做系统上,目前只能安装在linux系统上。github
Docker官方的安装指导挺详细的。可是因为国内的特殊状况,我这里基于这个安装指导,给出适用于国内开发者的入门过程。基于Ubuntu Precise 12.04 (LTS) (64-bit)
,推荐这个版本,其余版本参考官方安装手册。golang
首先,Docker官方声称最好是运行在Linux内核3.8以上,因此要先进行内核升级web
# install the backported kernel sudo apt-get update sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring # reboot sudo reboot
添加Docker仓库的key:redis
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
添加镜像,这里直接用俄罗斯的Yandexdocker
sudo sh -c "echo deb http://mirror.yandex.ru/mirrors/docker/ docker main > /etc/apt/sources.list.d/docker.list" sudo apt-get update
安装Dockershell
sudo apt-get install lxc-docker
通常上面的步骤不会有任何问题。
Docker运行至少须要一个ubuntu的基础镜像,这个镜像会在你初次尝试执行时自动下载,不过从国内直接用基本上就别想了,须要使用代理。这里用Docker中文社区提供的代理。出处1,出处2。
修改/etc/default/docker
文件,取消注释http_proxy
的部分:
# If you need Docker to use an HTTP proxy, it can also be specified here. export http_proxy=http://192.241.209.203:8384/
通过笔者测试,上面这个代理也不是很稳定,可能用的人比较多吧。
可用的代理地址(持续关注中)
而后,你就能够执行下面的命令,测试执行了,因为代理不是很稳定,可能须要多尝试几回(淡定):
sudo docker run -i -t ubuntu /bin/bash
下面这个截图是我成功pull完成,并测试hello world成功(大概尝试了3-4次):
评估一项开源技术很大程度上须要关注它的社区和生态。Docker的生态是经过推送和拉取特定的“镜像(image)包”来展开的。你能够从docker index上搜索须要的镜像。也能够经过下面的命令搜索:
sudo docker search
镜像能够看做是包含有某些软件的容器系统,好比ubuntu就是一个官方的基础镜像,不少镜像都是基于这个镜像“衍生”,该镜像包含基本的ubuntu系统。再好比,hipache是一个官方的镜像容器,运行后能够支持http和websocket的代理服务,而这个镜像自己又基于ubuntu。
经过pull
来拉取镜像,将镜像下载到本地,好比
sudo docker pull hipache
经过images
查看如今有哪些镜像:
sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu 13.10 9f676bd305a4 6 weeks ago 178 MB ubuntu saucy 9f676bd305a4 6 weeks ago 178 MB ubuntu 13.04 eb601b8965b8 6 weeks ago 166.5 MB ubuntu raring eb601b8965b8 6 weeks ago 166.5 MB ubuntu 12.10 5ac751e8d623 6 weeks ago 161 MB ubuntu quantal 5ac751e8d623 6 weeks ago 161 MB ubuntu 10.04 9cc9ea5ea540 6 weeks ago 180.8 MB ubuntu lucid 9cc9ea5ea540 6 weeks ago 180.8 MB ubuntu 12.04 9cd978db300e 6 weeks ago 204.4 MB ubuntu latest 9cd978db300e 6 weeks ago 204.4 MB ubuntu precise 9cd978db300e 6 weeks ago 204.4 MB
上面的都是镜像,都从属于ubuntu仓库(通常仓库名应该是username/repository
格式,若是是直接以repository
做为仓库名的,是指官方发布的仓库)。咱们拉取ubuntu的时候,其实是把仓库里的镜像都拉下来了。每一个镜像都有一个惟一的IMAGE ID
,和一个易于记忆的TAG
,能够经过IMAGE ID
的前几位或者repository:TAG
来标识一个镜像。
除了pull,镜像也能够经过"编译"获得,这里的"编译"是指一种构建行为,经过手动编写或者从github获取Dockerfile来构建一个镜像。能够把Dockerfile当作是一个脚本,这个脚本会在容器每次启动时执行。通常在Dockerfile里面须要编写基础软件的安装脚本和配置脚本。下面这个Dockerfile是个例子:
# # Ubuntu Dockerfile # # https://github.com/dockerfile/ubuntu # # Pull base image. FROM ubuntu:12.10 # Update OS. RUN echo "deb http://archive.ubuntu.com/ubuntu quantal main universe multiverse" > /etc/apt/sources.list RUN apt-get update RUN apt-get upgrade -y # Install basic packages. RUN apt-get install -y software-properties-common RUN apt-get install -y curl git htop unzip vim wget # Add files. ADD root/.bashrc /root/.bashrc ADD root/.gitconfig /root/.gitconfig ADD root/scripts /root/scripts # Set working directory. ENV HOME /root WORKDIR /root
FROM
指令表示此次构建须要基于ubuntu仓库的12.10这个TAG的镜像,若是本地不存在这个镜像的话,会自动下载镜像。镜像实际上就是编译好的结果。向上面这个Dockerfile,在原始ubuntu的基础上安装了不少经常使用的软件。
docker官方有Dockerfile的教程
首先确保你已经完成上面的安装步骤,并拉取到基础镜像ubuntu:12.10。
如今咱们用上面的Dockerfile来构建这个仓库(上面的Dockerfile其实是github dockerfile项目的基本仓库dockerfile/ubuntu,所下面的命令直接从github下载Dockerfile来构建)
sudo docker build -t="dockerfile/ubuntu" github.com/dockerfile/ubuntu
下面是最后构建成功时的输出:
... Processing triggers for ureadahead ... ---> 0a4392cf8e2d Step 6 : ADD root/.bashrc /root/.bashrc ---> b0e86f348c09 Step 7 : ADD root/.gitconfig /root/.gitconfig ---> e2a9c001d457 Step 8 : ADD root/scripts /root/scripts ---> 678febabdbdc Step 9 : ENV HOME /root ---> Running in c4afef311cf1 ---> eaa3ae3277a8 Step 10 : WORKDIR /root ---> Running in d50c273c75b8 ---> c9ecf5bc3227 Successfully built c9ecf5bc3227 Removing intermediate container 1a3d1f794c49 Removing intermediate container 9f72df8abb63 Removing intermediate container 5694d1e3e77e Removing intermediate container 6a184821f89c Removing intermediate container 8195bd05fc36 Removing intermediate container d50c273c75b8 Removing intermediate container 70de07353ecf Removing intermediate container 73e3f6204613 Removing intermediate container 5dd948415981 Removing intermediate container c4afef311cf1
此时会多出一个仓库:
sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE dockerfile/ubuntu latest c9ecf5bc3227 About a minute ago 294.2 MB ...
如今咱们能够来构建dockerfile/nginx了(固然,从一开始你就能够直接pull
这个镜像)
sudo docker build -t="dockerfile/nginx" github.com/dockerfile/nginx
完成后,会看到编译好的镜像:
sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE dockerfile/nginx latest 68508350c656 About a minute ago 308.3 MB dockerfile/ubuntu latest c9ecf5bc3227 16 minutes ago 294.2 MB ...
如今是时候看到真正的效果了!用下面这个命令运行容器:
sudo docker run -d -p 80:80 dockerfile/nginx
这个命令会以daemon的方式运行容器,经过下面命令查看正在运行的容器:
sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 98c474a7dd6a dockerfile/nginx:latest nginx 6 seconds ago Up 6 seconds 0.0.0.0:80->80/tcp trusting_hawking
访问你主机的80端口,能够看到nginx的欢迎页面了!这时,咱们来看看本机的进程sudo ps -ef
:
root 1428 952 0 15:19 ? 00:00:00 nginx: master process nginx root 1429 417 0 15:19 ? 00:00:00 /sbin/udevd --daemon www-data 1441 1428 0 15:19 ? 00:00:00 nginx: worker process www-data 1442 1428 0 15:19 ? 00:00:00 nginx: worker process www-data 1443 1428 0 15:19 ? 00:00:00 nginx: worker process www-data 1444 1428 0 15:19 ? 00:00:00 nginx: worker process
彷佛有些接近事物的本质了!nginx的进程其实是在本机上的,这意味着,容器中程序的执行仍然是使用本机操做系统的,容器并不本身构建操做系统,而是以某种隔离的方式依赖本机操做系统工做。这就是Docker和虚拟机的本质区别。
你能够像下面这样,将本机的目录映射给这个"nginx容器"。<sites-enabled-dir>
目录下应该有nginx的配置文件片断
docker run -d -p 80:80 -v <sites-enabled-dir>:/etc/nginx/sites-enabled -v <log-dir>:/var/log/nginx dockerfile/nginx
PS:这步笔者没有成功,日志路径是能够map的,可是sites-enable-dir中的配置始终不行。继续诊断中。
能够共享你的镜像和用来构建的Dockfile分享给社区:
总的来讲Docker的核心技术以下:
因为本人才疏学浅,下面给出一些参考资料,有兴趣的朋友能够扩展阅读一下,必定会对Docker有更深入的认识的:
PaaS under the hood, episode 1: kernel namespaces
PaaS Under the Hood, Episode 2: cgroups
PAAS Under the Hood, Episode 3: AUFS
PaaS Under the Hood, Episode 4: GRSEC
PaaS under the hood, episode 5: Distributed routing with Hipache
一些Docker的社区资源: