1.4 基于 dockerfile 构建镜像

1.4 基于 dockerfile 构建镜像

1.4.1 教你如何从零开始写一个 dockerfile

[root@hou ~]# mkdir dockerfile
​
[root@hou~]# cd dockerfile/

把 Centos-vault-8.5.2111.repo 这个 repo 文件传到 dockerfile 目录

[root@hou dockerfile]# vim dockerfile
FROM centos
MAINTAINER hou
RUN rm -rf /etc/yum.repos.d/*
COPY Centos-vault-8.5.2111.repo /etc/yum.repos.d/
RUN yum install wget -y
RUN yum install nginx -y
COPY index.html /usr/share/nginx/html/
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
[root@hou dockerfile]# cat index.html

 
    page added to dockerfile

 
    

welcome to Kuaike, I am Hou

基于上面的 dockerfile 构建镜像

[root@hou dockerfile]# docker build -t="kuaile/nginx:v1" .

查看镜像是否创建成功

[root@hou dockerfile]# docker images
REPOSITORY     TAG       IMAGE ID       CREATED              SIZE
kuaile/nginx   v1        bd76f47376d2   About a minute ago   370MB

基于刚才构建的镜像启动容器

[root@hou dockerfile]# docker run -d -p 80 --name html2 kuaile/nginx:v1
f10570f13042c3d5c62114b2c4b609009f4a3341b9257bb47522d3ad2fbf19bd

注:--name html2 给容器起个名字,-p 80 容器端口,物理机端口会随机

查看容器详细信息和端口映射

[root@hou dockerfile]# docker ps | grep html
f10570f13042   kuaile/nginx:v1   "/usr/sbin/nginx -g …"   2 minutes ago   Up 2 minutes   0.0.0.0:49153->80/tcp, :::49153->80/tcp   html2
​
[root@hou dockerfile]# curl 10.0.8.120:49153

 
    page added to dockerfile

 
    

welcome to Kuaike, I am Hou

1.4.2 dockerfile 语法格式

FROM centos
MAINTAINER hou
RUN rm -rf /etc/yum.repos.d/*
COPY Centos-vault-8.5.2111.repo /etc/yum.repos.d/
RUN yum install wget -y
RUN yum install nginx -y
COPY index.html /usr/share/nginx/html/
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]

FROM:基础镜像,必须是可以下载下来的

MAINTAINER: 指定镜像的作者信息 # maintainer [meɪnˈteɪnə] 维护者

RUN: 指定在当前镜像构建过程中运行的命令,包含两种模式

#shell 模式

RUN

RUN yum install wget -y

#exec 模式

RUN ["executable","param1","param2"]

RUN ["/bin/bash","-c","echo hello"]

EXPOSE:用来声明端口的

帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。

在运行时使用随机端口映射时,也就是 docker run -P ,会自动随机映射 EXPOSE 的端口。

格式:

EXPOSE <端口 1> [<端口 2>...]

CMD:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。如果 Dockerfile 中如果存在多个CMD 指令,仅最后一个生效。

CMD["executable","param1","param2"] #exec 模式

CMD command param1 param2 #shell 模式

CMD["param1","param2"]

ENTRYPOINT: 类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。如果 Dockerfile 中存在多个 ENTRYPOINT 指令,仅最后一个生效。如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 CMD 指令指定的程序。如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。 ENTRYPOINT ["","","",...] 可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给ENTRYPOINT 传参,以下示例会提到。

示例: 假设已通过 Dockerfile 构建了 nginx:test 镜像: FROM nginx

ENTRYPOINT ["nginx", "-c"] # 定参

CMD ["/etc/nginx/nginx.conf"] # 变参

构建的镜像是 nginx:test

1、不传参运行

docker run nginx:test

容器内会默认运行以下命令,启动主进程。

nginx -c /etc/nginx/nginx.conf

2、传参运行

docker run nginx:test -c /etc/nginx/new.conf

容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)

nginx -c /etc/nginx/new.conf

COPY: 复制指令,从目录中复制文件或者目录到容器里指定路径。

格式: COPY [--chown=:] <源路径 1>... <目标路径> COPY [--chown=:] ["<源路径 1>",... "<目标路径>"] [--chown=:]:可选参数,用户改变复制到容器内文件的拥有者和属组。 <源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的filepath.Match 规则。例如: COPY hom* /mydir/ COPY hom?.txt /mydir/ <目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

ADD:指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。

功能也类似,不同之处如下:

ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。

ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

ENV:设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

格式:

ENV

ENV = =...

以下示例设置 NODE_VERSION = 7.2.0 , 在后续的指令中可以通过 $NODE_VERSION 引用:

ENV NODE_VERSION 7.2.0

RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSIONlinux-x64.tar.xz" && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"

ARG :构建参数,与 ENV 作用一至。不过作用域不一样。ARG 设置的环境变量仅对Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。

构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。

格式:

ARG <参数名>[=<默认值>]

VOLUME:定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

避免重要的数据,因容器重启而丢失,这是非常致命的。避免容器不断变大。

格式:

VOLUME ["<路径 1>", "<路径 2>"...]

VOLUME <路径>

在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。

HEALTHCHECK:用于指定某个程序或者指令来监控 docker 容器服务的运行状态。

格式:

HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令。

HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令。

HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。

链接:度娘网盘,自行取哈 
提取码:oopp

你可能感兴趣的:(docker,centos,linux,docker)