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)环境配置

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

bash

FROM ubuntu:14.04

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

(2)其他环境配置

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

bash

MAINTAINER example <example@goodrain.com>

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

bash

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

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

(3)Tomcat必要软件安装。

我们此时使用的Ubuntu系统其实是很简陋的系统,上面很多系统都没有。所以我先安装一些必要的软件。

bash

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 工具来获取安装包。

bash

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的启动。

bash

COPY tomcat7.sh /app/tomcat7.sh

RUN chmod +x /app/tomcat7.sh

上面的两行命令会将与Dockerfile同级目录的tomcat7.sh文件上传到docker容器中的/app目录下,并且给该文件赋予可执行的权限。

看一眼该脚本的内容便一目了然了。

```bash

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)指定端口

bash

EXPOSE 8080

```

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

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

(8)指定脚本的运行

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

bash

ENTRYPOINT [“/app/tomcat7.sh"]

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

3.构建镜像

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

出现如下信息就构建成功了

4.运行Docker容器

bash

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

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

  • -t 在容器指定一个伪终端或者终端;
  • -i 进行命令交互;
  • -p 匹配镜像内的网络端口号,即我们可以通过宿主机中访问5000端口来达到访问容器8080端口的目的。

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

bash

docker images  #查看镜像

bash

docker ps -a #查看所有的容器

6.查看服务是否运行

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

至此,我们就成功的创建了一个Tomcat镜像了,当然这里只是为了简单演示,所以镜像做的比较简单,官方的Tomcat镜像比这复杂的多,在熟悉了Dockerfile后可以去看看官方的做法。

6.其他

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

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

bash

COPY run.sh /app/run.sh

RUN chmod +x /app/run.sh

ENTRYPOINT [“/app/run.sh"]

run.sh脚本的内容如下

bash

!/bin/bash

sleep 15

while true

do

echo &quot;true&quot;

sleep 180

done

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

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

bash

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

冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径,这样容器内更改的数据就被写到宿主机上了。

拥有了Tomcat服务器后,就可以跑写好的java-web程序了,如何运行java-web程序就不在此详述了,跟普通运行java-web程序一样。

同样的,如果你有一个web应用,将其放入Docker容器中,写好Dockerfile,构建好应用运行需要的环境后,就可以很快的使用应用了。

Docker学习总结(17)——学会使用Dockerfile的更多相关文章

  1. docker学习笔记:简单构建Dockerfile【Docker for Windows】

    参考与入门推荐:https://www.cnblogs.com/ECJTUACM-873284962/p/9789130.html#autoid-0-0-9 最近学习docker,写一个简单构建Doc ...

  2. docker学习笔记17:Dockerfile 指令 ONBUILD介绍

    ONBUILD指令可以为镜像添加触发器.其参数是任意一个Dockerfile 指令. 当我们在一个Dockerfile文件中加上ONBUILD指令,该指令对利用该Dockerfile构建镜像(比如为A ...

  3. Docker学习笔记(2):使用Dockerfile构建镜像

    Dockerfile是用来构建Docker镜像的文件,是由一系列命令和参数构成的脚本.每条指令都必须为大写字母且后面要跟随至少一个参数,每条指令都会创建一个新的镜像层,并对镜像进行提交. Docker ...

  4. docker学习笔记-06:自定义DockerFile生成镜像

    一.自定义centos的DockerFile 1.从阿里源里拉的centos镜像新建的容器实例中,没有vim编辑器和ifconfig命令,所以自定义centos的DockerFile,创建自己想要的镜 ...

  5. docker学习笔记(4)——Dockerfile

    参考资料: 1.官网教程:https://docs.docker.com/engine/reference/builder/ (官网教程,稍后我做一下总结和翻译输出到本文) 2.官网练习推荐:http ...

  6. docker学习笔记6:利用dockerfile创建镜像介绍(生成简单web服务器镜像)

    本文介绍如何利用dockerfile来创建镜像.下面介绍具体的操作过程: 一.创建构建环境 操作示例如下: xxx@ubuntu:~$ pwd /home/xxx xxx@ubuntu:~$ mkdi ...

  7. Docker 学习笔记 (一)Dockerfile 创建本地镜像

    一.测试环境 OS version: CentOS Linux release 7.5.1804 (Core) docker cluster : master 1 + data node 4 dock ...

  8. docker学习笔记(二)-dockerfile docker仓库

    dckerfile2这样写才对,不然打印的是hello $name 例子 登陆https://hub.docker.com 上面是提交到公共仓库 创建本地私有仓库 开启另外一个虚机,将重新构建上传镜像 ...

  9. Docker 学习8 Dockerfile详解2

    一.继续上章节Docker学习7 CMD命令后. 11.ENTRYPOINT a.容器启动后相当于会启动ENTRYPOINT + CMD 命令,CMD相当于参数传给entrypoint的 [root@ ...

随机推荐

  1. “ResGen.exe”已退出,代码为 -1073741701 或 “ResGen.exe”已退出,代码为 2。

    解决的办法如下: 1.关闭所有Visual Studio: 2.以管理员的身份打开命令提示窗口:(开始-运行-cmd) 3.更改目录至"CD C:\Program Files (x86)\M ...

  2. Eclipse使用Tomcat发布项目时出现YadisException异常解决方案

    调整使用Eclipse的JDK版本,大概JDK版本过低会出现这个org.openid4java.discovery.yadis.YadisException: 0x704: I/O transport ...

  3. Linux学习系列八:操作网口

    一些相对高性能的单片机会带以太网接口,网口在MCU里算是比较复杂的外设了,因为它涉及到网络协议栈,通常情况下网络协议栈会运行在一个RTOS中,所以对普通单片机开发者来说网口使用起来相对难度较大一些.在 ...

  4. LOJ#557. 「Antileaf's Round」你这衣服租来的吗(FHQ Treap+珂朵莉树)

    题面 传送门 题解 好吧我是不太会复杂度分析-- 我们对于每种颜色用一个数据结构维护(比方说线段树或者平衡树,代码里写的平衡树),那么区间询问很容易就可以解决了 所以现在的问题是区间修改,如果区间颜色 ...

  5. Linux系统编程---文件I/O(open、read、write、lseek、close)

    文件描述符 定义:对内核而言,文件描述符相当于一个文件的标识,它是一个非负整数,当打开(open)一个现有文件或者创建(creat)一个新文件时,内核会向进程返回一个文件描述符 在unix中(文件描述 ...

  6. 启动tomcat报错:ImageFormatException

    启动某工程报错: java.lang.NoClassDefFoundError: com/sun/image/codec/jpeg/ImageFormatException 查找此类存在于jdk的rt ...

  7. Troubleshooting Guide for ORA-12541 TNS: No Listener

    Server side checks (not platform specific): 1)  Check the result on the server using tnsping to the ...

  8. dubbo与springmvc的简单使用

    什么是Dubbo? dubbo是阿里巴巴公司开源的高性能优秀服务框架,通过高性能的RPC(远程服务调用)实现服务的输入输出功能,可以与spring框架无缝整合: 传统的架构所有的模块都在一台服务器上, ...

  9. jquery实现点击进入新的页面。(jquery实现超链接)

    <script src="jquery-1.9.1.min.js" type="text/javascript"></script> & ...

  10. 读《实战GUI产品的自动化测试》:第一步——了解自动化测试,简单RFT的录制回放实例

    1.了解自动化测试,什么是自动化测试?(可以参数百度百科“自动化测试”) 2.了解自动化测试 * 自动化测试如何改善产品的质量 * 自动化测试无法完全替代手工测试 * 自动化测试无法发现新的问题——适 ...