CentOS Linux release 7.2.1511

Docker version 17.03.1-ce

首先应该了解docker镜像的分层机制,这个网上文章很多,简单说就是对镜像的每次修改都是在原镜像基础上加了一层包装;

构建自己的docker镜像有两种方式;

一种是在启动容器后,直接对容器进行操作,然后commit,好处是方便直观,但会导致很多中间层,且不好追溯,所以不推荐这样用;

另一种是编辑dockerfile,然后通过docker build生成镜像,下面详细说说如何使用dockerfile构建一个带jdk的centos镜像;

先准备一个文件夹img,把需要的文件放到子文件夹resource中,这里还拿了一个rpm文件演示如何安装,如下:

img/
├── Dockerfile
└── resource
    ├── jdk1.7.0_65
    ├── nc-1.84-22.el6.x86_64.rpm

文件Dockerfile的内容如下:

FROM daocloud.io/centos:latest

COPY resource /usr/local

RUN cd /usr/local \
    && rpm -ivh nc-1.84-22.el6.x86_64.rpm \
&& yum install which -y \
&& rm -rf nc-1.84-22.el6.x86_64.rpm \
&& yum clean all ENV JAVA_HOME=/usr/local/jdk1.7.0_65/jre
ENV CLASSPATH=.:$JAVA_HOME/lib \
    PATH=$JAVA_HOME/bin:$PATH

FROM  必须位于第一行,表示基础镜像,这里为centos,若不需要任何基础环境就用scratch;

COPY  拷贝宿主机的资源到镜像,这里是将resource下所有东西拷贝到镜像的/usr/local/目录;

RUN    镜像中执行命令,这里安装了一个rpm包和yum安装which命令,然后进行了清理;

     这里把多个命令合并到一个RUN语句是为了减少层数;

ENV     设置镜像的环境变量,由于后面两个变量依赖JAVA_HOME,所以必须分到两个ENV语句了;

其他命令还有:ADD/CMD/ENTRYPOINT/VOLUME/ARG/EXPOSE/WORKDIR/USER/HEALTHCHECK/ONBUILD等;

下面构建镜像:

# cd img/
# docker build -t my/base .
# docker images
  REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
  my/base              latest              2cdd09a142e5        24 seconds ago      359MB
  daocloud.io/centos   latest              a8493f5f50ff        4 days ago          192MB

.   命令最后传入的是build的工作目录,这个工作目录是很重要的;

    工作目录里所有的文件会传输到docker服务端,而且dockfile中指定文件时(COPY那行的resource)必须是工作目录的相对路径;

所以,在img目录外面这样build也是一样的:

     docker build -t my/base img/

-t  指定镜像在仓库的名字;

-f  指定dockfile,因为我们这里用的默认名称Dockerfile,所以不用指定;

--network=host  build也是启动了一个镜像执行的,因为默认的bridge网络模式有网络损耗,所以如果build中包含较多外网访问,建议改为host:

          docker build --network=host -t my/base .

下面启动测试下这个镜像:

# docker run --name mb -dti my/base
c86b648c10174271e080f90e8d437a4ee2e25993003bdc68317477514349cb10
# docker attach mb
[root@c86b648c1017 /]# which java
  /usr/local/jdk1.7.0_65/jre/bin/java
[root@c86b648c1017 /]# java -version
    java version "1.7.0_65"
    Java(TM) SE Runtime Environment (build 1.7.0_65-b17)
    Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode)

over

