Technology and experience learned from THE DOCKER BOOK 5

列出镜像

docker images

Technology and experience learned from THE DOCKER BOOK 5

查找镜像

docker search ubuntu

我们可以通过该命令来查找所有Docker Hub上公共可用镜像

Technology and experience learned from THE DOCKER BOOK 5

构建镜像

推荐使用Dockerfile方法来代替docker commit是因为前者构建镜像更具备可重复性、透明性以及幂等性。
一旦有了Dockerfile,我们可以使用用docker build命令基于该Dockerfile中的指令构建一个新的镜像。

创建一个示例仓库

Technology and experience learned from THE DOCKER BOOK 5

我们创建了一个名为static_web的目录来保存Dockerfile,这个目录就是我们的构建环境,Docker则称此环境为上下文 或者构建上下文。Docker会在构建镜像时将构建上下文和该上下文的文件和目录上传到Docker守护进程。这样Docker守护进程就能直接访问用户想在镜像中存储的任何代码、文件或者其他数据。

第一个Dockerfile

# Version:0.0.1
FROM ubuntu:14.04
MAINTAINER ZHOUJIAWEI "1084186870@qq.com"
RUN apt-get update && apt-get install -y nginx
RUN echo 'hi,i am your container' \
    >/user/share/nginx/html/index.html
EXPOSE 80

Technology and experience learned from THE DOCKER BOOK 5

该Dockerfile由一系列指令和参数组成。每条指令,如FROM,都必须为大写字母,且后面要跟随一个参数:FROM ubuntu:14.04Dockerfile 中的指令会按照顺序从上到下执行,所以应该根据需要合理安排指令的顺序。
每条指令都会创建一个新的镜像层并对镜像进行提交。Docker大体上按照如下流程执行Dokcerfile中的指令。

  • Docker从基础镜像运行一个容器
  • 执行一条指令,对容器进行修改。
  • 执行类似docker commit 的操作,提交一个新的镜像层。
  • Docker再基于刚提交的镜像运行一个新容器。
  • 执行Dockerfile中的下一条指令,直到所有指令都执行完毕。
    从上面也可以看出,如果用户的Dockerfile由于某些愿意(某条指令失败)没有正常结束,那么用户将得到一个可以使用的镜像。这对调试非常有帮助:可以基于该镜像运行一个具备交互功能的容器,使用最后创建的镜像对为什么用户的指令会失败进行调试。
    Dockerfile也支持注释。以#开头的行都会被认为是注释,我们的代码中的第一个就是注释的例子。
    每个Dockerfile的第一条指令必须是FROMFROM指令指定一个已经存在的镜像,后续指令都将基于该镜像进行,这个镜像被称为基础镜像。

在前面的Dockerfile示例里,我们指定了ubuntu:14.04作为新镜像的基础镜像。基于这个Docerfile构建的新镜像将以Ubuntu14.04操作系统为基础。在运行一个容器时,必须要指明是基于哪个基础镜像再进行构建。
接着我们指定了MAINTAINER指令,这条指令会告诉Docker该镜像的作者是谁,以及作者的电子邮件地址。这有助于标识镜像的所有者和联系方式。
再这些指令之后,我们指定了两条RUN指令。RUN指令会在当前镜像中运行指定的命令。在这个例子里,我们通过RUN指令更新了已经安装的apt仓库,安装了nginx包,之后创建了 /usr/share/nginx/html/index.html文件,该文件有一些简单的示例文本,像前面说的那样子,每条RUN命令都会创建一个新的镜像层,如果该指令执行成功,就会将此镜像层提交,之后继续执行Dockerfile中的下一条指令。
默认情况下,RUN指令会在shell里使用命令包装器/bin/sh -c来执行,如果是在一个不支持shell的平台上运行或者不希望在shell中运行(比如避免shell字符串篡改),也可以使用exec格式的RUN指令,如:

RUN [ "apt-get"," install ","-y" ,"nginx" ]

在这种方式中,我们使用一个数组来指定要运行的命令和传递给该命令的每个参数。
接着设置了EXPOSE指令,这条指令告诉Docker该容器内的应用程序将会使用容器的指定端口。者并不意味着可以字段访问任意容器运行服务中的端口(这里的例子是80)。出于安全的考虑,Docker并不会自动打开该端口,而是需要用户在使用Docker run 运行容器时来指定需要打开哪些端口。可以指定多个EXPOSE指令来向外部公开多个端口。EXPOSE指令也可以来将多个容器连接。docker run 命令通过 –expose选项来指定对外部公开的端口。

本作品采用《CC 协议》,转载必须注明作者和本文链接
chowjiawei
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!