Dockerfile构建镜像

一、介绍

DockerFile 就是用来构建docker 镜像构建文件,其实就是一段脚本命令,通过这个脚本可以生成镜像

构建镜像步骤:

1、编写一个dockerfile文件

2、docker build 构建成为一个镜像

3、docker run 镜像

4、docker push 发布镜像(可以发布到dockerhub、阿里云镜像仓库)

扩展:

Docker已经成为企业交付的标准,说白了,每次不在是打包一个jar 或者 war ,而是一个镜像。

DockerFile :构建文件,定义了一切步骤,类似源代码

Docker Images:通过DockerFile构建生成的镜像,最终发布和运行的产品

Docker容器:容器就是镜像运行起来提供服务器

二、Docker官方镜像

我们先来看一下Docker的官方镜像是怎么构建的,以centos为例

下面这个就是centos7的某个版本的Dockerfile

所以我们也可以通过dockerfile构建自己镜像。需要提一下,以构建tomcat镜像为例,构建自己的镜像,还是需要依赖于基础的镜像,如centos,然后再加上自己的jdk, tomcat等,通过dockerfile构建完成之后,可以再对镜像进行修改,再重新commit成一个新的镜像,这个在上一篇中提到过。

三、Dokcerfile指令

1. 基础知识

  • 每个保留字即指令都必须是大写
  • 有执行顺序,从上到下执行
  • “#”表示注解
  • 每一个指令都会创建提交一个新的镜像层

2. Dockerfile 指令说明

dockerfile 中常见的指令

注意:

CMD指令:指定这个容器启动时要运行的命令,如果有多个CMD,只有最后会生效
ENTRYPOINT指令:指定这个容器启动时要运行的命令,可以在启动时追加命令

四、Dockerfile构建Tomcat镜像

tomcat8.5+jdk8为例

1. 准备构建镜像的文件

tomcat8.5和jdk8的压缩包,创建一个名字叫Dockerfile的文件,和一个readme.txt文件

2. 编写Dokcerfile

注意,文件名称使用Dokcerfile,build会自动寻找这个文件,就不需要-f指定了

FROM         centos
MAINTAINER   wangzhen<miles_wang1@outlook.com>

#目录变量
ENV WORK_PATH /usr/local

#设置工作目录
WORKDIR $WORK_PATH

#把readme.txt添加到镜像中
COPY readme.txt /usr/local/readme.txt

#把java与tomcat添加到容器中
ADD jdk-8u281-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.5.33.tar.gz /usr/local/

#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_281
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.33
ENV CATALINA_BASE /usr/local/apache-tomcat-8.5.33
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

#配置容器时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone

#容器运行时监听的端口
EXPOSE  8080

#启动时运行tomcat,并监听日志
CMD /usr/local/apache-tomcat-8.5.33/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.33/logs/catalina.out

注意:文件中配置环境时,需要预先知道各个文件解压后的文件名,否则配合将出错

3. 构建镜像

注意后面有个英文的点".",其实是在指定镜像构建过程中的上下文环境的目录。

-t 镜像名:版本号

docker build -t tomcat8.5-jdk8:5.0 .

4. 镜像启动测试

首先通过docker images命令可以看到新创建的镜像

然后启动测试

docker run -d -p 7001:8080 --name mytomcat8.5 tomcat8.5-jdk8:5.0

查看日志是否启动成功

docker logs -f -t --tail=100 容器ID

五、提交镜像到DockerHub

首先需要注册一个DockerHub账号,dockerhub官网地址

1. 先登录

docker login -u mileswangzhen

2. push镜像

使用docker push 镜像名:版本号,这个命令,但是需要注意,直接提交是失败的,因为可能存在的已有的镜像名

所以我们可以使用tag命令给tomcat8.5-jdk8:5.0换个标签名, 然后容器中会多出一个镜像新的mileswangzhen/tomcat8.5-jdk8:5.0,最后将这个镜像push上去,国内可能由于墙的原因,可能会很慢,用阿里云的镜像容器会好一点。

docker tag tomcat8.5-jdk8:5.0 mileswangzhen/tomcat8.5-jdk8:5.0
docker push mileswangzhen/tomcat8.5-jdk8:5.0

最后我们可以在dockerhub中看到这个镜像了

六、提交镜像到阿里云

具体操作类似,不过需要先创建一个自己的镜像仓库

1. 找到阿里云镜像服务

2. 创建命名空间和镜像仓库

3. 上传镜像

#登录,这里需要输入密码,密码为设置的固定密码
docker login --username=星悬玉桥 registry.cn-hangzhou.aliyuncs.com

#docker tag <镜像ID> registry.cn-hangzhou.aliyuncs.com/<命名空间名称>/<镜像仓库名称>:[镜像版本号]
docker tag 489ba3a076f5 registry.cn-hangzhou.aliyuncs.com/mileswangzhen/tomcat8.5-jdk8:5.0

#docker push registry.cn-hangzhou.aliyuncs.com/<命名空间名称>/<镜像仓库名称>:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/mileswangzhen/tomcat8.5-jdk8:5.0

4. 执行结果

由于之前执行过一次,所以部分是layer already exists,如果没有执行过,那些镜像层都是pushed

在阿里云的镜像仓库中可以看到刚上传的镜像