docker系列四使用Dockerfile创建镜像
前面都是通过镜像仓库进行拉取别人构建好的镜像进行操作,所以这次我们进行编写dockerfile进行自定义构建镜像。
什么是Dockerfile
docker中最常见的创建镜像方式就是使用Dockerfile。Dockerfile是docker镜像的描述文件,包含着一条条的指令,每一条指令构建一层,所以每一条指令的内容就是描述该层是如何被构建的。
dockerfile示例
1 | #基于centos镜像 |
从上面的文档可以看出dockerfile结构大概可以分为4部分:
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时执行的指令
Dockerfile每行支持一条指令,每条指令可带多个参数,支持使用以#号开头的注释。下面会对上面使用到的一些常用指令做一些介绍。
dockerfile中的基本命令
FROM
指定新构建的镜像是基于哪个基础镜像
1 | FROM centos:6 |
MAINTAINER
指明镜像维护者以及联系方式
1 | MAINTAINER XXX <XXX@hotmail.com> |
USER
为RUN CMD ENTRYPOINT执行shell命令指定运行用户
1 | USER <user>[:<usergroup>] |
RUN
构建镜像时运行的shell命令
1 | RUN ["yum","-y","install","httpd"] |
ADD
拷贝文件或者目录到镜像中,如果是url或者压缩包,则会自动下载或者自动解压
1 | ADD <src> <dest> |
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 | CMD ["-C", "/start.sh"] |
ENTRYPOINT
启动容器时执行的Shell命令,同CMD类似,只是由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT指定的程序,如果存在多个ENTRYPOINT指令,仅有最后一个有效
1 | 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 | FROM centos:6 |
然后我们在构建镜像的时候可以自定义参数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" 转载请保留原文链接及作者。