失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Dockerfile构建镜像并发布镜像

Dockerfile构建镜像并发布镜像

时间:2019-03-04 02:29:11

相关推荐

Dockerfile构建镜像并发布镜像

文章目录

一、Dockerfile二、使用Dockerfile创建镜像三、Dockerfile制作tomcat镜像四、发布镜像(一)发布自己的镜像到Dockerhub(二)发布自己的镜像到阿里云

一、Dockerfile

Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建自定义的镜像

Dockerfile由一行行命令语句组成,并且支持以#开头的注释行。

一般而言,Dockerfile分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

Dockerfile指令说明

分别说明:

FROM

指定所创建镜像的基础镜像,如果本地不存在,则默认会去 Docker Hub 下载指定镜像。

格式为:FROM<image> 或FROM<image>:<tag>或FROM<image>@<digest>

任何Dockerfile中的第一条指令必须为FROM指令。并且,如果在同一个Dockerfile中创建多个镜像,可以使用多个FROM指令(每个镜像一次)。

MAINTAINER

指定维护者信息

格式为:MAINTAINER <name>例如:MAINTAINER image_creator@

该信息会写入生成镜像的Author属性域中。

RUN

运行指定命令。

格式为:RUN <command>或RUN ["executable","param1","param2"]注意,后一个指令会被解析为Json数组,因此必须用双引号。前者默认将在shell终端中运行命令,即/bin/sh -c;后者则使用exec执行,不会启动shell环境指定使用其他终端类型可以通过第二种方式实现,例如 RUN ["/bin/bash","-c","echo hello"]

每条RUN指令将在当前镜像的基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用\来换行。

RUN yum update \&& yum install -y libsnappy-dev zlib1g-dev libbz2-dev \&& rm -rf /var/cache/apt

CMD

CMD指令用来指定启动容器时默认执行的命令。它支持三种格式:

CMD ["executable","param1","param2"]使用 exec执行,是推荐使用的方式;多条命令的使用方式:CMD ["sh","-c","command1 && command2 ..."]CMD command param1 param2在/bin/sh中执行,提供给需要交互的应用;多条命令的使用方式:CMD command1 param1 param2&& command1 param1 param2&& ...CMD ["param1","param2"]提供给 ENTRYPOINT 的默认参数。

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

如果用户启动容器时手动指定了运行的命令(作为 docker run 的参数),则会覆盖掉CMD指定的命令;一般CMD指令后的命令用途是让服务在前台启动

LABEL

LABEL指令用来指定生成镜像的元数据标签信息

格式为:LABEL <key>=<value> <key>=<value> <key>=<value> ...例如:LABEL version="1.0"LABEL description="This text illustrates \ that label-values can span multiple lines."

EXPOSE

声明镜像内服务所监听的端口。

格式为:EXPOSE <port> [<port>...]例如:EXPOSE 22 80 8443

注意,该指令只是起到声明作用,并不会自动完成端口映射。

在启动容器时需要使用 -P,Docker主机会自动分配一个宿主机的临时端口转发到指定的端口;使用 -p,则可以具体指定哪个宿主机的本地端口会映射过来。

ENV

指定环境变量,在镜像生成过程中会被后续RUN指令使用,在镜像启动的容器中也会存在。

格式为:ENV key value或 ENV key1=value1 key2=value2 ...例如: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

指令指定的环境变量在运行时可以被覆盖掉,如 docker run --env = built_image。

ADD

该命令将复制指定的<src>路径下的内容到容器中的<dest>路径下。

格式为:ADD <src> <dest>其中<src>可以是Dockerfile所在目录的一个相对路径(文件或目录),也可以是一个URL,还可以是一个tar文件(如果为tar文件,会自动解压到<dest>路径下)。<dest>可以是镜像内的绝对路径,或者相对于工作目录(WORKDIR)的相对路径路径支持正则格式,例如:ADD *.c /code/

COPY

格式为:COPY <src> <dest>复制本地主机的<src>(为Dockerfile所在目录的相对路径、文件或目录)下的内容到镜像中的<dest>下。目标路径不存在时,会自动创建。路径同样支持正则格式。当使用本地目录为源目录时,推荐使用COPY。

