5. dockerfile

在我们构建镜像的时候, 我们即可以手工的去构建对象, 也可以通过dockerfile来进行构建镜像, 而很多应用开发的过程中, 我们可能都需要通过dockerfile来制作我们的镜像, 就需要通过dockefile来帮我们构建镜像, 可以帮助我们省去很多人工的操作, 下面, 我们就来熟悉一下dockerfile的语法吧

5.1 什么是dockerFile

Dockerfile 是记录了镜像是如何被构建出来的配置文件, 可以被 docker 直接执行以创建一个镜像.

示例:

FROM ubuntu:14.04
MAINTAINER YS.Zou <>

ADD run /root/run
ADD sources.list /etc/apt/sources.list
ADD id_rsa.pub /tmp/pubkey
ADD requirements /root/requirements

RUN mkdir -p /root/.ssh && \
    cat /tmp/pubkey >> /root/.ssh/authorized_keys && \
    rm -rf /tmp/pubkey
...

CMD ["bash", "/root/run"]

5.2 dockeFile的命令:

  • FROM:基础镜像,当前新的镜像是基于哪个已经存在的镜像的
  • MAINTAINER:镜像作者及其邮箱
  • RUN:容器构建时需要执行的命令
  • EXPOSE:暴露镜像的端口号
  • WORKDIR:指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
  • ENV:用来在构建镜像过程中设置环境变量
  • ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
  • COPY:跟ADD类似,拷贝文件和目录到镜像中
  • VOLUME:容器数据卷,用于数据保存和持久化工作
  • CMD:指定一个容器启动时要执行的命令,dockefile可以有多个cmd指令,但只有最后一个生效,cmd会被docker run之后的参数替换
  • ENTRYPOINT:指定一个容器启动时要执行的命令,和CMD的目的一样,都是在指定容器启动程序及参数
  • ONBUILD:当构建一个被继承的dockefile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

5.3 执行dockerfile的大致流程

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

5.4 dockerfile构建镜像的步骤

  1. 准备一个文件, 名为: Dockerfile
FROM nginx
RUN echo '<h1>TSF Demo Application and Docker</h1>' > /usr/share/nginx/html/index.html
  1. 在Dockerfile所在的目录下, 执行命令用于构建镜像
docker build -t nginx:my

注意: docker build命令会根据 Dockerfile 文件及上下文构建新 Docker 镜 像。构建上下文是指 Dockerfile 所在的本地路径或一个URL(Git仓 库地址)。构建上下文环境会被递归处理,所以构建所指定的路 径还包括了子目录,而URL还包括了其中指定的子模块

Dockerfile 一般位于构建上下文的根目录下,也可以通过-f指定该 文件的位置:

构建时,还可以通过-t参数指定构建成镜像的仓库、标签。

  1. 使用Docker镜像创建容器
docker run -d -p 7788:80 nginx:my
  1. 使用浏览器访问宿主主机的7788端口
curl http://127.0.0.1:7788

5.5 示例:

本案例中,我们将从一个centos的基础镜像开始,安装JDK和 Tomcat,并部署一个Web应用,最后启动容器并访问Web应用。相应的Dockerfile如下:

FROM centos
MAINTAINER stromling stromling@example.com
RUN mkdir /root/training
RUN mkdir /root/tools
COPY jdk-8u144-linux-x64.tar.gz /root/tools
RUN tar zxvf /root/tools/jdk-8u144-linux-x64.tar.gz -C /root/training/
ENV JAVA_HOME /root/training/jdk1.8.0_144
ENV PATH $JAVA_HOME/bin:$PATH
ADD http:///apache/tomcat/tomcat-8/v8.5.35/bin/apache- tomcat-8.5.35.tar.gz /root/tools
RUN tar zxvf /root/tools/apache-tomcat-8.5.35.tar.gz -C /root/training/ COPY MyDemoWeb.war /root/training/apache-tomcat-8.5.35/webapps
ENTRYPOINT ["/root/training/apache-tomcat-8.5.35/bin/","run"]
  • 编译生成容器:docker build -f MyDockerfile -t mywebapp . • 启动容器:docker run -d -p 8080:8080 mywebapp
  • 通过浏览器访问Web应用
  • 登录到容器检查我们创建的镜像
docker exec -it 34217bdce6bc bash