Docker的安装与运行PHP镜像

由于最近没有工作,只能自己琢磨点新东西让自己开拓眼界。前几天看了点Vagrant量产开发环境的相关文章,感觉蛮不错的,其中介绍了Vagrant与Docker技术区别,Vagrant需要配合虚拟机,而Docker不依赖虚拟机(Windows下需要虚拟机运行Linux环境支持Docker运行),相对于虚拟机比较轻巧,虚拟文件比较比较庞大,移植也比较难,Docker的镜像则比较小,使用方便。刚好本人之前在虚拟机中安装了CentOS,正好可以实验在Linux环境下安装Docker,不过Windows还是需要介绍一下。

1、安装

1.1、Windows安装

这里以Docker Toolbox安装为例,还有一种安装Docker for Windows的方式就不讲了,Docker ToolBox可以到https://get.daocloud.io/toolbox/下载,安装过程跟一般的Windows程序一样,都是下一步,不过需要注意的是,在组件选择列表中列出了软件所带的组件,由于我之前已经安装过Git,所以不再勾选Git for Windows选项,大家需要根据自己的情况选择。

Docker ToolBox安装

Docker TookBox选择组件

安装完成可以在桌面看到一个名为Docker Quikstart快捷方式,可以点这个链接启动Docker,在这里要说一种情况是,由于之前我没有勾选Git for Windows组件,Docker ToolBox在安装完成后生成的快捷入口并没有把bash路径指向我的Git安装目录下的路径,造成了点击运行Docker提示一下对话框,只要浏览选择Git安装目录bin文件夹下的bash.exe文件即可。

安装完成Docker ToolBox

选择Bash文件

选择Bash文件

运行Docker之后,会出现一个bash操作窗口,Docker会首先检查缓存目录下有没有boot2docker.iso文件,没有就会从网络下获取最新稳定版的boot2docker.iso镜像文件,因为这个文件是托管在Github上,不通过科学上网的同学网速可能很慢,下载速度极渣,我也是其中一位T_T。自动下载的速度不能忍受,只能通过手动下载的方式,可以到https://github.com/boot2docker/boot2docker/releases下载最新的稳定版本,不要手动直接下载,可以用迅雷之类的下载软件,其实速度还是可以的。把下载的镜像放到Docker的缓存目录C:\Users\当前用户\.docker\machine\cache中,重新运行Docker就可以绕过下载步骤了,第一次启动Docker环境需要初始化,等待一段时间就可以看到Docker的欢迎画面,虽然是命令行环境,但是LOGO中的小鲸鱼还是蛮可爱的:)。

启动Docker

如果感觉这个bash窗口中操作Docker不是很舒服,可以使用SSH来连接Docker,这里以XShll为例子。新建一个会话设置新连接的属性,选择协议为SSH,主机IP可以在Docker的欢迎信息中找到,端口默认22即可,连接的用户名为docker,密码是tcuser

使用SSH连接Docker

1.2、CentOS 7安装

在CentOS安装Docker的步骤很简单,只需要通过以下国内镜像通道来获取安装脚本并执行即可安装完成。

1
curl -sSL https://get.daocloud.io/docker | sh

处理完成之后,还需要测试一下Docker是否已经安装成功。在命令行中输入docker命令,出现Docker的参数列表,说明已经安装了Docker。

2、运行PHP程序

这里只以CentOS环境下作为例子,在使用Docker之前,linux还需要保证Docker服务正常运行。

可通过以下命令启动Docker服务

1
service docker start

启动Docker服务

Docker的容器是由基于镜像,一个镜像可以运行出多个相互独立的容器,我们可把他看作是面向对象里面的类,一个类可以实例化出多个对象。要想在Docker中运行PHP,前提需要有一个PHP的镜像作为基础。Docker的镜像可以docker pull 镜像拉取地址在线下载,docker默认使用国内的镜像资源,我们可以选择国内的镜像站提供的镜像。

首先到https://hub.daocloud.io/搜索PHP镜像,这里使用的镜像地址是https://hub.daocloud.io/repos/019c8dce-ec80-4468-bddc-254fc62ef5c7,得到的镜像地址是daocloud.io/library/php:5.6.7-cli

