Docker修炼第一招: 先从Dockerfile开始

东坡有诗:日建镜像三百个,不辞长用Dockerfile。
以为镜像构建枯燥乏味?困货,快来根Dockerfile吧!
做为一枚构建镜像的老司机,下面跟你们展现一篇Dockerfile实战。java

Docker、Dockerfile、Docker镜像、容器这些都是什么鸟?

老生常谈,再再再……普及一下:linux

  • Docker:最先是dotCloud公司出品的一套容器管理工具,但后来Docker慢慢火起来了,连公司名字都从dotCloud改为Docker。git

  • Dockerfile: 它是Docker镜像的描述文件,能够理解成火箭发射的A、B、C、D……的步骤。github

  • Docker镜像: 经过Dockerfile作出来的,包含操做系统基础文件和软件运行环境,它使用分层的存储方式。web

  • 容器: 是运行起来的镜像,简单理解,Docker镜像至关于程序,容器至关于进程。docker

讲了这么多,你们可能已经意识到了,想玩转Docker必须先要搞定Docker镜像,镜像又来自于 Dockerfile,所以本文从Dockerfile编写开始,与您分享Docker镜像的制做过程,里面有 经验,有 技巧,还有 彩蛋~!apache

如何经过Dockerfile快速构建镜像

接下来,咱们经过构建一个Tomcat镜像,来演示Dockerfile的使用方法,固然前提是你的电脑安装了Docker环境,如何安装Docker环境就不在此赘述了。ubuntu

一、建立一个Dockerfile

Dockerfile命名必须为“Dockerfile”,Docker镜像构建时,会查找指定目录中的Dockerfile。vim

二、编写Dockerfile

(1)环境配置

首先,咱们须要指定一个基础镜像,为了方便,咱们从Ubuntu镜像开始。tomcat

FROM ubuntu:14.04

经过FROM指令,Docker编译程序可以知道经过哪一个基础镜像执行来进行编译。全部的Dockerfile都必须以FROM指令开始。经过该指令,咱们至关于有了一个最基本的Ubuntu系统。

(2)其余环境配置

咱们能够像这样指定Dockerfile的做者。

MAINTAINER example <example@goodrain.com>

另外咱们须要指定时区,不然咱们作出的镜像可能会跟当前时间不符。

RUN echo "Asia/Shanghai" > /etc/timezone;dpkg-reconfigure -f noninteractive tzdata

咱们能够像在电脑上安装Tomcat同样,把Tomcat安装在Docker容器中。

(3)Tomcat必要软件安装。

咱们此时使用的Ubuntu系统实际上是很简陋的系统,上面不少系统都没有。因此我先安装一些必要的软件。