ENTRYPOINT

指定镜像的默认入口命令(或需执行的脚本),该入口命令会在启动容器时作为根命令执行,所有传入值作为该命令的参数。不会被启动容器的时候指定的命令覆盖,只会将指定的命令当作参数传递给ENTRYPOINT

支持两种格式:ENTRYPOINT ["executable", "param1", "param2"]# exec调用执行,推荐使用方式ENTRYPOINT command param1 param2# shell中执行# 如果是执行指定的shell脚本,那么脚本中首行建议使用 set -e ,即当脚本中的语句在顺序执行的时候,当遇到第一条执行错误或失败的语句,那么就会退# 出,不会继续向下执行;尾行最好是 exec $@

此时,CMD指令指定值将作为根命令的参数。

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

在运行时,可以被 --entrypoint 参数覆盖掉,如 docker run --entrypoint string

如果是使用 docker run 启动容器的时候有指定的命令,则会将参数追加到 ENTRYPOINT 后

# CMD与ENTRYPOINTCMD命令设置容器启动后默认执行的命令及其参数,但CMD设置的命令能够被docker run命令后面的命令行参数替换。当指定多个时,只有最后一个有效。ENTRYPOINT配置容器启动时的执行命令(不会被忽略,一定会被执行,即使运行 docker run 时指定了其他命令;如果指定的是参数则会传入到ENTRYPOINT命令后)。当指定多个时,只有最后一个有效。若使用 docker run --entrypoint string 运行镜像,则ENTRYPOINT会被 --entrypoint string 参数覆盖掉

VOLUME

创建一个数据卷挂载点。

格式为:VOLUME ["/data"]

可以从本地主机或其他容器挂载数据卷,一般用来存放数据库和需要保存的数据等。

USER

指定运行容器时的用户名或UID,后续的RUN等指令也会使用指定的用户身份。

格式为:USER daemon

当服务不需要管理员权限时,可以通过该命令指定运行用户,并且可以在之前创建所需要的用户。例如:

RUN groupadd -r postgres && useradd -r -g postgres postgres

要临时获取管理员权限可以使用gosu或sudo。

WORKDIR

为后续的RUN、CMD和ENTRYPOINT指令配置工作目录。

格式为:WORKDIR /path/to/workdir

可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如:

WORKDIR /aWORKDIR bWORKDIR cRUN pwd# 则最终路径为/a/b/c

ARG

指定一些镜像内使用的参数(例如版本号信息等),这些参数在执行 docker build 命令时才以 --build-arg <varname>=<value>格式传入。

格式为:ARG<name>[=<default value>]

则可以用docker build --build-arg <name>=<value> 来指定参数值。

ONBUILD

配置当所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作指令。

格式为:ONBUILD [INSTRUCTION]

例如,Dockerfile使用如下的内容创建了镜像 image-A:

ONBUILD ADD . /app/srcONBUILD RUN /usr/local/bin/python-build --dir /app/src[...]

如果基于image-A创建新的镜像时,新的Dockerfile中使用 FROM image-A 指定基础镜像,会自动执行 ONBUILD 指令的内容,等价于在后面添加了两条指令:

FROM image-A#Automatically run the followingADD . /app/srcRUN /usr/local/bin/python-build --dir /app/src

STOPSIGNAL

指定所创建镜像启动的容器接收退出的信号值。例如:

STOPSIGNAL signal

HEALTHCHECK

配置所启动容器如何进行健康检查(如何判断健康与否),自Docker 1.12开始支持。

格式有两种:HEALTHCHECK [OPTIONS] CMD command# 根据所执行命令返回值是否为0来判断;HEALTHCHECK NONE# 禁止基础镜像中的健康检查。OPTION支持:--interval=DURATION(默认为:30s):过多久检查一次;--timeout=DURATION(默认为:30s):每次检查等待结果的超时;--retries=N(默认为:3):如果失败了,重试几次才最终确定失败。

SHELL

指定其他命令使用shell时的默认shell类型。默认值为 ["/bin/sh","-c"]

Dockerfile编写注意事项:

每个指令必须是大写从上到下顺序执行#表示注释每一个指令都会创建提交一个新的镜像层

定制镜像要求

实际上是从需求出发,来定制适合自己、高效方便的镜像。

首先,要理解每个指令的含义和执行效果。此外,Docker Hub官方仓库中提供了大量的优秀镜像和对应的Dockefile,可以通过阅读它们来学习如何撰写高效的Dockerfile。

建议在定制镜像过程中,尝试从如下角度进行思考,完善所生成的镜像:

精简镜像用途:尽量让每个镜像的用途都比较集中、单一,避免构造大而复杂、多功能的镜像;选用合适的基础镜像:过大的基础镜像会造成生成臃肿的镜像,一般推荐较为小巧的镜像;提供足够清晰的命令注释和维护者信息:Dockerfile也是一种代码,需要考虑方便后续扩展和他人使用;正确使用版本号:使用明确的版本号信息,如1.0,2.0,而非latest,将避免内容不一致可能引发的惨案;减少镜像层数:如果希望所生成镜像的层数尽量少,则要尽量合并指令,例如多个RUN指令可以合并为一条;及时删除临时文件和缓存文件:特别是在执行 apt-get/yum 指令后,/var/cache/apt(yum)下面会缓存一些安装包;提高生成速度:如合理使用缓存,减少内容目录下的文件;调整合理的指令顺序:在开启缓存的情况下,内容不变的指令尽量放在前面,这样可以尽量复用;减少外部源的干扰:如果确实要从外部引入数据,需要指定持久的地址,并带有版本信息,让他人可以重复而不出错。

二、使用Dockerfile创建镜像

编写完成Dockerfile之后,可以通过 docker build 命令来创建镜像。

用法:

docker build [OPTIONS] PATH | URL | -OPTIONS:-f: 指定要使用的Dockerfile路径;-t,--tag: 镜像的名字及标签,通常 name:tag 或者 name 格式

三、Dockerfile制作tomcat镜像

准备tomcat 和 jdk到当前目录,编写好README

[root@docker ~]# mkdir tomcat[root@docker tomcat]# lsapache-tomcat-8.0.36.tar.gz jdk-8u112-linux-x64.tar.gz README

编写dockerfile文件

[root@docker tomcat]# vim dockerfile-tomcatFROM centos:7# 基础镜像MAINTAINER dong<xxxxxxxxx@># 指定维护者信息COPY README /usr/local/README# 复制文件ADD jdk-8u112-linux-x64.tar.gz /usr/local/# 复制并解压ADD apache-tomcat-8.0.36.tar.gz /usr/local/RUN yum -y install vim# 下载vimENV JAVA_HOME=/usr/local/jdk1.8.0_112 \# 设置环境变量CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar \CATALINA_HOME=/usr/local/apache-tomcat-8.0.36 \CATALINA_BASE=/usr/local/apache-tomcat-8.0.36 \PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib \MYPATH=/usr/localWORKDIR $MYPATH # 设置工作目录 EXPOSE 8080# 设置暴露的端口CMD ["sh","-c","/usr/local/apache-tomcat-8.0.36/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.0.36/logs/catalina.out"]# 设置容器启动后的默认执行命令

构建镜像

