失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > docker -- dockerfile制作镜像

docker -- dockerfile制作镜像

时间:2019-09-02 20:49:14

相关推荐

docker -- dockerfile制作镜像

基于容器手动制作镜像步骤具体如下:

下载一个系统的官方基础镜像,如: CentOS 或 Ubuntu基于基础镜像启动一个容器,并进入到容器在容器里面做配置操作 安装基础命令 配置运行环境 安装服务和配置服务 放业务程序代码提交为一个新镜像 docker commit基于自己的的镜像创建容器并测试访问

Dockerfile 构建过程和指令总结

从基础镜像运行一个容器

执行一条指令,对容器做出修改

执行类似docker commit的操作,提交一个新的中间镜像层(可以利用中间层镜像创建容器进行调

试和排错)

再基于刚提交的镜像运行一个新容器

执行Dockerfile中的下一条指令,直至所有指令执行完毕

Dockerfile 相关指令

ADD #复制并解压COPY #复制ENV #设置环境变量EXPOSE FROM #指定基础镜像LABEL #指定作者等 镜像元数据STOPSIGNAL USER #指定用户VOLUME WORKDIR #指定容器需要挂载的目录

FROM: 指定基础镜像

#首行FROM 指定基础镜像范例:FROM ubuntu

对于不同的软件官方都提供了相关的docker镜像,比如: nginx、redis、mysql、httpd、tomcat等服 务类的镜像,也有操作系统类,如: centos、ubuntu、debian等。建议使用官方镜像,比较安全。

LABEL: 指定镜像元数据

可以指定镜像元数据,如: 镜像作者等LABEL "com.example.vendor"="ACME Incorporated" LABEL com.example.label-with-value="foo" LABEL version="1.0" LABEL description="This text illustrates \ that label-values can span multiple lines."

一个镜像可以有多个label ,还可以写在一行中,即多标签写法,可以减少镜像的的大小

RUN: 执行 shell命令

RUN 指令用来在构建镜像阶段需要执行 FROM 指定镜像所支持的Shell命令。 通常各种基础镜像一般都支持丰富的shell命令 注意: RUN 可以写多个,每一个RUN指令都会建立一个镜像层,所以尽可能合并成一条指令,比如将多 个shell命令通过 && 连接一起成为在一条指令 每个RUN都是独立运行的,和前一个RUN无关

#shell 格式: 相当于 /bin/sh -c <命令> 此种形式支持环境变量 RUN <命令> #exec 格式: 此种形式不支持环境变量,注意:是双引号,不能是单引号 RUN ["可执行文件", "参数1", "参数2"] #exec格式可以指定其它shell RUN ["/bin/bash","-c","echo hello wang"]RUN yum -y install epel-release \&& yum -y install nginx \&& rm -rf /usr/share/nginx/html/*&& echo "<h1> docker test nginx </h1>" > /usr/share/nginx/html/index.html

ENV: 设置环境变量

ENV 可以定义环境变量和值,会被后续指令(如:ENV,ADD,COPY,RUN等)通过KEY或KEY或KEY或{KEY}进行引用,

并在容器运行时保持

如果运行容器时如果需要修改变量,可以执行下面通过基于 exec 机制实现

注意: 下面方式只影响容器运行时环境,而不影响构建镜像的过程,即只能覆盖docker run时的环境变量,

而不会影响docker build时环境变量的值

#变量赋值格式1ENV <key> <value> #此格式只能对一个key赋值,<key>之后的所有内容均会被视作其<value>的组成部分#变量赋值格式2ENV <key1>=<value1> <key2>=<value2> \ #此格式可以支持多个key赋值,定义多个变量建议使用,减少镜像层<key3>=<value3> ...#如果<value>中包含空格,可以以反斜线\进行转义,也可通过对<value>加引号进行标识;另外,反斜线也可用于续行#只使用一次变量RUN <key>=<value> <command>#引用变量RUN $key .....#变量支持高级赋值格式${key:-word}${kye:+word}范例:ENV VERSION=1.0 DEBUG=on NAME="Happy Feet"ENV PG_MAJOR 9.3ENV PG_VERSION 9.3.4RUN curl -SL /postgres-$PG_VERSION.tar.xz | tar -xJC/usr/src/postgress && …ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH

