东坡并没有有诗曰:

日建镜像三百个,不辞长用Dockerfile。

觉得镜像构建枯燥乏味?困货,快使用Dockerfile吧!

作为一枚构建镜像的老司机,下面跟大家聊聊

吊打Dockerfile的正确姿势

Docker、Dockerfile、Docker镜像、容器……这都是些啥东西?

虽是老生常谈,再再再普及一下:

- Docker最早是dotcloud公司出品的一套容器管理工具,但后来Docker慢慢火起来了,连公司名字都从dotcloud改成Docker。

- Dockerfile是Docker镜像的描述文件,可以理解成导弹发射的A、B、C、D……的步骤。

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

- 容器是运行起来的镜像,Docker镜像相当于程序,容器相当于进程。

讲了这么多,大家可能已经意识到了,攘外必先安内,想玩转Docker必须要先搞定Docker镜像,而镜像又来自于Dockerfile,因此本文从Dockerfile编写开始,与您分享Docker镜像的制作过程。

如何通过Dockerfile快速构建镜像?

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

1.创建一个Dockerfile

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

2.编写Dockerfile

2.1 环境配置

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

FROM ubuntu:14.04

通过FROM指令,Docker编译程序能够知道通过哪个基础镜像执行来进行编译。所有的Dockerfile都必须以FROM指令开始。通过该指令,我们相当于有了一个最基本的Ubuntu系统。

2.2 其他环境配置

我们可以像这样指定Dockerfile的作者

MAINTAINER example <example@goodrain.com>

另外我们需要指定时区,否则我们做出的镜像可能会跟当前时间不符。

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

我们可以像在电脑上安装Tomcat一样,把Tomcat安装在Docker容器中。

2.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的编译环境中运行指定命令。这里我安装了curl、vim、net-tools,其中curl用来获取java和tomcat的安装包,vim和net-tools用来调试,并创建了/app目录。

2.4 指定工作目录

使用 WORKDIR /app 可以将工作目录定位到/app 目录

2.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,所以会解压到此目录下)

2.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
# 启动 Tomcatexec $TOMCAT_HOME/bin/catalina.sh run

2.7指定端口

EXPOSE 8080

通常情况下,Tomcat启动后会监听8080端口,在容器中也一样。

EXPOSE指令用于标明,这个镜像中的应用将会侦听某个端口,并且希望能将这个端口映射到主机的网络界面上

2.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后可以去看看官方的做法。

7.其他

在做镜像的时候有那么多步骤,根本不可能一次将所有的步骤完成,这里给大家分享一个小技巧。

在编写完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构建的项目。可以方便大家学习。

地址:https://github.com/goodrain-apps/tomcat-demo

最后补充一点,好雨云帮目前支持Java,PHP,Python等多种语言的应用,不用自己构建具体环境,可以直接从源码进行构建,十分方便。以上说的Dockerfile也是支持的。如果有写好的程序想要跑起来可以参照好雨官方文档进行部署。

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

转载于:https://my.oschina.net/u/2939747/blog/798624

Dockerfile,你给我站住!相关推荐

  1. 在Dockerfile中设置G1垃圾回收器参数

    在Dockerfile中设置G1垃圾回收器参数 ENV JAVA_OPTS="\ -server \ -XX:SurvivorRatio=8 \ -XX:+DisableExplicitGC ...

  2. 在k8s中使用gradle构建java web项目镜像Dockerfile

    在k8s中使用gradle构建java web项目镜像Dockerfile FROM gradle:6-jdk8 AS build COPY --chown=gradle:gradle . /home ...

  3. Dockerfile springboot项目拿走即用,将yml配置文件从外部挂入容器

    Dockerfile 将springboot项目jar包打成镜像,并将yml配置文件外挂. # 以一个镜像为基础,在其上进行定制.就像我们之前运行了一个 nginx 镜像的容器,再进行修改一样,基础镜 ...

  4. Dockerfile 入门看这篇就够了

    在使用docker时,有很多像往容器中复制war包.修改容器配置之类的操作,很繁琐,配置失败或异常时就又是一遍重复的操作,这时候,就要用到这个脚本文件–Dockerfile 以下是我对Dockerfi ...

  5. IDEA的Docker插件实战(Dockerfile篇)

    IDEA的Docker插件实战(Dockerfile篇) IntelliJ IDEA的Docker插件能帮助我们将当前工程制作成Docker镜像.运行在指定的远程机器上,是学习和开发阶段的好帮手,本文 ...

  6. Docker 入门系列(7)- Dockerfile 使用(FROM、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、WORKDIR)

    Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 来快速创建自定义的镜像. 1. 基本结构 Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行. ...

  7. dockerfile kafka

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/a2267378/article/det ...

  8. Dockerfile构建实践

    Dockerfile构建实践 本文介绍了用于构建有效图像的推荐最佳实践和方法. Docker通过从一个Dockerfile文本文件中读取指令来自动构建映像,该文本文件按顺序包含构建给定映像所需的所有命 ...

  9. 客快物流大数据项目(十四):DockerFile介绍与构建过程解析

    目录 DockerFile介绍与构建过程解析 一.什么是Dockerfile 1.介绍 2.Dockerfile构建步骤

最新文章

  1. java层 android_Android开发实践:Java层与Jni层的数组传递
  2. mysql 查看表格scott_mysql查询学习第一天,针对scott
  3. PHP提高性能的几个Tips
  4. 08Vue.js快速入门-Vue综合实战项目
  5. android常用窗口动画,android 自定义dialog,窗口动画,
  6. linux双显卡配置_Kali Linux 2.0 安装 NVIDIA显卡驱动实现双显卡(联想笔记本)
  7. 【Linux】一步一步学Linux——ssh-keygen命令(178)
  8. 清除浏览器痕迹(RunDll32.exe)
  9. 支持M1芯片AE2022已发布,After Effects 2022 for MAC中文安装教程,支持Monterey系统不闪退
  10. what this book can do for you ?
  11. 请你讲讲wait方法的底层原理
  12. KVM切换器和VGA切换器的区别
  13. 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?
  14. 字节后端实习技术三面面经
  15. Xilinx 还是altera
  16. 发改委:以稳汽车消费来托住商品消费“大头”
  17. OA系统需求功能介绍
  18. 有什么好用的网站导航?
  19. 在计算机领域中不常用到的数值是,第一章计算机应用基础..doc
  20. C# STMP发送邮件简例

热门文章

  1. 如何手动触发onchange事件?
  2. 手记:在 MacBook 上运行 Linux 那些坑
  3. C/C++在VS2015下使用CURL下载文件
  4. SMIF POD晶圆传送盒CID载体读写头 TI玻璃管标签读写器
  5. 20.Memento备忘录(行为型模式)
  6. STM32开发板型号介绍和选择
  7. 3D数学之四元数 学习笔记
  8. Python 之语法糖
  9. Ubuntu16.04及以上安装TIM、微信、QQ步骤【基于deepin_wine,目前最优雅稳定的方案】
  10. 【元胞自动机】元胞自动机人流疏散【含Matlab源码 665期】