输入拉取镜像命令,有点像git pull命令,哈哈

1
docker pull daocloud.io/library/php:5.6.7-cli

拉取Docker镜像

镜像拉取成功

下载镜像的过程比较缓慢,大小大概是400MB左右。下载完成之后,可以通过

1
docker images

查看镜像

来查看现在已有的镜像文件,可以看到刚才下载的镜像文件。

有了镜像就可以运行一个容器,使用以下命令来启动一个以刚才下载的镜像作为基础的容器

1
docker run

运行容器

docker run后边的参数为镜像的ID,ID不用写全,只需写的部分能够与其他镜像做唯一的区分即可,镜像ID的后面是php命令,即相当与在控制台输入PHP的命令一样。

1
> php -v

执行之后,可以看到输出的结果为当前PHP的引擎和版本号。

接下来就是让容器运行PHP文件里的代码,有了刚才容器运行的命令的例子,我们可以新建一个php文件来测试一下

新建一个app.php文件用vim编辑,内容简单描述一下:

1
2
<?php
echo 'Docker PHP Image Test File[Successful!]';

PHP代码

保存之后就可以用以下命令运行

1
docker run 镜像ID php ./app.php

真的是这样么?其实这并不能运行成功,因为当运行容器的时候,容器所处的环境是独立的,跟本地是没有关系,自然app.php文件在容器中无法找到。我们需要编写dockerfile文件来定制一个自己的镜像完成这项工作。dockerfile是用来描述镜像的构建定义,具体的写法和更详细的说明可以在官方文档得到说明。

用vim在本地新建一个dockerfile文件并编辑:

1
2
3
FROM daocloud.io/library/php:5.6.7-cli
ADD app.php index.php
CMD ["php", "./index.php"]

dockerfile内容

以上文件中的内容表达可以简单的理解为以下意思:

  1. FROM 镜像仓库:镜像标签
  2. ADD 要添加到容器中的本地文件 复制到容器以后的文件
  3. CMD [“要执行的命令”, “命令的参数”]

FROM的镜像仓库和标签可以用docker image命令查看,respository为仓库名,tag为标签名,这表明我们需要使用刚才下载的PHP镜像作为我们自定的镜像的基础。使用ADD命令可以把本地编写好的PHP代码文件复制到容器中,文件中是把本地的app.php复制到Docker容器中并且命名为index.php文件,最后的CMD命令是执行php命令来解释代码文件。

编写好了dockerfile文件后,保存,在文件所在处执行构建镜像命令:

1
docker build .

构建Docker镜像

这句命令的意思是以当前目录下的dockerfile构建一个自定义镜像,执行完毕之后,可以使用docker image命令查看到构建成功的镜像文件信息,由于我们没有在构建镜像时指定更多的参数信息,所以镜像的仓库和标签都是空信息,但这并不影响我们测试。

有了镜像就可以运行一个容器了,运行以刚才生成的镜像为基础的容器:

1
docker run 自定义镜像ID

运行容器

我们可以看到PHP文件里的输出代码被输出来了,说明已经成功了。

最后说以下镜像和容器的删除操作,有时候某个容器或者某个镜像不想使用了,可以对其进行删除操作来释放空间,需要注意的是在删除镜像之前确保存在的容器中没有使用到此镜像。我们可以通过以下命令来查看到当前所有的容器(包括运行和未运行状态下的):

1
docker ps -a

查看容器

如果存在使用到了将要被删除镜像的容器,先要把相关的容器删除,才能删除镜像,否则删除失败。

执行删除容器:

1
docker rm 容器ID

容器编号可以通过docker ps -a来查看Container ID,删除容器后,回返回被删除容器的ID。之后执行删除镜像命令:

1
docker rmi 镜像编号

镜像的ID可以通过docker image命令查看Image ID获得,同样删除之后也会返回编号。

删除镜像和容器

结束

以上分别介绍了在Windows和CentOS下安装Docker,文章介绍的内容比较前,其实Docker的功能非常强大,很多知识还需要慢慢啃,本人也是刚入其道,还得继续修炼,此文算是入门级吧T_T。文章开头提到了Vagrant和Docker,过段时间我将与大家一起分享使用Vagrant的心得。