docker系列四使用Dockerfile创建镜像

前面都是通过镜像仓库进行拉取别人构建好的镜像进行操作,所以这次我们进行编写dockerfile进行自定义构建镜像。

什么是Dockerfile

docker中最常见的创建镜像方式就是使用Dockerfile。Dockerfile是docker镜像的描述文件,包含着一条条的指令,每一条指令构建一层,所以每一条指令的内容就是描述该层是如何被构建的。

dockerfile示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#基于centos镜像
FROM centos

#维护人信息
MAINTAINER the centos project <*@qq.com>

#安装httpd软件包
RUN yum -y update
RUN yum -y install httpd

#复制网站首页文件到镜像web站点下
COPY index.html /var/www/html/index.htm

#复制脚本到镜像中并修改权限
ADD run.sh /run.sh
RUN chmod 775 /run.sh

#开启80端口
EXPOSE 80

#当容器启动时执行的命令
CMD ["/run.sh"]

从上面的文档可以看出dockerfile结构大概可以分为4部分:

  1. 基础镜像信息
  2. 维护者信息
  3. 镜像操作指令
  4. 容器启动时执行的指令

Dockerfile每行支持一条指令,每条指令可带多个参数,支持使用以#号开头的注释。下面会对上面使用到的一些常用指令做一些介绍。

dockerfile中的基本命令

FROM

指定新构建的镜像是基于哪个基础镜像

1
FROM centos:6

MAINTAINER

指明镜像维护者以及联系方式

1
MAINTAINER XXX <XXX@hotmail.com>

USER

为RUN CMD ENTRYPOINT执行shell命令指定运行用户

1
2
3
USER <user>[:<usergroup>]
USER <UID>[:<UID>]
USER XXX

RUN

构建镜像时运行的shell命令

1
2
RUN ["yum","-y","install","httpd"]
RUN yum -y install httpd

ADD

拷贝文件或者目录到镜像中,如果是url或者压缩包,则会自动下载或者自动解压

1
2
3
ADD <src> <dest>
ADD html.tar.gz /var/www/html
ADD https://xxx.com/html.tar.gz /var/www/html

COPY

拷贝文件或者目录到镜像中,用法跟ADD一样,只不过不支持自动下载或者解压

1
COPY ./start.sh /start.sh

WORKDIR

为RUN、CMD、ENTRYPOINT以及COPY和AND设置工作目录

1
WORKDIR /data

VOLUME

指定容器挂载点到宿主机自动生成的目录或者其他容器,一般不会再dockerfile中使用,而是在docker run的时候用-v 数据卷使用

1
VOLUME ["/var/lib/mysql"]

EXPOSE

声明容器运行的服务端口

1
EXPOSE 80 443

CMD

启动容器时执行的shell命令

1
2
3
CMD ["-C", "/start.sh"] 
CMD ["/usr/sbin/sshd", "-D"]
CMD /usr/sbin/sshd -D

ENTRYPOINT

启动容器时执行的Shell命令,同CMD类似,只是由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT指定的程序,如果存在多个ENTRYPOINT指令,仅有最后一个有效

1
2
ENTRYPOINT ["/bin/bash", "-C", "/start.sh"]
ENTRYPOINT /bin/bash -C '/start.sh'

ENV

设置环境变量

1
ENV MYSQL_ROOT_PASSWORD 123456

HEALTHCHECK

告诉docker如何检测容器以检查它是否正常工作,也就是健康检查
–interval=DURATION (default: 30s):每隔多长时间探测一次,默认30秒
– timeout= DURATION (default: 30s):服务响应超时时长,默认30秒
–start-period= DURATION (default: 0s):服务启动多久后开始探测,默认0秒
–retries=N (default: 3):认为检测失败几次为宕机,默认3次
一些返回值的说明:

0:容器成功是健康的,随时可以使用
1:不健康的容器无法正常工作
2:保留不使用此退出代码

1
HEALTHCHECK --interval=5m --timeout=3s --retries=3 CMD curl -f http:/localhost/ ||exit 1

ARG

构建镜像时,指定一些参数

1
2
3
FROM centos:6
ARG user
USER $user

然后我们在构建镜像的时候可以自定义参数user

1
docker build --build-arg user=root Dockerfile .

使用docker build 进行构建镜像

docker build [options] path|url|-

options:
–build-arg=[] :设置镜像创建时的变量;
–cpu-shares :设置 cpu 使用权重;
–cpu-period :限制 CPU CFS周期;
–cpu-quota :限制 CPU CFS配额;
–cpuset-cpus :指定使用的CPU id;
–cpuset-mems :指定使用的内存 id;
–disable-content-trust :忽略校验,默认开启;
-f :指定要使用的Dockerfile路径;
–force-rm :设置镜像过程中删除中间容器;
–isolation :使用容器隔离技术;
–label=[] :设置镜像使用的元数据;
-m :设置内存最大值;
–memory-swap :设置Swap的最大值为内存+swap,”-1”表示不限swap;
–no-cache :创建镜像的过程不使用缓存;
–pull :尝试去更新镜像的新版本;
–quiet, -q :安静模式,成功后只输出镜像 ID;
–rm :设置镜像成功后删除中间容器;
–shm-size :设置/dev/shm的大小,默认值是64M;
–ulimit :Ulimit配置。
–tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
–network: 默认 default。在构建期间设置RUN指令的网络模式

实例

使用当前目录的 Dockerfile 创建镜像,标签为 runoob/ubuntu:v1。

1
docker build -t runoob/ubuntu:v1 .

使用URL github.com/creack/docker-firefox 的 Dockerfile 创建镜像。

1
docker build github.com/creack/docker-firefox

也可以通过 -f Dockerfile 文件的位置:

1
docker build -f /path/to/a/Dockerfile .

将镜像传输到仓库

将本地的镜像推送到仓库中
docker push [registry-url/]namespace/img[:tag]


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 337455685@qq.com

文章标题:docker系列四使用Dockerfile创建镜像

文章字数:1.4k

本文作者:wjy

发布时间:2020-01-28, 18:12:34

最后更新:2020-02-17, 17:12:13

原始链接:https://chengnj.github.io/docker/2020/docker4/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