Docker 有两个核心概念需要理清以下,镜像和容器。镜像的英文名称是 image,镜像是一个抽象的服务,镜像一旦构建之后就不能改变,但是可以重新构建,镜像有版本控制。可以使用 docker images 命令查看所有的镜像。而容器的英文名称是 container,是镜像的实例,是具体运行的服务,也就是一个镜像运行一次就产生一个容器。容器可以将当前的状态打包成一个新的镜像,使用 docker ps -a 可以查看所有的容器。
举一个面向对象编程的例子,镜像就是一个类,而容器就是这个类的某一个实例,镜像是容器的模版,是静态的,而容器是运行时动态的。理清这个概念之后,我们就可以着手构建镜像了,而我们部署只需要从这个镜像生成一个新的容器就可以了。
构建镜像
Docker 主要有两种方式构建镜像,一种是从一个镜像开始,手动进行各种操作,然后提交,构建镜像,类似于操作完成后使用 Git 提交构建一个新的镜像。第二种是使用一个构建脚本(Dockerfile)自动打包成新的镜像。这两种方式各有应用场景,第一种适用于自己试验或尝试一些新想法,属于手动型,而第二种则属于自动构建,便于构建自动化 DevOps 及版本控制,文本就介绍使用 Dockerfile 构建镜像的方法。
现在我们以构建一个自己的 PHP 基础环境为例,镜像包含了 Nginx,PHP7 的服务环境,用于快速部署 PHP 应用。
首先,建立一个项目目录,假设为 docker-nginx-php7,此目录作为项目的根目录,因为 Docker 的构建脚本 Dockerfile 是纯文本文件,所以可以使用 git 等版本控制工具进行管理。
第二步创建 Dockerfile 文件,Dockerfile 是 Docker 默认的脚本文件名,也可以指定其他名称,Dockerfile 的官方文档请参考 Dockerfile 文档。Dockerfile 脚本每行一个命令,一般命令用大写字母,后面接命令参数,# 开头的行是注释。下面一步步讲讲主要使用的命令。
FROM centos:7
MAINTAINER wwtg99 <wwtg99@126.com>
第一行 FROM 用于指定基础镜像,就是本镜像是在哪个镜像的基础上修改而来的。一般的操作系统基础镜像 Docker 官方都有提供,我们也可以从自己构建的镜像逐步扩展,构建自己的镜像树。FROM 后面跟的是 <镜像名称>:<版本号>,如果省略冒号及后面的版本号,则默认使用 latest 版本。
第二行 MAINTAINER 是镜像的作者和邮箱。
# Install base library
RUN set -x && \
yum install -y gcc \
gcc-c++ \
autoconf \
automake \
libtool \
wget \
make \
cmake
RUN 命令用于在构建阶段执行程序,这里就是 Bash 脚本,这段安装了一些基本的库(基础镜像非常小,删减了很多不必要的程序)。
# Install library
RUN rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.