[root@docker tomcat]# docker build -f dockerfile-tomcat -t tom:v1 .[root@docker tomcat]# docker build -f dockerfile-tomcat -t tom:v1 .Sending build context to Docker daemon 206.2MBStep 1/10 : FROM centos:7---> 8652b9f0cb4cStep 2/10 : MAINTAINER dong<xxxxxxxxx@>---> Running in 58cd1a462043Removing intermediate container 58cd1a462043---> ea5df1dc21e4Step 3/10 : COPY README /usr/local/README---> 123120bc78acStep 4/10 : ADD jdk-8u112-linux-x64.tar.gz /usr/local/---> 146ec2200d38Step 5/10 : ADD apache-tomcat-8.0.36.tar.gz /usr/local/---> a408a837eec2Step 6/10 : RUN yum -y install vim---> Running in 7200005e8261Loaded plugins: fastestmirror, ovl…………Complete!Removing intermediate container 7200005e8261---> 6c37ceef4d49Step 7/10 : ENV JAVA_HOME=/usr/local/jdk1.8.0_112CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarCATALINA_HOME=/usr/local/apache-tomcat-8.0.36CATALINA_BASE=/usr/local/apache-tomcat-8.0.36PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/libMYPATH=/usr/local---> Running in 2e4c30a22c2fRemoving intermediate container 2e4c30a22c2f---> 3e7fdc927a90Step 8/10 : WORKDIR $MYPATH---> Running in 60af87bc9bf9Removing intermediate container 60af87bc9bf9---> d6f67f72343fStep 9/10 : EXPOSE 8080---> Running in 0c9dc6687872Removing intermediate container 0c9dc6687872---> bf69150fb319Step 10/10 : CMD ["sh","-c","/usr/local/apache-tomcat-8.0.36/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.0.36/logs/catalina.out"]---> Running in 3ef9d1e13cb6Removing intermediate container 3ef9d1e13cb6---> 4307e0ba4b33Successfully built 4307e0ba4b33Successfully tagged tom:v1# 查看构建好的镜像[root@docker tomcat]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEtomv1 4307e0ba4b33 2 minutes ago 765MBcentos 7 8652b9f0cb4c 7 months ago 204MB# 查看该镜像各层的创建信息[root@docker tomcat]# docker history --no-trunc tom:v1 IMAGE CREATED CREATED BYSIZECOMMENTsha256:4307e0ba4b33534fc6bb9239b131d8f94d7eba96df649d9de68d2105235b7725 2 minutes ago /bin/sh -c #(nop) CMD ["sh" "-c" "/usr/local/apache-tomcat-8.0.36/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.0.36/logs/catalina.out"] 0B sha256:bf69150fb3194dc169ab6561702a4aa13232b31ce4b57e586ca3a328c1c6af2d 2 minutes ago /bin/sh -c #(nop) EXPOSE 80800B sha256:d6f67f72343fbc8a5c438c81dcf36036ad64177865d7cee54455c9cf879f8030 2 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local0B sha256:3e7fdc927a90d331da6a94b59c06d1336ff576b8a17e69be403e6127a5bdf884 2 minutes ago /bin/sh -c #(nop) ENV JAVA_HOME=/usr/local/jdk1.8.0_112 CLASSPATH=/lib/dt.jar:/lib/tools.jar CATALINA_HOME=/usr/local/apache-tomcat-8.0.36 CATALINA_BASE=/usr/local/apache-tomcat-8.0.36 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/bin:/lib MYPATH=/usr/local 0B sha256:6c37ceef4d490eaa468461ee5dd3b769c01f81fa6d1a0ee1e0e2d1195a82a709 2 minutes ago /bin/sh -c yum -y install vim 178MBsha256:a408a837eec2ad6c8ba262eca05c2bf8f69d67ea9105fad9701ab3065711d386 8 minutes ago /bin/sh -c #(nop) ADD file:002d1b36ca34becb1233cd6607ec5b8e1886b1ddc225fe3d51aa47d01cc811e9 in /usr/local/13.2MB sha256:146ec2200d3814b9ef3d200d82b4a36bec07dc00a4afb1e918ac089418ba6e9c 8 minutes ago /bin/sh -c #(nop) ADD file:4f4c35aadfba63f1be3bd035fbcf7d7ef090b3dae7120ee5ca1dbb443ab26116 in /usr/local/370MBsha256:123120bc78ac99892cf2b21ca060ffb5aa68f1a0a7134e17c89bd6722d1c7511 8 minutes ago /bin/sh -c #(nop) COPY file:bdb0735db25592d2ad59341b7d06d0b469fcbafd8b371763ff1c5a19adf83ec1 in /usr/local/README 0B sha256:ea5df1dc21e49cd653d018c900712e60ed4a5a0e53deb4c4a34908bfe103044a 8 minutes ago /bin/sh -c #(nop) MAINTAINER dong<xxxxxxxxx@> 0B sha256:8652b9f0cb4c0599575e5a003f5906876e10c1ceb2ab9fe1786712dac14a50cf 7 months ago /bin/sh -c #(nop) CMD ["/bin/bash"]0B <missing>7 months ago /bin/sh -c #(nop) LABEL org.label-schema.schema-version=1.0 org.label-schema.name=CentOS Base Image org.label-schema.vendor=CentOS org.label-schema.license=GPLv2 org.label-schema.build-date= org.opencontainers.image.title=CentOS Base Image org.opencontainers.image.vendor=CentOS org.opencontainers.image.licenses=GPL-2.0-only org.opencontainers.image.created=-11-13 00:00:00+00:00 0B <missing>7 months ago /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d43b7b44a6d990cd657b63d93d6a2a9293983a30bfc1dfa53 in /204MB

