Docker

0. 对docker的理解

docker是一个容器,里面装载了一个完整的操作系统环境,这一点它类似于一个虚拟机。然而docker又不是虚拟机,它比虚拟机要轻量级的多。从技术上讲,docker使用的是命名空间技术,而非传统的虚拟化技术。有一点可以看出两者之间的差别:你可以在一个windows系统上使用虚拟机运行一个Linux操作系统;但是使用docker技术只能在Linux上运行Linux操作系统环境。也正式因为这样,docker消耗的资源要少的多,运行效率也更高。

1. 安装

按照官方网站的指令,在Linux上安装docker需要执行以下命令:

curl https://get.docker.com/ | sh

这个命令可以被分成两部分:一是下载docker安装脚本,二是执行这个安装脚本。对于网络不是很稳定的我来说,喜欢把这个过程分开:

curl https://get.docker.com/ > install_docker.sh
chmod +x install_docker.sh
./install_docker.sh

这样我们还可以看下这个脚本中到底是什么内容。想知道?自己去试试吧!

安装好之后就可以使用docker命令了。docker会在后台启动一个服务,所有docker命令都会请求docker服务来完成相应的请求。需要注意的是docker命令一般都需要root权限,因此要使用sudo docker xxx。在确保docker服务已经启动后就可以用docker命令运行第一个程序了:

sudo docker run hello-world

在这个命令中,hello-world是一个docker镜像。由于本地不存在这个镜像,docker会自动从dockerhub上下载hello-world这个镜像并运行。其他常见的docker命令有:

sudo docker images  		#列出当前本地的所有镜像
sudo docker ps	    		#查看当前所有正在运行的docker进程
sudo docker stop xxxx		#停止一个docker进程,其中xxxx为进程container号,可以通过sudo docker ps获得

2. Dockerhub

dockerhub是docker官方的镜像存储站点,其中提供了很多常用的镜像供用户下载,如ubuntu, centos等系统镜像。通过dockerhub用户也可以发布自己的docker镜像,为此用户需要注册一个账号,在网站上创建一个docker仓库。

然后在命令行登录:

sudo docker login

根据提示输入用户名和密码就可以登录dockerhub,登录之后就可以下载自己的docker镜像了:

sudo docker pull username/image_name

用户还可以将自己制作的镜像上传。上传之前首先要做tag:

sudo docker tag image_id docker.io/username/image_name
sudo docker push username/image_name

其中image_id是要上传的镜像id,可以通过sudo docker images获得。

3. 使用第三方docker仓库

除了docker官方的镜像仓库之外,还有很多第三方的docker镜像下载站点。国内的docker镜像站点有:DockerPool阿里云,对于国内用户来说,这些站点的速度要快很多。当然,你也可以架设自己的docker镜像站点。对于非官方的docker镜像站点,使用如下的命令下载镜像:

sudo docker pull registry_url/image_name

上面的命令从registry_url镜像服务器下载名为image_name的镜像。需要注意的是,docker默认使用https连接。因此如果镜像服务器仅提供http连接的话就不能下载。要解决这个问题,需要修改docker的默认配置,在/etc/default/docker中,修改DOCKER_OPTS=”–insecure-registry your-url”,指定在连接名为your-url的服务器时使用http连接。本人亲测,此方法在ubuntu14.04上有效,但是很遗憾在ubuntu15.04上无效。

然后重启docker服务就可以了:

sudo service docker stop && service docker start

4. 制作一个镜像

制作docker镜像要从Dockerfile说起。程序猿们都知道Makefile,它是用来告诉make程序怎样编译源码树的。Dockerfile是一样的道理,用户首先要在Dockerfile中定义一系列的命令,来告诉docker如何生成docker镜像。

制作方法:首先创建一个工作目录,例如tmp。在tmp目录下创建Dockerfile文件。编辑Dockerfile文件,加入制作docker镜像的命令,然后执行以下命令生成docker镜像:

sudo docker build -t "title_for_this_image" .

其中”-t”参数指明了生成的docker镜像的名称。

4.1. Dockerfile命令

Dockerfile中必须有一条FROM命令,指明基于哪个image制作次docker镜像,这个基准的image可以是一个基本的操作系统,例如ubuntu。其他的常用的Dockerfile命令如下:

FROM ubuntu			#指明基本docker镜像
ADD  files dir			#添加文件到镜像中的dir目录
COPY files dir			#添加文件到镜像中的dir目录
WORKDIR    dir			#指明此image的工作目录,一般相对目录都是以WORKDIR为基准的
RUN	command			#执行一条命令,常用于向系统中安装程序,例如RUN apt-get update && apt-get install -y xxx
ENTRYPOINT ["cmd", "arg1",...]	#设置image入口程序,启动此image自动启动入口程序

需要注意的是RUN命令后面执行的程序不能是交互式的,因此在执行apt-get install时必须加-y参数,让apt-get对所有需要用户输入的地方输入’y’。如果要执行交互式程序,必须使用其他办法使其无需用户输入。例如执行adduser命令需要用户密码和一些确认信息,可以将这些信息实现写好到一个文件input中,然后添加如下命令:

RUN adduser < input

至于ADD命令和COPY命令有什么差别,不好意思,我也不知道o(╯□╰)o

Dockerfile命令详解请参阅:https://docs.docker.com/reference/builder/

5. 运行

使用如下命令一个docker程序:

sudo docker run image_name command_line

其中image_name是一个docker镜像的名称,可以通过docker images查看当前自己拥有的镜像。command_line是命令行,包括命令和参数。

如果要运行很多命令可以借助bash程序运行一段脚本:

sudo docker run "/bin/bash" -c "command1; command2; ..."

5.1. 端口映射

如果你的docker程序提供网络服务,你可能需要做端口映射,因为每个docker镜像程序使用的都是虚拟出来的NAT内网环境。假设docker镜像程序要在80端口上提供web服务,我们需要使用-p参数做端口映射:

sudo docker run -p 8080:80 "httpd"

这时我们使用8080端口就可以访问到docker镜像提供的web服务。

5.2. 后台运行

使用-d参数可以让docker镜像程序在后台运行:

sudo docker run -d "commandline"

6. 镜像导入导出

除了docker镜像站点这种高大上的image共享方式外,还有一种共享docker image的方式,那就是docker image的导入和导出,这有点类似于用U盘拷贝来传播文件。

6.1. 导出

导出可以基于镜像,也可以基于容器。镜像就是我们上面一直所说的docker image,而容器是指镜像运行起来时的样子。简单的说使用docker images看到的是镜像,使用docker ps看到的是容器。对于同一个镜像来说导出镜像和导出容器其结果可能不同。镜像是有历史版本,因此导出镜像是带有历史版本的,而容器只是镜像某一个版本的运行状态,因此是不带历史版本的。但这并不代表着导出镜像一定会产生更大的文件,这是因为容器在运行的过程中会产生数据,这些新产生的数据在导出的时候也会被写入文件。导出镜像和导出容器使用的是不同的命令。

导出镜像:

sudo docker save image_id > file_name.tar

导出容器:

sudo docker export container_id > file_name.tar

6.2. 导入

sudo docker import file_name.tar image_name

最后

Docker云是一种在云端运行docker的服务。实际上是一种PaaS云服务,但是目前有一个更响亮的名字叫CaaS(Container-as-a-Service)。国内有一家叫灵雀云的网站提供此类服务,并且有免费试用账号哦。