使用dockerfile 好处就是自动化定义自己的容器。
可以参考官网
https://docs.docker.com/engine/reference/builder/
1.build使用方法
docker build -f /path/to/a/Dockerfile -t shykes/myapp:1.0.2 -t shykes/myapp:latest .
-f 指定dockerfile文件位置 , -t 指定new image 名称可以指定多个,可以加tag.
2.Dockerfile 使用说明
FROM
FROM <image>[:<tag>] [AS <name>]
合法的dockerfile文件必须以此开始
RUN
run 有两种方式
RUN <command> shell形式,命令运行在shell终端中,linux默认是/bin/sh -c
RUN ["executable", "param1", "param2"] exec 形式
例如:
RUN /bin/bash -c ‘echo hello’
就像在shell终端运行:/bin/bash -c ‘echo hello’
RUN [“/bin/bash”, “-c”, “echo hello”]
就像在shell终端运行:exec /bin/bash -c ‘echo hello’
CMD
主要目的是提供默认参数给容器,不过默认的也可以包括可执行命令。
cmd有三种形式
CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)
第一种和第三种是可执行的,第二种就是提供默认参数给ENTRYPOINT
如果用户在 docker run 时指定参数,CMD中的就会被覆盖。
LABEL
LABEL <key>=<value> <key>=<value> <key>=<value> ...
存入关于image的一些元数据,以键值对存在。build完成可以用docker inspect 命令查看。
例如:
LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."
docker inspect <imagename>
可以看到以下信息
"Labels": {
"com.example.vendor": "ACME Incorporated"
"com.example.label-with-value": "foo",
"version": "1.0",
"description": "This text illustrates that label-values can span multiple lines.",
"multi.label1": "value1",
"multi.label2": "value2",
"other": "value3"
},
MAINTAINER (deprecated)
表明作者,官网不推荐使用
MAINTAINER <name>
EXPOSE
对外暴露端口
EXPOSE <port> [<port>/<protocol>...]
ENV
设置环境变量
ENV <key> <value>
ADD
复制文件到指定位置,压缩文件会自动解压。
ADD <src>... <dest>
ADD ["<src>",... "<dest>"] (this form is required for paths containing whitespace)
ADD hom* /mydir/ # 添加以home开头的文件到 /mydir/下
ADD hom?.txt /mydir/ # ? 表示单个字符,例如 "home.txt"
是一个绝对路径,或相对于WORKDIR 的路径。为容器内部的某个路径
ADD test relativeDir/ # adds "test" to `WORKDIR`/relativeDir/
ADD test /absoluteDir/ # adds "test" to /absoluteDir/
COPY
复制本地主机的 (为 Dockerfile 所在目录的相对路径)到容器中的 。
当使用本地目录为源目录时,推荐使用 COPY。
COPY hom* /mydir/ # adds all files starting with "hom"
COPY hom?.txt /mydir/ # ? is replaced with any single character, e.g., "home.txt"
ENTRYPOINT
允许你配置run container 时可执行命令。
有两种方式配置
ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred)
ENTRYPOINT command param1 param2 (shell form)
CMD 和 ENTRYPOINT 差异
以下是转载:https://www.cnblogs.com/lienhua34/p/5170335.html
CMD指令指定的容器启动时命令可以被docker run指定的命令覆盖;而ENTRYPOINT指令指定的命令不能被覆盖,而是将docker run指定的参数当做ENTRYPOINT指定命令的参数。
VOLUME
官网解释:该命令用指定名字创建一个挂载点,将其标记为从本地主机或其他容器中进行外部装入的卷。主要是因为容器只是对镜像内容拷贝过来进行修改,如果容器被删除这种修改就不存在。运用挂载也可以作为宿主机和容器间数据共享。例如数据库,也需要使用挂载,将数据保存下来。
但是由于不能指定宿主机目录作为挂载点在Dockerfile文件中,只能通过 run 命令指定某个宿主机作为和container的挂载点。
详细解释:
http://blog.youkuaiyun.com/dream_broken/article/details/52314993
USER
指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。
USER <user>[:<group>] or
USER <UID>[:<GID>]
WORKDIR
为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录
WORKDIR /path/to/workdir
2.定义tomcat Dockerfile 文件。
在之前创建的sshd-centos 基础上修改。
sshd-centos :http://blog.youkuaiyun.com/tanzhang78/article/details/78628924
下载jdk8, tomcat 8 拷贝到/home/tanzhang
创建文件如下
# Use sshd-centos as a parent image
FROM sshd-centos
ADD ./jdk-8u144-linux-x64.tar.gz /usr/local/java
ADD ./apache-tomcat-8.5.23.tar.gz /usr/local/tomcat
ENV JAVA_HOME /usr/local/java/jdk1.8.0_144
ENV PATH $JAVA_HOME/bin:$PATH
ENV CLASSPATH .:$JAVA_HOME/lib
WORKDIR /usr/local/tomcat
RUN chmod +x apache-tomcat-8.5.23/bin/*.sh
RUN mkdir applogs
ADD ./tomcatserver.sh .
RUN chmod +x ./tomcatserver.sh
EXPOSE 8080
EXPOSE 22
CMD ["./tomcatserver.sh"]
将Dockerfile 文件拷贝到cd /home/tanzhang
创建tomcatserver.sh 脚本如下:
#!/bin/sh
#start ssh server
/usr/sbin/sshd
#start tomcat server
/usr/local/tomcat/apache-tomcat-8.5.23/bin/catalina.sh run >/usr/local/tomcat/applogs/startup.log 2>&1
cd /home/tanzhang
docker build -t custom-tomcat .
创建app/applogs 文件并赋予所有用户可读可写可执行权限,该目录用作日后挂载服务日志使用。
cd /usr/local/
mkdir -p app/applogs
chmod 777 app
chmod 777 app/*
docker run --name=tomcat004 -it -p 18083:8080 -p 10024:22 -v /usr/local/app/applogs:/usr/local/tomcat/applogs custom-tomcat
-v 挂载宿主机目录到容器上。