2019独角兽企业重金招聘Python工程师标准>>>

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

百度AI开发者大赛带你边学边开发,赢100万奖金,加群:418589053   

0

收藏(5)

东坡有诗:日建镜像三百个,不辞长用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

(1)环境配置

FROM ubuntu:14.04

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

(2)其他环境配置

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的编译环境中运行指定命令。这里我安装了curl、vim、net-tools,其中curl用来获取java和tomcat的安装包,vim和net-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

转载于:https://my.oschina.net/u/3367404/blog/1932917

Docker修炼第一招: 先从Dockerfile开始相关推荐

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

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

  2. Docker的安装和使用及dockerfile简单使用

    Docker的安装和使用及dockerfile简单使用 一.简介 Docker是一个基于go语言的开源的应用容器引擎,可以将开发者的应用及依赖包打包到一个可移植容器当中,然后发布到任何流行的Linux ...

  3. 葵花宝典第一招:唐氏均线成交量参数

    不知道大家在炒股初期是不是有这样的错觉:买了就跌,卖了就涨.注意注意,对我来说不是错觉不是错觉.但是经过多年修炼,终于让我练成了葵花宝典,总结出选股技巧11招,摆脱了被割韭菜的命运.下面是第一招,分享 ...

  4. 云计算之路-阿里云上:消灭“黑色n秒”第一招——不让CPU空闲

    昨天对"黑色n秒"问题的最终猜想以失败而告终,从而让我们结束了被动猜想阶段,进入了主动进攻阶段--出招. 今天出第一招--用C#写个小程序,让其在每个CPU核上运行一个线程,不让任 ...

  5. 实战:Docker容器虚拟化技术(使用DockerFile构建镜像并搭建 swarm+compose集群)5

    实战:Docker容器虚拟化技术 (使用DockerFile构建镜像并搭建 swarm+compose集群)5 要求: 使用DockerFile构建镜像并搭建 swarm+compose集群 在Swa ...

  6. Docker之使用maven插件【Dockerfile方式】构建并推送镜像到私有仓库

    准备工作 操作系统版本 [root@node02 ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) docker版本 [ ...

  7. 炒股第一招【看盘技巧】

    炒股第一招[看盘技巧] 2015-04-05 龚凯杰 龚凯杰 炒股第一招[看盘技巧] 2015年3月27日 15:31 阅读63401 删除 每一天的大盘几乎都有盘中跳水,但很多时候是被拉回来的~~那 ...

  8. 第一招:考拉网,菜鸟的市场就是蓝海

    互联网创新模式三十六招第一招:考拉网,菜鸟的市场就是蓝海 一,蓝海的优势 二,考拉网的介绍 三,如何找到真正蓝海和"伪蓝海" 四,考拉网与蓝海 五,互联网的感慨 引言:" ...

  9. IT项目管理第一招:摆正心态,做好沟通

    这个系列的开篇早早写好了,但是好长时间没想好这第一招是什么.我自己想的是第一招必须是非常关键和重要的,想来想去觉得对于一个程序员来说,如果要转项目经理,最重要的是要摆正自己的心态,做好自己的心理建设, ...

最新文章

  1. #define WIN32_LEAN_AND_MEAN 的作用
  2. nginx的tmp文件过大导致磁盘空间不足一例
  3. 虚拟机安装CentOS6.3及常见问题总结
  4. 数据库之事务及事务的 ACID 性质
  5. 常用的生物学数据库及网站介绍,你都了解了吗?
  6. 【Python】Pandas groupby加速处理数据
  7. WaitForSingleObject
  8. 用户细分_基于购买历史的用户细分
  9. 性能php 教程,提高PHP性能效率的几个技巧
  10. 为什么钉钉里的图片打开得更快了? | 凌云时刻
  11. 关于android中的armeabi、armeabi-v7a、arm64-v8a及x86等
  12. chrome 书签恢复_如何在Chrome和Firefox中恢复意外删除的书签
  13. vue,el-image 图片引入根路径@无效
  14. iOS 抽奖程序 可指定版
  15. 高难度c语言编程题,高难度脑筋急转弯题目合集带答案
  16. <Zhuuu_ZZ>Map接口和equals重写
  17. 14. Setting Ta and RTO【设置Ta和RTO】
  18. 爬取网易buff CSGO饰品数据
  19. keil调试stm32MCU的时候没有黄色箭头的一个处理办法
  20. 双重否定表肯定,所以死鬼是活人吗?

热门文章

  1. jsf tree组件_JSF UI组件标签属性示例教程
  2. lstrip和rstrip_Python装饰字符串– rstrip(),lstrip(),strip()
  3. 运行Eclipse出错:Failed to load the JNI shared library
  4. ubuntu下安装英汉词典——stardict
  5. 深入了解C++的广泛应用
  6. 什么是接口?如何定义接口?如何实现接口?
  7. 云和物联网(IoT)是不可分割的,因为物联网需要云来运行和执行
  8. Mybatis学习笔记 4:Mybatis 连表查询(一)——一对多关系
  9. 无需Docker, 5分钟徒手DIY 一个Linux容器
  10. Python零基础学习系列之三--Python编辑器选择