运行该镜像

[root@docker tom]# docker run -d -p 9090:8080 --name tom -v /mnt/tom/webapps/:/usr/local/apache-tomcat-8.0.36/webapps/ -v /mnt/tom/tom_logs:/usr/local/apache-tomcat-8.0.36/logs tom:v149bf298a5bd723b3951514bf25b6114153ee9f6d92c2953f7b8b4b756c002ca3[root@docker tmp]# cd /mnt/tom[root@docker tom]# lstom_logs webapps# 此时便可以在宿主机的 /mnt/tom/webapps 目录下直接部署项目

四、发布镜像

(一)发布自己的镜像到Dockerhub

登录Dockerhub

[root@docker ~]# docker login -u dongxuankuiPassword: WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. See/engine/reference/commandline/login/#credentials-storeLogin Succeeded[root@docker ~]# docker info | grep UsernameUsername: dongxuankui

重新打标签

# 注意:修改后的镜像名必须为以下格式,否则后面无法推送成功!docker tag SOURCE_IMAGE[:TAG] Dockerhub的注册用户名/TARGET_IMAGE[:TAG][root@docker ~]# docker tag tom:v1 dongxuankui/tom:v1[root@docker ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEdongxuankui/tom v1 4307e0ba4b33 19 hours ago 765MBtomv1 4307e0ba4b33 19 hours ago 765MBcentos 7 8652b9f0cb4c 7 months ago 204MB

上传镜像到Dockerhub

[root@docker ~]# docker push dongxuankui/tom:v1The push refers to repository [docker.io/dongxuankui/tom]b36c354bb786: Pushed bf9ac234808f: Pushed 341630bf82a3: Pushed a65286e91854: Pushed 174f56854903: Pushed v1: digest: sha256:bb4a8c834b490c2c607a81828b0cf73036219996690dee2770533542566daf93 size: 1372# 提交的时候也是按照镜像的层级来进行提交的

查看

此时任何人都可以下载到该镜像

(二)发布自己的镜像到阿里云

登录阿里云

在容器镜像服务下创建命名空间

创建镜像仓库

查看该镜像仓库的使用方法

推送镜像到阿里云

# 退出Dongerhub仓库[root@docker ~]# docker logoutRemoving login credentials for https://index.docker.io/v1/# 登录阿里云仓库[root@docker ~]# docker login --username=你的阿里云账号 -Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. See/engine/reference/commandline/login/#credentials-storeLogin Succeeded

规范上传镜像的版本号(打标签)

[root@docker ~]# docker tag tom:v1 -/dongxk_test/dong_test:tomcatv1[root@docker ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEdongxuankui/tom v1 4307e0ba4b33 20 hours ago 765MBtomv1 4307e0ba4b33 20 hours ago -/dongxk_test/dong_test tomcatv1 4307e0ba4b33 20 hours ago 765MBcentos 78652b9f0cb4c 7 months ago 204MB

上传

[root@docker ~]# docker push -/dongxk_test/dong_test:tomcatv1The push refers to repository [-/dongxk_test/dong_test]b36c354bb786: Pushed bf9ac234808f: Pushed 341630bf82a3: Pushed a65286e91854: Pushed 174f56854903: Pushed tomcatv1: digest: sha256:bb4a8c834b490c2c607a81828b0cf73036219996690dee2770533542566daf93 size: 1372

查看

如果觉得《Dockerfile构建镜像并发布镜像》对你有帮助,请点赞、收藏,并留下你的观点哦!

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