Docker制作镜像的两种方式
Docker制作镜像有两种方式:docker commit 制作镜像和基于dockerfile构建镜像,在《使用Dockerfile制作镜像》一文中讲到如何用dockerfile构建镜像,里面只用了FROM和RUN命令,比较简单。
本文讲如何用docker commit制作镜像以及dockerfile的其他命令和用法。
一、dockers commit制作镜像
通过docker commit制作镜像,运行一个基础镜像,然后在基础镜像上进行软件的安装和配置文件的修改。然后提交变动到新的镜像。
1、docker run
1)docker images 先查看有本地已有的镜像,选择需要的基础镜像,如果没有需要的,就用docker pull拉取需要的镜像
2)然后用docker run 将镜像跑为容器
2、docker commit -a 作者信息 -m 说明信息 容器名称 镜像的名字(自己取一个)
-a 指定作者信息 -m 提交的说明信息 -p在commit时默认暂停容器
具体执行如下图:
最后一个红框中docker commit 命令最后是保存修改成为镜像的名字,自己取一个就行
3、docker diff 查看镜像存储层变化
4、docker history
-q 只显示镜像ID
说明:
1)用commit镜像除了真正想要修改的东西外,由于命令的执行,还会有其他文件被改动或添加,如果是安装软件包、编译构建,
将会有大量无关内容被添加进行,这会导致镜像极为臃肿,docker commit意味着对镜像操作都是黑箱操作,其他人很难知道里面发生了什么,
维护十分困难。官方不建议通过commit方式来创建。
2)如果不担心镜像会越来越大的话,这种方式是最自由最简单的。
二、Dockerfile命令
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
注意:镜像构建时,一定要确保每一层只添加真正需要添加的东西,任何无关的东西都应该清理掉
1、FROM 指定基础镜像
格式:FROM <image> 或者 FROM <image>:<tag>
比如:FROM centos:7
2、MAINTAINER 指定维护者信息
格式:MAINTAINER <name>
比如:MAINTAINER hxq hxq@foxmail.com
3、RUN 执行命令
1)shell模式:
RUN <命令> 就像直接在命令行中输入的命令一样
RUN <command> 默认使用`/bin/sh -c `执行命令
例:RUN yum install -y httpd
例:RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
2)exec模式
RUN ["可执行文件", "参数1", "参数2"],这更像是函数调用中的格式
说明:RUN命令是用来执行命令行,注意每用一个RUN(dockerfile指令)就是镜像添加多一层(最大限制127层)。
执行多个指令用&&来连接(apt-get加上-y,表示系统安装提示都默认选择yes,否则制作镜像失败;如果&&命令之间有换行,记得行后要带上 )
4、COPY 复制文件
格式:COPY src desc
复制本地主机src目录或文件到容器的desc目录,desc不存在时会自动创建。
拷贝文件或目录到镜像(不能自动解压缩)
5、ADD 高级复制
格式:ADD src dest
比如:ADD ["src","dest"]或者ADD https://xxx.com/html.tar.gz /var/www/html
拷贝文件或目录到镜像(可以自动解压缩或者下载)
该命令将复制指定本地目录中的文件到容器中的dest中,src可以是是一个绝对路径,也可以是一个URL或一个tar文件,tar文件会自动解压为目录。
6、CMD 容器启动命令
是可以被 docker run 指令覆盖的,而ENTRYPOINT的参数可以被--entrypoint覆盖;会比CMD或者docker run指定的命令要靠前执行。
7、ENTRYPOINT 入口点
ENTRYPOINT ["executable","param1","param2"]
ENTRYPOINT command param1,param2 会在shell中执行。
用于配置容器启动后执行的命令,这些命令不能被docker run提供的参数覆盖。和CMD一样,每个Dockerfile中只能有一个ENTRYPOINT,当有多个时最后一个生效。
8、ENV 用设置环境变量
这些环境变量,后续可以被RUN指令使用,容器运行起来之后,也可以在容器中获取这些环境变量。
格式:EVN key value
比如:ENV word hello
RUN echo $word
9、ARG 构建参数
10、VOLUMN 定义匿名卷
格式: VOLUME ["/data"]
作用是创建在本地主机或其他容器可以挂载的数据卷,用来存放数据。
11、EXPOSE 暴露端口
格式: EXPOSE port [port2,port3,...]
比如: EXPOSE 80 这条指令告诉Docker服务器暴露80端口,供容器外部连接使用。
功能为暴露容器运行时的监听端口给外部,但是EXPOSE并不会使容器访问主机的端口,如果想使得容器与主机的端口有映射关系,必须在容器启动的时候加上 -P参数
12、WORKDIR 指定工作目录
格式: WORKDIR /path
比如: WORKDIR /path/to/workdir
为后续的RUN CMD ENTRYPOINT指定配置工作目录,可以使用多个WORKDIR指令,若后续指令用得是相对路径,则会基于之前的命令指定路径。
13、USER 指定当前用户
格式为:USER username
比如:RUN groupadd -r docker && useradd -r -g docker docker
指定容器运行时的用户名或UID,后续的RUN也会使用指定的用户。要临时使用管理员权限可以使用sudo。在USER命令之前可以使用RUN命令创建需要的用户。
14、HEALTHCHECK 健康检查
15、ONBUILD 镜像触发器
格式:ONBUILD [INSTRUCTION]
该配置指定当所创建的镜像作为其他新建镜像的基础镜像时所执行的指令。
例如下面的Dockerfile创建了镜像A:
ONBUILD ADD . /app
ONBUILD RUN python app.py
则基于镜像A创建新的镜像时,新的Dockerfile中使用from A 指定基镜像时,会自动执行ONBBUILD指令内容,等价于在新的要构建镜像的Dockerfile中增加了两条指令:
FROM A
ADD ./app
RUN python app.py
16、docker build
创建好Dockerfile之后,通过docker build命令来创建镜像,该命令首先会上传Dockerfile文件给Docker服务器端,服务器端将逐行执行Dockerfile中定义的指令。
通常建议放置Dockerfile的目录为空目录。另外可以在目录下创建.dockerignore文件,让Docker忽略路径下的文件和目录,这一点与Git中的配置很相似。
通过 -t 指定镜像的标签信息
例如:docker build -t regenzm/first_image . ## "."指定的是Dockerfile所在的路径