使用 Dockerfile 定制镜像

Pride & Prejudice

Dockerfile 简介

镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。

Dcokerfile是一个文本文件,由一系列指令和参数构建的脚本,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了 Dockerfile,当我们需要定制自己额外的需求时,只需在 Dockerfile 上添加或者修改指令,重新生成 image 即可,省去了敲命令的麻烦。

Dockerfile 文件格式

Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令、容器启动执行指令。

# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: docker_user
# Command format: Instruction [arguments / command] ..
 
# 1、第一行必须指定 基础镜像信息
FROM ubuntu
 
# 2、维护者信息
MAINTAINER docker_user docker_user@email.com
 
# 3、镜像操作指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
 
# 4、容器启动执行指令
CMD /usr/sbin/nginx

RUN 指令:每执行一条RUN 指令,镜像添加新的一层,并提交
CMD 指令:来指明运行容器时的操作命令

可以使用一个 RUN 指令,并使用 && 将各个所需命令串联起来。Dockerfile 支持 Shell 类的行尾添加 \ 的命令换行方式,以及行首 # 进行注释的格式。

构建镜像

以nginx 镜像为例。在一个空白目录中,建立一个文本文件,并命名为 Dockerfile

$ mkdir mynginx
$ cd mynginx
$ touch Dockerfile

Dockerfile 文件内容为:

FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

在 Dockerfile 文件所在目录执行:(注意命令最后有一个 . 表示当前目录)

docker build -t nginx:v1 .

构建完成之后,使用 docker images 命令查看所有镜像

[root@localhost mynginx]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
nginx                   v1                  2b06b1493d7c        24 seconds ago      109 MB
docker.io/nginx         latest              ae513a47849c        2 weeks ago         109 MB
docker.io/ubuntu        latest              452a96d81c30        3 weeks ago         79.6 MB
docker.io/hello-world   latest              e38bc07ac18e        5 weeks ago         1.85 kB

使用 docker run 命令来启动容器

docker run  --name nginx_v1   -d -p 81:80 nginx:v1

这条命令表示用 nginx:v1 镜像启动一个容器,命名为nginx_v1,并且映射了 81 端口,这样我们可以用浏览器去访问这个 nginx 服务器


容器启动后,需要对容器内的文件进行进一步的完善,可以使用docker exec -it xx bash命令再次进行修改

[root@localhost mynginx]# docker exec -it nginx_v1   bash
root@4277f160cd56:/# echo '<h1>Hello, admin!</h1>' > /usr/share/nginx/html/index.html
root@4277f160cd56:/# exit

修改了容器的文件,也就是改动了容器的存储层,可以通过 docker diff 命令看到具体的改动

docker diff nginx_v1 

其他docker镜像构建用法

docker build 还支持从 URL 构建,比如可以直接从 Git repo 中构建:

docker build https://github.com/twang2218/gitlab-ce-zh.git#:8.14

这行命令指定了构建所需的 Git repo,并且指定默认的 master 分支,构建目录为 /8.14/,然后 Docker 就会自己去 git clone 这个项目、切换到指定分支、并进入到指定目录后开始构建。

用给定的 tar 压缩包构建

$ docker build http://server/context.tar.gz

参考
Dockerfile reference
Docker镜像构建文件Dockerfile及相关命令介绍
使用 Dockerfile 定制镜像
深入Dockerfile(一): 语法指南

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 最近公司项目上线原因,一直加班。没有时间更新文章。隔壁部门需要我提供sdk的打包的支持,所以一直在学习docker...
    若与阅读 556评论 0 8
  • Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件?Google Compute Engi...
    ahohoho阅读 15,850评论 15 147
  • 啊思绪万千感受非凡可是没有一个词能够形容这奇妙感觉是窗外时间已深的阴影感染了天上的日月星辰守不住这单薄的两扇窗索性...
    冬巴拉玲阅读 148评论 0 0
  • 没有人喜欢,奔走墓地却又不得不去活着或死亡在寂寞的土地上种满念想还有忧伤 孩子们不懂肥沃的土壤变成坟冢,为何?活着...
    走在路上的沉默阅读 341评论 6 19
  • 性格急,做事火急火燎,这是对自己的标签,去地铁站坐地铁时候,每班地铁相隔三到五分钟,正下电梯时看到我所坐的班车门打...
    飞起来的艳宝阅读 320评论 1 1

友情链接更多精彩内容