还在使用虚拟机?30分钟教你快速入门Docker( 五 )


1. 构建第一个 Dockerfile 文件
现在,我们继续实战 。这里,我们把一开始搭建的 Web 服务器构建一个镜像 。首先,我们需要创建一个空的 Dokcerfile 文件 。
mkdir dockerfile_testcd dockerfile_test/touch Dockerfilenano Dockerfile紧接着,我们需要编写一个 Dockerfile 文件,代码清单如下
FROM centos:7MAINTAINER LiangGzone "lianggzone@163.com"RUN rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpmRUN yum install -y nginxEXPOSE 80最后,我们通过 docker build 命令进行构建 。
docker build -t="lianggzone/nginx_demo:v1" .现在,我们来通过 docker images 看下我们的新镜像吧 。

还在使用虚拟机?30分钟教你快速入门Docker

文章插图
 
2. 理解 Dockerfile 全过程
哇,我们通过编写一个 Dockerfile 文件顺利构建了一个新的镜像 。这个过程简单得让人无法相信 。现在,让我们来理解一下这个全过程吧 。首先,FROM centos:7 是 Dockerfile 必须要的第一步,它会从一个已经存在的镜像运行一个容器,换句话说,Docker 需要依赖于一个基础镜像进行构建 。这里,我们指定 centos 作为基础镜像,它的版本是 7 (CentOS 7) 。然后,我们通过 MAINTAINERLiangGzone"lianggzone@163.com" 指定该镜像的作者是 LiangGzone,邮箱是 lianggzone@163.com 。这有助于告诉使用者它的作者和联系方式 。接着,我们执行两个 RUN 指令进行 Nginx 的下载安装,最后通过 EXPOSE80 暴露 Dokcer 容器的 80 端口 。注意的是,Docker 的执行顺序是从上而下执行的,所以我们要明确整个流程的执行顺序 。除此之外,Docker 在执行每个指令之后都会创建一个新的镜像层并且进行提交 。
我们使用 docker build 命令进行构建,指定 -t 告诉 Docker 镜像的名称和版本 。注意的是,如果没有指定任何标签,Docker 将会自动为镜像设置一个 lastest 标签 。还有一点,我们最后还有一个 . 是为了让 Docker 到当前本地目录去寻找 Dockerfile 文件 。注意的是,Docker 会在每一步构建都会将结果提交为镜像,然后将之前的镜像层看作缓存,因此我们重新构建类似的镜像层时会直接复用之前的镜像 。如果我们需要跳过,可以使用 --no-cache 选项告诉 Docker 不进行缓存 。
3. Dockerfile 指令详解
【还在使用虚拟机?30分钟教你快速入门Docker】Dockerfile 提供了非常多的指令 。笔者这里特别整理了一份清单,建议收藏查看 。
 
还在使用虚拟机?30分钟教你快速入门Docker

文章插图
 
 
指令辨别一:RUN、CMD、ENTRYPOINT
RUN 、 CMD 、 ENTRYPOINT 三个指令的用途非常相识,不同在于,RUN 指令是在容器被构建时运行的命令,而 CMD 、 ENTRYPOINT 是启动容器时执行 shell 命令,而 RUN 会被 docker run 命令覆盖,但是 ENTRYPOINT 不会被覆盖 。事实上,docker run 命令指定的任何参数都会被当作参数再次传递给 ENTRYPOINT 指令 。CMD 、 ENTRYPOINT 两个指令之间也可以一起使用 。例如,我们 可以使用 ENTRYPOINT 的 exec 形式设置固定的默认命令和参数,然后使用任一形式的 CMD 来设置可能更改的其他默认值 。
FROM ubuntuENTRYPOINT ["top", "-b"]CMD ["-c"]指令辨别二:ADD、COPY
ADD 、 COPY 指令用法一样,唯一不同的是 ADD 支持将归档文件(tar, gzip, bzip2, etc)做提取和解压操作 。注意的是,COPY 指令需要复制的目录一定要放在 Dockerfile 文件的同级目录下 。
4. 将镜像推送到远程仓库
远程仓库:Docker Hub
镜像构建完毕之后,我们可以将它上传到 Docker Hub 上面 。首先,我们需要通过 docker login 保证我们已经登录了 。紧接着,我们使用 docker push 命令进行推送 。
docker push lianggzone/nginx_demo:v1这里,我们了解下它的使用,格式是 docker push[OPTIONS]NAME[:TAG],其中,笔者设置 NAME 是 lianggzone/nginx_demo,TAG 是 v1 。(笔者注:推送 Docker Hub 速度很慢,耐心等待) 最后,上传完成后访问:https://hub.docker.com/u/lianggzone/,如图所示 。
还在使用虚拟机?30分钟教你快速入门Docker

文章插图
 
远程仓库:阿里云
同时,我们也可以使用国内的仓库,比如阿里云 。首先,在终端中输入访问凭证,登录 Registry 实例 。如果你不知道是哪个,可以访问 https://cr.console.aliyun.com/cn-hangzhou/instances/credentials 。
docker login --username=帐号 registry.cn-hangzhou.aliyuncs.com现在,将镜像推送到阿里云镜像仓库 。其中,docker tag[IMAGE_ID]registry.cn-hangzhou.aliyuncs.com/[命名空间]/[镜像名称]:[版本] 和 docker push registry.cn-hangzhou.aliyuncs.com/[命名空间]/[镜像名称]:[版本] 命令的使用如下所示 。


推荐阅读