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
在阿里云的镜像仓库中可以看到刚上传的镜像