使用dockerfile构建自己的镜像的更多相关文章

  1. docker通过dockerfile构建JDK最小镜像,Docker导出导入镜像

    docker通过dockerfile构建JDK最小镜像,Docker导出导入镜像 一.docker通过dockerfile构建JDK最小镜像 1.1 下载JRE 1.2 解压JRE,删除相关不需要文件 ...

  2. Docker 使用 Dockerfile 构建自己的镜像

    可以使用Dockerfile的配置文件方式进行构建自己的镜像 下面利用docker构建一个Caddy web服务器 构建脚本 Dockerfile有自己的命令,下面使用了一些比较常用的命令,更多的Do ...

  3. Docker使用Dockerfile构建新的镜像

    构建镜像步骤; 1.创建Dockerfile文件,该文件是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明. vim Dockerfile //每一个指令都会在镜像上创建一个新 ...

  4. 使用dockerfile构建镜像(docker build)

    Docker buidl .  找出当前文件夹下的Docker build文件名的文件 Docker build -t  centos(镜像名) . 在当前目录下找centos的镜像文件 Docker ...

  5. 用Dockerfile构建docker image

    dockerfile是为快速构建docker image而设计的,当你使用docker build 命令的时候,docker 会读取当前目录下的命名为Dockerfile(首字母大写)的纯文本文件并执 ...

  6. 使用Docker构建jdk1.8镜像

    一.下载centos镜像 下载自己需要的版本TAG,详见: docker安装指定版本TAG的镜像 $ sudo docker pull centos:centos7 二.下载jdk1.8,并上传到/u ...

  7. 利用Dockerfile构建一个基于centos 7,包括java 8, tomcat 7,php ,mysql+mycat的镜像

    Dockerfile内容如下: FROM centos MAINTAINER Victor ivictor@foxmail.com WORKDIR /root RUN rm -f /etc/yum.r ...

  8. 使用Dockerfile构建镜像-Docker for Web Developers(5)

    1.理解Dockerfile语法 语法命令 命令功能 举例 FROM 所有的dockerfile都必须以FROM命令指定镜像基于哪个基础镜像来制作 FROM ubuntu:14:04 MAINTAIN ...

  9. 使用Dockerfile构建镜像

    Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile快速创建自定义的镜像.它类似shell脚本,由一行行命令组成,支持以#开头的注释行.一般而言,Dockerfile分为四部 ...

随机推荐

  1. [LeetCode] 619. Biggest Single Number_Easy tag: SQL

    Table number contains many numbers in column num including duplicated ones.Can you write a SQL query ...

  2. js模拟队列----小优先队列

    队列:先进先出,后进后出 var Queue = (function(){ var item = new WeakMap(); class Queue{ constructor(){ item.set ...

  3. WinRAR 5.40 & 4.20 & 3.93 的注册码 - rarreg.key

    把下面的数据复制到“记事本”中,用文件名“rarreg.key”命名该文件,保存到WinRAR安装文件夹即完成注册. 以下4个Key随便选一个复制都可以. WinRAR 5.40 版Key,复制箭头中 ...

  4. 看开源代码利器—用Graphviz + CodeViz生成C/C++函数调用图(call graph) - 转

    From http://www.linuxidc.com/Linux/2015-01/111501.htm 实际按照上文操作,主要是安装gcc-4.6.2出现一些问题,原先在cygwin下安装,结果提 ...

  5. (转载)Spring定时任务的几种实现

    spring框架定时任务 一.分类 从实现的技术上来分类,目前主要有三种技术(或者说有三种产品): Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerT ...

  6. Dockerfile详解(一)

    Dockerfile 用于自动化构建一个docker镜像.Dockerfile里有 CMD 与 ENTRYPOINT 两个功能咋看起来很相似的指令,开始的时候觉得两个互用没什么所谓,但其实并非如此: ...

  7. 关于调用数据库函数executeUpdate抛出异常

    2018.06.11写一个web程序的时候发现了一个问题,解决了好几天都没解决,并且也找不到问题所在.偶然百度找到了根源所在,希望可以帮到大家. 1 在调用这个函数的时候一直抛异常.刚开始我还以为是代 ...

  8. python 定义函数 调用函数

    创建test.py文件 #coding=utf-8 #定义函数 def hello(): print "hello world" #调用函数 hello() 在cmd下面运行

  9. 《大话设计模式》c++实现 工厂模式

    工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端 ...

  10. asp.net GridView增加删除功能

    protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)    {        string id ...