定制自己的Docker镜像

好的剧本是一部好电影的出发点,这次我们来当一回编剧。——编程三分钟

概述

演员表:Nginx容器、一个只会说hello worldhtml文件。

剧本:一个名为Dockerfile的文件,记录了修改、安装、构建、操作的整个过程,我们将会用这个脚本来构建、定制镜像。

场景:docker环境。

演员表

一号演员index.html出场并对大家说了一句Hello World

<h1>Hello World</h1>

二号演员nginx:alpine,他是一个现成的docker镜像,我们熟知的nginx:latest是他的小弟弟,他比弟弟厉害的地方有三个:

  1. 用的是最新版nginx镜像,功能与nginx:latest一模一样。

  2. alpine镜像用的是Alpine Linux内核,比ubuntu内核要小很多。

  3. nginx:alpine默认支持http2

剧本

一部电影成功的最主要原因是有一个很好的故事,让我们来看看剧本。

创建一个Dockerfile文件,一般分为四个部分:基础镜像信息,维护者信息,镜像操作指令和容器启动时执行指令。内容如下

# 基础镜像信息

FROM nginx:alpine

#
 维护者信息

MAINTAINER docker_user [email protected]

#
 镜像操作指令

COPY . /usr/share/nginx/html

RUN echo hello
  • FROMnginx:alpine的Docker镜像创建一个图层。

  • MAINTAINER标记镜像维护人信息。

  • 镜像操作指令 :

  1. COPY 把当前目录的文件复制到/usr/share/nginx/html,至于为什么是这个目录是因为官网镜像就是以这个目录作为静态网站部署目录。

  2. 格式RUN RUN ["executable", "param1", "param2"];前者将在shell终端中运行命令,即/bin/sh -c,后者则使用exec执行,推荐使用。

  • 容器启动时执行指令: CMD命令,用法和RUN一样,用来指定运行容器时的操作命令,因为我们是基于nginx镜像来制作我们的镜像,相当于加了一个壳,此处nginx镜像里已经自己写了启动方式,所以我们就不用再写一次了。

拍戏

剧本写完以后,在Dockerfile所在文件夹路径下执行命令:docker build --tag name:tag .,就可以按照描述构建一个镜像了。name是镜像的名称,tag是镜像的版本或者是标签号,不写就是lastest。注意后面有一个空格和点。

# 用法

docker build [选项]  路径

打镜像

$ docker build -t webserver-image:v1 .

Sending build context to Docker daemon 3.072kB

Step 1/4 : FROM nginx:alpine

 ---> bfba26ca350c

Step 2/4 : MAINTAINER docker_user [email protected]

 ---> Using cache

 ---> a8b84ca6d5a1

Step 3/4 : COPY . /usr/share/nginx/html

 ---> b25123c06e56

Step 4/4 : RUN echo hello

 ---> Running in 7c86a7bca405

hello

Removing intermediate container 7c86a7bca405

 ---> 55bcba5b3ab9

Successfully built 55bcba5b3ab9

Successfully tagged webserver-image:v1

使用docker images命令查看镜像

$ docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

webserver-image v1 55bcba5b3ab9 44 seconds ago 20.5MB

nginx alpine bfba26ca350c 2 weeks ago 20.5MB

指定webserver-image:v1镜像,-d后台运行容器,并镜像的80端口映射到本地的80端口。

$ docker run -d -p 80:80 webserver-image:v1

fe5dd3369f7766cf078c4049cad1c99fc444cac56752d2a1393b64fd46e43c4d

查看运行效果

$ curl 0.0.0.0:80

<h1>Hello World</h1>


图片

其他

学过git的都知道,.gitignore文件可以忽略追踪,docker也有类似的文件,名为.dockerignore,例如在此文件内写入以下忽略的文件和文件夹内容

.git/
logs


猜你喜欢

转载自blog.51cto.com/15076235/2608329