COPY: 复制文本

复制本地宿主机的 到容器中的 。

COPY hom* /mydir/ COPY hom?.txt /mydir/

ADD: 复制和解包文件

该命令可认为是增强版的COPY,不仅支持COPY,还支持自动解缩。可以将复制指定的 到容器中的

可以是Dockerfile所在目录的一个相对路径;也可是一个 URL;还可是一个 tar 文件(自动解压)

可以是绝对路径或者是 WORKDIR 指定的相对路径

如果是目录,只复制目录中的内容,而非目录本身

如果是一个 URL ,下载后的文件权限自动设置为 600

如果为URL且不以/结尾,则指定的文件将被下载并直接被创建为,如果以 / 结尾,则文件名URL指

定的文件将被直接下载并保存为/< filename>

如果是一个本地文件系统上的打包文件,如: gz, bz2 ,xz ,它将被解包 ,其行为类似于"tar -x"命令,

但是通过URL获取到的tar文件将不会自动展开

如果有多个,或其间接或直接使用了通配符,则必须是一个以/结尾的目录路径;如果不以/结尾,则

其被视作一个普通文件,的内容将被直接写入到

ADD test relativeDir/# adds "test" to `WORKDIR`/relativeDir/ADD test /absoluteDir/ # adds "test" to /absoluteDir/ADD --chown=55:mygroup files* /somedir/ADD --chown=bin files* /somedir/ADD --chown=1 files* /somedir/ADD --chown=10:11 files* /somedir/ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /

CMD: 容器启动命令(没有ENTRYPOINT就是自己是一条命令,有的话就是后面的参数)

一个容器中需要持续运行的进程一般只有一个,CMD 用来指定启动容器时默认执行的一个命令,且其运

行结束后,容器也会停止,所以一般CMD 指定的命令为持续运行且为前台命令.

如果docker run没有指定任何的执行命令或者dockerfile里面也没有ENTRYPOINT,那么开启容器

时就会使用执行CMD指定的默认的命令

前面介绍过的 RUN 命令是在构建镜像进执行的命令,注意二者的不同之处

每个 Dockerfile 只能有一条 CMD 命令。如指定了多条,只有最后一条被执行

如果用户启动容器时用 docker run xxx 指定运行的命令,则会覆盖 CMD 指定的命

# 使用 exec 执行,推荐方式,第一个参数必须是命令的全路径,此种形式不支持环境变量CMD ["executable","param1","param2"]# 在 /bin/sh 中执行,提供给需要交互的应用;此种形式支持环境变量CMD command param1 param2# 提供给 ENTRYPOINT 命令的默认参数CMD ["param1","param2"]

ENTRYPOINT: 入口点

功能类似于CMD,配置容器启动后执行的命令及参数

ENTRYPOINT 不能被 docker run 提供的参数覆盖,而是追加,即如果docker run 命令有参数,那

么参数全部都会作为ENTRYPOINT的参数

如果docker run 后面没有额外参数,但是dockerfile中的CMD里有(即上面CMD的第三种用

法),即Dockerfile中即有CMD也有ENTRYPOINT,那么CMD的全部内容会作为ENTRYPOINT的参

如果docker run 后面有额外参数,同时Dockerfile中即有CMD也有ENTRYPOINT,那么docker run

后面的参数覆盖掉CMD参数内容,最终作为ENTRYPOINT的参数

可以通过docker run --entrypoint string 参数在运行时替换,注意string不要加空格

使用CMD要在运行时重新写命令本身,然后在后面才能追加运行参数,ENTRYPOINT则可以运行时

