Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。
dockerfile一般与程序在同一级目录下。
touch Dockerfile(D要大写)
vi Dockerfile
一.编写第一个Dockerfile(jdk8,tomcat8的java环境)
# 版本信息
FROM centos
MAINTAINER wzp"wanzepeng@zailingtech.com"
# OS环境配置
RUN yum install -y wget
# 安装JDK
RUN mkdir /var/tmp/jdk RUN wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" -P /var/tmp/jdk http://download.oracle.com/otn-pub/java/jdk/8u111-b14/jdk-8u111-linux-x64.tar.gz
RUN tar xzf /var/tmp/jdk/jdk-8u111-linux-x64.tar.gz -C /var/tmp/jdk && rm -rf /var/tmp/jdk/jdk-8u111-linux-x64.tar.gz
# 安装tomcat
RUN mkdir /var/tmp/tomcat
RUN wget -P /var/tmp/tomcat http://archive.apache.org/dist/tomcat/tomcat-8/v8.5.8/bin/apache-tomcat-8.5.8.tar.gz
RUN tar xzf /var/tmp/tomcat/apache-tomcat-8.5.8.tar.gz -C /var/tmp/tomcat && rm -rf /var/tmp/tomcat/apache-tomcat-8.5.8.tar.gz
#设置环境变量
ENV JAVA_HOME /var/tmp/jdk/jdk1.8.0_111
ENV CATALINA_HOME /var/tmp/tomcat/apache-tomcat-8.5.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
#打包项目并拷贝到tomcat webapps目录
RUN mkdir /var/tmp/webapp
ADD ./ /var/tmp/webapp
RUN cd /var/tmp/webapp && cp /var/tmp/webapp/war/sm_new.war /var/tmp/tomcat/apache-tomcat-8.5.8/webapps/
#开启内部服务端口
EXPOSE 8080
#启动tomcat服务器
CMD ["./var/tmp/tomcat/apache-tomcat-8.5.8/bin/catalina.sh","run"] && tail -f /var/tmp/tomcat/apache-tomcat-8.5.8/logs/catalina.out
使用Dockerfile构建镜像
# docker build -t tomcat .
tomcat是镜像的名字。 . 表示Dockerfile在当前文件夹下,也可使用绝对路径(/path/to/Dockerfile)来表示。
运行容器
# docker run -it -p 12345:8080 --name=tomcat-test tomcat
tomcat-test是容器的名字。12345是映射到外部的端口。然后在命令行键入 Ctrl + p , Ctrl + q,使容器在后台运行。
jdk1.7 tomcat7
- # 安装jdk
- RUN wget --no-cookies --no-check-certificate --header "Cookie:gpw_e24=http%3a%2f%2fwww.oracle.com%2ftechnetwork%2fjava%2fjavase%2fdownloads%2fjdk7-downloads-1880260.html;oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.tar.gz
- RUN tar -zxf jdk-7u79-linux-x64.tar.gz
- # 配置环境变量
- ENV JAVA_HOME /home/jdk1.7.0_79
- ENV JRE_HOME $JAVA_HOME/jre
- ENV CLASSPATH .:$JAVA_HOME/lib:$JRE_HOME/lib
- ENV PATH $PATH:$JAVA_HOME/bin
- #安装 tomcat7
- #RUN apt-get update
- RUN wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.62/bin/apache-tomcat-7.0.62.tar.gz
- RUN tar xvf apache-tomcat-7.0.62.tar.gz
- #配置tomcat的环境变量
- ENV CATALINA_HOME /home/apache-tomcat-7.0.62
二.DockerFile常用命令
Dockerfile 语法示例
Dockerfile语法由两部分构成,注释和命令+参数
# Line blocks used for commenting
command argument argument ..
一个简单的例子:
# Print "Hello docker!"
RUN echo "Hello docker!"
Dockerfile 命令
Dockerfile有十几条命令可用于构建镜像,下文将简略介绍这些命令。
ADD
ADD命令有两个参数,源和目标。它的基本作用是从源系统的文件系统上复制文件到目标容器的文件系统。如果源是一个URL,那该URL的内容将被下载并复制到容器中。
# Usage: ADD [source directory or URL] [destination directory]
ADD /my_app_folder /my_app_folder
CMD
和RUN命令相似,CMD可以用于执行特定的命令。和RUN不同的是,这些命令不是在镜像构建的过程中执行的,而是在用镜像构建容器后被调用。
# Usage 1: CMD application "argument", "argument", ..
CMD "echo" "Hello docker!"
ENTRYPOINT
配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
ENTRYPOINT 帮助你配置一个容器使之可执行化,如果你结合CMD命令和ENTRYPOINT命令,你可以从CMD命令中移除“application”而仅仅保留参数,参数将传递给ENTRYPOINT命令。
# Usage: ENTRYPOINT application "argument", "argument", ..
# Remember: arguments are optional. They can be provided by CMD
# or during the creation of a container.
ENTRYPOINT echo
# Usage example with CMD:
# Arguments set with CMD can be overridden during *run*
CMD "Hello docker!"
ENTRYPOINT echo
ENV
ENV命令用于设置环境变量。这些变量以”key=value”的形式存在,并可以在容器内被脚本或者程序调用。这个机制给在容器中运行应用带来了极大的便利。
# Usage: ENV key value
ENV SERVER_WORKS 4
EXPOSE
EXPOSE用来指定端口,使容器内的应用可以通过端口和外界交互。
# Usage: EXPOSE [port]
EXPOSE 8080
FROM
FROM命令可能是最重要的Dockerfile命令。改命令定义了使用哪个基础镜像启动构建流程。基础镜像可以为任意镜 像。如果基础镜像没有被发现,Docker将试图从Docker image index来查找该镜像。FROM命令必须是Dockerfile的首个命令。
# Usage: FROM [image name]
FROM ubuntu
MAINTAINER
我建议这个命令放在Dockerfile的起始部分,虽然理论上它可以放置于Dockerfile的任意位置。这个命令用于声明作者,并应该放在FROM的后面。
# Usage: MAINTAINER [name]
MAINTAINER authors_name
RUN
RUN命令是Dockerfile执行命令的核心部分。它接受命令作为参数并用于创建镜像。不像CMD命令,RUN命令用于创建镜像(在之前commit的层之上形成新的层)。
# Usage: RUN [command]
RUN aptitude install -y riak
USER
USER命令用于设置运行容器的UID。
# Usage: USER [UID]
USER 751
VOLUME
VOLUME命令用于让你的容器访问宿主机上的目录。
# Usage: VOLUME ["/dir_1", "/dir_2" ..]
VOLUME ["/my_files"]
WORKDIR
WORKDIR命令用于设置CMD指明的命令的运行目录。
# Usage: WORKDIR /path
WORKDIR ~/