RUN apt-get update && apt-get install -y curl vim net-tools && \
    rm -rf /var/lib/apt/lists/* && mkdir -p /app

RUN 指令用来在Docker的编译环境中运行指定命令。这里我安装了curlvimnet-tools,其中curl用来获取javatomcat的安装包,vimnet-tools用来调试,并建立了/app目录。

(4)指定工做目录

使用 WORKDIR /app 能够将工做目录定位到/app 目录下

(5)获取安装软件

咱们使用 第 (3)步 安装的 curl 工具来获取安装包。

RUN  curl -L 'http://download.oracle.com/otn-pub/java/jdk/7u65-b17/jdk-7u65-linux-x64.tar.gz' -H 'Cookie: oraclelicense=accept-securebackup-cookie; gpw_e24=Dockerfile' | tar -xz \
    && curl -L 'http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.8/bin/apache-tomcat-7.0.8.tar.gz' | tar -xz

以上命令将会从指定地址下载安装包,并解压到当前目录(上一步咱们指定了工做空间为/app,因此会解压到此目录下)

(6)指定运行脚本

截止到上一步,咱们已经将须要的准备工做都作好了,剩下的还有Java环境变量的设置,Tomcat环境变量设置(非必须)和Tomcat的启动。

COPY tomcat7.sh /app/tomcat7.sh
RUN chmod +x /app/tomcat7.sh

上面的两行命令会将与Dockerfile同级目录的tomcat7.sh文件上传到docker容器中的/app目录下,而且给该文件赋予可执行的权限。
看一眼该脚本的内容便一目了然了。

# Java环境变量配置
export JAVA_HOME=/app/jdk1.7.0_65
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# Tomcat环境变量配置
export TOMCAT_HOME=/app/apache-tomcat-7.0.8
export PATH=$TOMCAT_HOME/bin:$PATH

# 启动 Tomcat
exec $TOMCAT_HOME/bin/catalina.sh run

(7)指定端口

EXPOSE 8080

一般状况下,Tomcat启动后会监听8080端口,在容器中也同样。
EXPOSE指令用于标明,这个镜像中的应用将会侦听某个端口,而且但愿能将这个端口映射到主机的网络界面上

(8)指定脚本的运行

至此,咱们要作的准备工做就作完了。使用下面这条命令,运行咱们在第6步建立的脚本,一个简单的Tomcat的Dockerfile就编写完成了。

ENTRYPOINT [“/app/tomcat7.sh"]

ENTRYPOINT 用于标明一个镜像做为容器运行时,最后要执行的程序或命令。

3.构建镜像

进入Dockerfile所在目录,运行命令 docker build -t mytomcat . (注意最后有个点用来表示当前目录,初次构建速度会比较慢,须要多等一会。)

图片描述

出现以下信息就构建成功了
图片描述

4.运行Docker容器

docker run -i -t -p 5000:8080 mytom

其中,docker run 用于运行一个容器

  • -t 在容器指定一个伪终端或者终端;

  • -i 进行命令交互;

  • -p 匹配镜像内的网络端口号,即咱们能够经过宿主机中访问5000端口来达到访问容器8080端口的目的。

5.查看构建好的镜像和运行的容器

docker images  #查看镜像

图片描述

docker ps -a #查看全部的容器

图片描述

6.查看服务是否运行

在宿主机中咱们输入localhost:5000访问,出现以下界面,表示Tomcat成功运行。

图片描述

至此,咱们就成功的建立了一个Tomcat镜像了,固然这里只是为了简单演示,因此镜像作的比较简单,官方的Tomcat镜像比这复杂的多,在熟悉了Dockerfile后能够去看看官方的作法。

6.其余

在作镜像的时候有那么多步骤,根本不可能一次将全部的步骤完成,因此,这里教给你们一个 小技巧

在编写完Dockerfile到第二步的时候,其实能够先使用一个脚本先运行着,而后进入容器内部进行操做。笔者在编写Dockerfile时先使用以下命令

COPY run.sh /app/run.sh
RUN chmod +x /app/run.sh
ENTRYPOINT [“/app/run.sh"]

run.sh脚本的内容以下

#!/bin/bash
sleep 15
while true
do
  echo "true"
  sleep 180
done

其实就是一段死循环代码代替原有的tomcat7.sh,接着就能够build和run咱们的容器了。容器运行起来后使用docker exec -it container_id bash 进入docker容器。此时就和咱们平时装软件的方式同样了,作完一个步骤,在Dockerfile中记录一条,这样Dockerfile也就作出来了。(ps:exit退出容器。)

特别注意的一点,若是作好镜像之后,在镜像中有须要保存的数据(持久化目录)须要咱们在Dockerfile中指定持久化目录。为了可以保存(持久化)数据以及共享容器间的数据,Docker提出了Volume的概念。简单来讲,Volume就是目录或者文件,它能够绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。而且咱们运行容器的时候须要使用使用 -v 来声明Volume,如:

docker run -it -v /home/dock/logs:/usr/logs tomcat /bin/bash

冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径,这样容器内更改的数据就被写到宿主机上了。
拥有了Tomcat服务器后,就能够跑写好的java-web程序了,如何运行java-web程序就不在此详述了,跟普通运行java-web程序同样。

一样的,若是你有一个web应用,将其放入Docker容器中,写好Dockerfile,构建好应用运行须要的环境后,就能够很快的使用应用了。

Dockerfile源码已放到好雨的github公共仓库了,上面有不少使用Dockerfile构建的项目。能够方便你们学习。地址:tomcat-demo

彩蛋环节

好雨云帮 目前支持Java,PHP,Python等多种语言的应用,不用本身构建具体环境,能够直接从源码进行构建,十分方便。以上说的Dockerfile也是支持的。若是有写好的程序想要跑起来能够参照好雨官方文档进行部署。


做者:超儿哥好雨科技 平台研发部

相关文章
相关标签/搜索