无需重写命令就可以直接接受新参数

每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个生效

# 使用 exec 执行ENTRYPOINT ["executable", "param1", "param2"]# shell中执行ENTRYPOINT command param1 param2范例:[root@ubuntu1804 dockerfile]#cat DockerfileFROM ubuntu:18.04RUN apt update \&& apt -y install curl \&& rm -rf /var/lib/apt/lists/*ENTRYPOINT [ "curl", "-s",""]

ARG: 构建参数

ARG指令在build 阶段指定变量,和ENV不同的是,容器运行时不会存在这些环境变

如果和ENV同名,ENV覆盖ARG变量

可以用 docker build --build-arg <参数名>=<值> 来覆盖

#FROM指令支持由第一个FROM之前的任何ARG指令声明的变量#示例:ARG CODE_VERSION=latestFROM base:${CODE_VERSION}CMD /code/run-appFROM extras:${CODE_VERSION}CMD /code/run-extras#示例:ARG VERSION=latestFROM busybox:$VERSIONARG VERSIONRUN echo $VERSION > image_version

VOLUME: 匿名卷(后面接的是容器需要挂载的目录,只需要添加好就自动挂载好)

在容器中创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据

等,一般会将宿主机上的目录挂载至VOLUME 指令指定的容器目录。即使容器后期被删除,此宿主机

的目录仍会保留,从而实现容器数据的持久保存。

宿主机目录为

/var/lib/docker/volumes/<volume_id>/_data

注意:

Dockerfile中的VOLUME实现的是匿名数据卷,无法指定宿主机路径和容器目录的挂载关系

通过docker rm -fv <容器ID> 可以删除容器的同时删除VOLUME指定的卷

范例: 在容器创建两个/data/ ,/data2的挂载点

VOLUME [ "/data1","/data2" ]

EXPOSE: 暴露端口

指定服务端的容器需要对外暴露(监听)的端口号,以实现容器与外部通信。

EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会真正暴露端口,即不会自动在宿主进行端口映射

因此,在启动容器时需要通过 -P 或-p ,Docker 主机才会真正分配一个端口转发到指定暴露的端口才可

使用

注意: 即使 Dockerfile没有EXPOSE 端口指令,也可以通过docker run -p 临时暴露容器内程序真正监

听的端口,所以EXPOSE 相当于指定默认的暴露端口,可以通过docker run -P 进行真正暴露

范例:EXPOSE 80 443EXPOSE 11211/udp 11211/tcp

WORKDIR: 指定工作目录(用了这个后每条命令完成后自动回到这个目录)

为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录,当容器运行后,进入容器内WORKDIR指定

的默认目录

WORKDIR 指定工作目录(或称当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存

在,WORKDIR 会自行创建

WORKDIR /path/to/workdir

范例:#两次RUN独立运行,不在同一个目录,RUN cd /appRUN echo "hello" > world.txt#如果想实现相同目录可以使用WORKDIRWORKDIR /appRUN echo "hello" > world.txt

构建镜像docker build 命令

docker build命令使用Dockerfile文件创建镜像

docker build [OPTIONS] PATH | URL | -说明: PATH | URL | -#可以使是本地路径,也可以是URL路径。若设置为 - ,则从标准输入获取Dockerfile的内容-f, --file string #Dockerfile文件名,默认为 PATH/Dockerfile--force-rm #总是删除中间层容器,创建镜像失败时,删除临时容器--no-cache #不使用之前构建中创建的缓存-q --quiet=false #不显示Dockerfile的RUN运行的输出结果--rm=true #创建镜像成功时,删除临时容器-t --tag list #设置注册名称、镜像名称、标签。格式为 <注册名称>/<镜像名称>:<标签>(标签默认为latest)

docker build -t nginx:v1 /usr/local/src/nginxdocker build -t nginx:v1 . #要在/usr/local/src/nginx文件目录下

如果觉得《docker -- dockerfile制作镜像》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。