docker-构建镜像的两种方式

本文详细介绍了如何使用Docker构建和管理容器镜像,包括通过容器构建镜像的方法和利用Dockerfile进行镜像构建的过程。文章涵盖了Dockerfile的各个指令,如FROM、LABEL、ENV、WORKDIR、ADD、COPY、EXPOSE、VOLUME、RUN、CMD、ENTRYPOINT和USER的使用方法及区别。

从容器构建-容器经过反复修改,但不知道具体的修改历史;不熟悉dockerfile指令

$ docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS              NAMES
c3f279d17e0a        ubuntu:12.04        /bin/bash           7 days ago          Up 25 hours                            desperate_dubinsky
197387f1b436        ubuntu:12.04        /bin/bash           7 days ago          Up 25 hours                            focused_hamilton

$ docker commit --change='CMD ["apachectl", "-DFOREGROUND"]' -c "EXPOSE 80" c3f279d17e0a  svendowideit/testimage:version4

f5283438590d

$ docker run -d svendowideit/testimage:version4

89373736e2e7f00bc149bd783073ac43d0507da250e999f3f1036e0db60817c0

$ docker ps

CONTAINER ID        IMAGE               COMMAND                 CREATED             STATUS              PORTS              NAMES
89373736e2e7        testimage:version4  "apachectl -DFOREGROU"  3 seconds ago       Up 2 seconds        80/tcp             distracted_fermat
c3f279d17e0a        ubuntu:12.04        /bin/bash               7 days ago          Up 25 hours                            desperate_dubinsky
197387f1b436        ubuntu:12.04        /bin/bash               7 days ago          Up 25 hours           

从dockerfile构建-了解镜像的构建步骤;熟悉dockerfile指令

docker build dockerfile

参考dockerfile官方文档
FROM
dockerfile的起点,指定镜像构建依赖的基础镜像。
LABEL
指定镜像的元数据(键值对)(比如指定作者:maintainer=xxl)。
ENV
指定环境变量,推荐键值对(key=value)的方式。
WORKDIR
指定RUN, CMD, ENTRYPOINT, COPY和ADD的工作目录,可多次设置,每次设置后对后面生效。
ADD-可以是远程文件
从源地址复制新的文件,目录或者远程文件url,并把它们添加到镜像的目标路径。
COPY-不能是远程文件
从源目录复制新的文件或者目录,并且把它们添加到容器的目标路径。
EXPOSE
指定容器运行时监听的端口,可以指定协议udp/tcp,不指定的话默认是tcp。

EXPOSE 80/udp

VOLUME
指定容器的挂载点,并把它作为宿主或者其他容器的外部挂载卷。
RUN
执行过程命令,比如创建文件夹,开启配置等,可以有多个,每个都生效。
CMD
在Dockerfile中只能有一个CMD指令。如果您列出了多个CMD,那么只有最后一个CMD将生效。CMD的主要目的是为执行容器提供默认值。这些缺省值可以包括可执行文件,也可以省略可执行文件,在这种情况下,您还必须指定一个ENTRYPOINT指令。
ENTRYPOINT
ENTRYPOINT允许您配置作为可执行文件运行的容器。docker run <image>的命令行参数将被附加在exec形式的ENTRYPOINT中的所有元素之后,并且将覆盖使用CMD指定的所有元素。这允许参数被传递到入口点,即, docker run <image> -d将把-d参数传递给入口点。可以使用docker run -entrypoint标志覆盖ENTRYPOINT指令。只有Dockerfile中的最后一个ENTRYPOINT指令才会起作用。
USER
指定镜像运行时或者执行RUN、CMD、ENTRYPOINT命令时所处的用户名和用户组。

CMD和ENTRYPOINT的区别

  1. Dockerfile应该指定至少一个CMD或ENTRYPOINT命令。
  2. 当使用容器作为可执行文件时,应该定义入口点。
  3. CMD应该用于为ENTRYPOINT命令定义默认参数,或者用于在容器中执行特别命令。
  4. 当使用替代参数运行容器时,CMD将被覆盖。
No ENTRYPOINTENTRYPOINT exec_entry p1_entryENTRYPOINT [“exec_entry”, “p1_entry”]
No CMDerror, not allowed/bin/sh -c exec_entry p1_entryexec_entry p1_entry
CMD [“exec_cmd”, “p1_cmd”]exec_cmd p1_cmd/bin/sh -c exec_entry p1_entryexec_entry p1_entry exec_cmd p1_cmd
CMD [“p1_cmd”, “p2_cmd”]p1_cmd p2_cmd/bin/sh -c exec_entry p1_entryexec_entry p1_entry p1_cmd p2_cmd
CMD exec_cmd p1_cmd/bin/sh -c exec_cmd p1_cmd/bin/sh -c exec_entry p1_entryexec_entry p1_entry /bin/sh -c exec_cmd p1_cmd

如果CMD是从基础image定义的,设置ENTRYPOINT会将CMD重置为空值。在这个场景中,必须在当前image中定义CMD才能有一个值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值