Docker创建镜像的方式有两种:
一种通过commit的方式:把做了一系列操作的容器关闭,然后利用docker的commit指令:dockercommit 容器ID 镜像名:tag。然后dockerpush到镜像仓库。别人pull下来的再次启动的时候,就是你当前的操作的形态。
另一种是通过Dockerfile构建的方式:把操作的步骤通过脚本的形式写下来,然后构建的时候,Docker会按照你写的步骤,一步一步构建。这是目前主流的构建方式。
Dockerfile指令说明
FROM:
格式为 FROM<image> 或 FROM<image>:<tag>
第一条指令必须是FROM指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令(每个镜像一次)。
MAINTAINER:格式为MAINTAIER<name>,指定维护者信息。
RUN:
格式为RUN <command>或者RUN [“executable”,“param1”,“param2”]。
前者将在shell终端中运行的命令,即/bin/sh–c;后者则使用exec执行。指定使用其他终端可以通过第二种方式实现,例如RUN[“/bin/bash”,“-c”,“echohello”]。每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用\来换行。
这实际上就是在容器构建时需要执行哪些指令,例如容器构建时需要下拉代码,但是默认启动的容器中是没有git指令的,就需要下载,可以执行:RUN apt-get install -y git,然后RUN git clonexxxx
CMD:
指定容器启动后执行的命令,一般都是早就写好的脚本,例如:CMD[“/run.sh”]。注意:如果Dockerfile中指定了多条命令,只有最后一条会被执行。如果用户启动时候加了运行的命令,则会覆盖掉CMD指定的指令。
EXPOSE:
告诉Docker服务端容器需要暴露的端口号,供互联系统使用。在启动容器时需要通过-P(注意是大写),Docker主机会自动分配一个端口转发到指定的端口;使用-p,则可以具体指定哪个本地端口映射过来。
例如:我在elasticsearch镜像的Dockerfile中指定了暴露出9200和9300端口,我可以在Dockerfile中写:
于是,这俩端口就暴露出来了,但是外界想访问的话如果不在启动的时候加上对应的映射到本地端口,Docker就会自动分配一个端口,通过dockerps 可以找到Docker自动分配了
哪个端口。
如果加上映射:docker run –p 9200:9200 –p 9300:9300 elasticsearch
这样,通过本机的9200端口和9300端口就可以访问Docker容器了。
ENV:
1、创建的时候给容器中加上个需要的环境变量。2、指定一个值,为后续的RUN指令服务
ADD:
将复制指定的的文件复制到容器中。格式为 ADD <src> <dest> src必须为Dockerfile所在位置的相对路径,也可以是一个URL;还可以是一个tar文件(自动解压为目录)
COPY:
复制本地的文件或目录到容器中。目标路径不存在时,会自动创建。(和ADD类似,个人没发现啥区别)
ENTRYPOINT:
配置容器启动后执行的命令,并且不可被dockerrun 提供的参数覆盖。
每个Dockerfile中只能有一个ENTRYPOINT,当指定多个ENTRYPOINT时,只有最后一个生效。和CMD相似,却有不同。
VOLUME:
[“/data”]创建一个挂在点,可以从本机或其他容器挂载的挂载点。意思就是从容器中暴露出一部分,和外界共享这块东西,一般放数据库的数据或者是代码。在容器启动运行的时候,如果需要将volume暴露的东西和本地的一个文件夹进行映射,想要通过本地文件直接访问容器中暴露的部分,可以在运行的时候进行映射:
docker run –v 本地路径:容器需要挂载的路径image
但是有一个问题,在构建完毕第一次进行启动的时候,会以映射的本地环境为主,所以如果说本地环境为空,那么对应的容器中的文件将会变为空。
如果不指定本地的映射目录,那么docker会自动映射一个目录到本地(Mac和windows是被映射到docker machine中了),可以通过指令 docker inspect container_name 来查看具体位置
USER:
指定运行容器时的用户名或者UID,后续的RUN也会使用指定的用户。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户。
要临时获取管理员权限的时候要使用gosu,不推荐使用sudo。如果不指定,容器默认是root运行。
WORKDIR:
定义工作目录,如果容器中没有此目录,会自动创建
ONBUILD:
配置当所创建的景象作为其他新创建景象的基础镜像时,所执行的操作指令。
例如,Dockerfile使用如下内容创建了镜像image-A
FROM image-A
#自动添加
ADD . /app/src
RUN /usr/local/bin/python-build–dir/app/src