添加文件

例如:

ADD my.cnf /etc/mysql

or

ADD my.cnf /etc/mysql/

以上两条命令均可以将my.cnf文件添加到/etc/mysql文件夹下面。


例如:

ADDmy.cnf/etc/mysql

or

ADDmy.cnf/etc/mysql/

以上两条命令均可以将my.cnf文件添加到/etc/mysql文件夹下面。

添加文件夹

Dockerfile添加文件夹,则必须镜像中存在和当前文件夹同名的文件夹才行。例如,我希望将当前目录下的views文件夹添加到docker镜像中的app文件夹下。也许你会采用这样的方式:

ADD views /app #错误的方式

ADD views /app/views #正确的方式


ADDviews/app#错误的方式

ADDviews/app/views#正确的方式

也就是说:镜像中存在和当前需要拷贝或添加的文件夹同名的文件夹时,才能够拷贝或添加成功。

声明环境变量:

ENV :在docker 启动容器的时候传递给容器的环境变量

ENV JAVA_HOME=/opt/jdk1.8.0 #设置(容器启动时的)环境变量

ENV JRE_HOME=$JAVA_HOME/jre

ENV PATH=$JAVA_HOME/bin:$PATH

ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib

注意:(建议用一层环境变量,可以使用反斜杠换行)


ENVJAVA_HOME=/opt/jdk1.8.0#设置(容器启动时的)环境变量

ENVJRE_HOME=$JAVA_HOME/jre

ENVPATH=$JAVA_HOME/bin:$PATH

ENVCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib

注意:(建议用一层环境变量,可以使用反斜杠换行)

ARG: build过程当中,传递给build 的参数(参数)

ARG xxx=/opt/demo

ARG xxx=/opt/demo2


ARGxxx=/opt/demo

ARGxxx=/opt/demo2

运行镜像

RUN :是在build命令的的过程当中运行的(只要定义的RUN都会被运行)

CMD:是在docker run启动镜像的过程中运行的(只能定义一个,定义多个没用)

ENTRYPOINT:只会运行cmd,如果有这个,cmd就没用了

用户身份

USER:用于指定运行image时的或运行Dockerfile中任何RUN,CMD,或ENTRYPOINT指令的程序是的用户名或者UID

健康状态检测

HEALTHCHECK:


HEALTHCHECK --interval=5m --timeout=3s \ #检测试剂5分钟,超时时间3秒钟

CMD curl -f http://loclahost/ || exit 1 #检测命令,如果成功就ok,错误就返回1并且退出


HEALTHCHECK--interval=5m--timeout=3s\#检测试剂5分钟,超时时间3秒钟

CMDcurl-fhttp://loclahost/||exit1#检测命令,如果成功就ok,错误就返回1并且退出

挂载

VOLUME

VOLUME [ "/data" ] #将这个目录作为存储卷进行挂载


VOLUME["/data"]#将这个目录作为存储卷进行挂载

下面是完整构建镜像代码

FROM centos:7#你的war/jar包要放的系统镜像,也可以是你自制的本地镜像id 例如:FROM e28fcf3c832f

ENV container docker#设置环境变量

WORKDIR /opt/#切换到镜像里某个目录

RUN mkdir jdk1.8.0

RUN mkdir apache-tomcat-7.0

ADD jdk1.8.0 /opt/jdk1.8.0

ADD apache-tomcat-7.0 /opt/apache-tomcat-7.0

ADD hello.war /opt/apache-tomcat-7.0/webapps

ENV JAVA_HOME=/opt/jdk1.8.0

ENV JRE_HOME=$JAVA_HOME/jre

ENV PATH=$JAVA_HOME/bin:$PATH

ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib

RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \

systemd-tmpfiles-setup.service ] || rm -f $i; done); \

rm -f /lib/systemd/system/multi-user.target.wants/*;\

rm -f /etc/systemd/system/*.wants/*;\

rm -f /lib/systemd/system/local-fs.target.wants/*; \

rm -f /lib/systemd/system/sockets.target.wants/*udev*; \

rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \

rm -f /lib/systemd/system/basic.target.wants/*;\

rm -f /lib/systemd/system/anaconda.target.wants/*;

VOLUME [ "/sys/fs/cgroup" ] #将这个目录作为存储卷进行挂载

CMD ["/usr/sbin/init"]#执行shell命令

EXPOSE 8088 #就是将容器的对应端口服务公开给外界访问,而EXPOSE仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。

ENTRYPOINT ["/opt/apache-tomcat-7.0/bin/catalina.sh","run"] #和CMD差不多,都是运行指令之类


FROMcentos:7#你的war/jar包要放的系统镜像,也可以是你自制的本地镜像id 例如:FROM e28fcf3c832f

ENVcontainerdocker#设置环境变量

WORKDIR/opt/#切换到镜像里某个目录

RUNmkdirjdk1.8.0

RUNmkdirapache-tomcat-7.0

ADDjdk1.8.0/opt/jdk1.8.0

ADDapache-tomcat-7.0/opt/apache-tomcat-7.0

ADDhello.war/opt/apache-tomcat-7.0/webapps

ENVJAVA_HOME=/opt/jdk1.8.0

ENVJRE_HOME=$JAVA_HOME/jre

ENVPATH=$JAVA_HOME/bin:$PATH

ENVCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib

RUN(cd/lib/systemd/system/sysinit.target.wants/;foriin*;do[$i==\

systemd-tmpfiles-setup.service]||rm-f$i;done);\

rm-f/lib/systemd/system/multi-user.target.wants/*;\

rm-f/etc/systemd/system/*.wants/*;\

rm-f/lib/systemd/system/local-fs.target.wants/*;\

rm-f/lib/systemd/system/sockets.target.wants/*udev*;\

rm-f/lib/systemd/system/sockets.target.wants/*initctl*;\

rm-f/lib/systemd/system/basic.target.wants/*;\

rm-f/lib/systemd/system/anaconda.target.wants/*;

VOLUME["/sys/fs/cgroup"]#将这个目录作为存储卷进行挂载

CMD["/usr/sbin/init"]#执行shell命令

EXPOSE8088#就是将容器的对应端口服务公开给外界访问,而EXPOSE仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。

ENTRYPOINT["/opt/apache-tomcat-7.0/bin/catalina.sh","run"]#和CMD差不多,都是运行指令之类

docker build . -t demo:v1.0 #构建镜像并且给镜像打上标签。不打标签就是原始的文字码

启动容器

docker run --name myapp --net bridge -it demo:v1.0

...

dockerbuild.-tdemo:v1.0#构建镜像并且给镜像打上标签。不打标签就是原始的文字码

启动容器

dockerrun--namemyapp--netbridge-itdemo:v1.0

...

作者:shooter


这个作者貌似有点懒,什么都没有留下。