1.docker commit

docker commit 提交容器副本使之成为一个新的镜像

docker commit -m=“提交的描述信息” -a="作者“ 容器ID 要创建的目标镜像名:[标签名 ]

2.dockerfile

2.1 dockerfile 基础知识
1.每条保留指令必须为大写字母且后面执行跟一个空格
2.指令按照从上到下,顺序执行
3.#表示注释
4.每条指令都会创建一个新的镜像层 并对镜像进行提交

2.2 dockerfile的执行流程
1.docker从基础镜像运行一个容器
2.执行一条指令并对容器作出修改
3.执行类似docker commit 的操作提交一个新的镜像层
4.docker 在基于刚提交的镜像运行一个新容器
5.执行dockerfile中的下一条指令直到所有指令都执行完成

2.3 dockerfiel 保留关键字

关键字

含义

FROM

基础镜像,当前新镜像是基于哪个镜像,指定一个已经存在的镜像

MAINTAINER

镜像维护者和姓名和邮箱地址

RUN

容器构建时需要运行的命令,有shell 和exec两种格式,RUN是在docker bulid时运行

EXPOSE

暴露端口

ENV

环境变量

WORKDIR

登录目录

VOLUME

容器卷

ADD

将宿主机目录下的文件拷贝镜像且会自动处理URL和解压tar压缩包

COPY

类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置

CMD

指定容器启动后的要干的事情 shell 格式:CDM <命令>, exec 格式 :CDM[“可执行文件”,“参数1”,“参数2” …]

ENTRYPOINT

指定一个容器启动时要运行的命令,类似鱼CMD指令,但是ENTRYPOINT 不会被docker run 后面的命令覆盖,而且这些命令行参数会被当做参数传给ENTRYPOINT 指令指定的程序

FROM
基础镜像,当前新镜像是基于哪个镜像,指定一个已经存在的镜像

FROM IMAGES:TAR

MAINTAINER
镜像维护者和姓名和邮箱地址

MAINTAINER name

EXPOSE
对外暴露的端口号

EXPOSE 8080

RUN
容器构建时(docker build)需要运行的命令 有shell和exec 两种格式

RUN <命令行命令>  命令行格式

RUN ["可执行文件","参数1","参数2"]

RUN ["./test.php","dev","offline"]  #等于 RUN ./test.php dev offline 
RUN yum -y install yum

WORKDIR
登录目录,进入docker容器后,进入的目录

WORKDIR SRC #src为目标地址

WORKDIR $MY_PATH  #搭配ENV 环境变量使用

ADD

ADD是相对路径,安装包必须要和Dockerfile 文件在同一位置

ADD 相对路径 容器内路径

COPY

COPY ["src","dest"]

COPY src dest 

<src源路径>:源文件或者源目录
<dest 目标路径> :容器内的指定路径,该路径不用提前建好,docker会自动创建

USR

指定该镜像以什么样的用户去执行,如果不指定默认是root。一般不在镜像里面设置权限

usr root

ENV
这个环境变量可以在后续的任何RUN 指令中使用,只就如同在命令前面指定了环境变量前缀一样;
也可以用在其他指令中直接使用这些环境变量

//设置环境变量
ENV MY_PATH /usr/mytest
ENV PATH "$MY_PATH/bin:$PATH"
// 直接引用环境变量
WORKDIR $MY_PATH

VOLUME

VOLUME /share/data #声明容器中/share/data为匿名卷

-v 和 VOLUME 区别
VOLUME指令只是起到了声明了容器中的目录作为匿名卷,但是并没有将匿名卷绑定到宿主机指定目录的功能。
当我们生成镜像的Dockerfile中以Volume声明了匿名卷,并且我们以这个镜像run了一个容器的时候,docker会在安装目录下的指定目录下面生成一个目录来绑定容器的匿名卷(这个指定目录不同版本的docker会有所不同),我当前的目录为:/var/lib/docker/volumes/{容器ID}

volume只是指定了一个目录,用以在用户忘记启动时指定-v参数也可以保证容器的正常运行。比如mysql,你不能说用户启动时没有指定-v,然后删了容器,就把mysql的数据文件都删了,那样生产上是会出大事故的,所以mysql的dockerfile里面就需要配置volume,这样即使用户没有指定-v,容器被删后也不会导致数据文件都不在了。还是可以恢复的。

CMD
dockerfile 可以有多个cmd 指令,但只有最后一个生效,CMD会被docker run之后的参数替代

CDM ["test.sh","param1"...]

ENTRYPOINT

ENTRYPOINT ["<exec>","<param1>","<param2>"....]

ENTRYPOINT 可以和CMD 一起用,一般是变参才会使用CMD,这里的CMD等于是在给ENTRYPOINT 传参。
当指定了ENTRYPOINT 后,CMD的含义就发生了变化,不再是直接运行其命令而是将CMD的内容作为参数传递给ENTRYPOINT 会变成“”

假设构建nginx:test 镜像

FROM nginx

ENTRYPOINT ["nginx" ,"-c"] #定参

CMD ["/etc/nginx/nginx.conf"] #变参

docker 显示完整 command docker的command_运维

2.4 dockerfile 执行命令

vim Dockerfile 
docker build -t 新镜像名字:TAG  .

带有jdk1.8 镜像生成

vim Dockerfile

FROM centos:7.9.2009
MAINTAINER yb<462508085@qq.com>

ENV  MY_PATH /usr/local

WORKDIR $MY_PATH

RUN yum -y install vim
RUN yum -y install  net-tools
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
ADD jdk-8u181-linux-x64.tar.gz /usr/local/java

ENV JAVA_HOME /usr/local/java/jdk1.8.0_181
ENV JER_HOME  $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPTAH
ENV PATH $JAVA_HOME/bin:$PATH

EXPOSE 80

CMD /bin/bash

Dockerfile 和需要ADD 解压的添加到镜像中的压缩包在同一路径下

docker 显示完整 command docker的command_环境变量_02

建立docker 镜像

docker build -t centos_jdk .

查看镜像

docker 显示完整 command docker的command_运维_03