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] 840. Magic Squares In Grid_Easy

    A 3 x 3 magic square is a 3 x 3 grid filled with distinct numbers from 1 to 9 such that each row, co ...

  2. WINDOWS SERVER 2008远程桌面端口修改方法

    微软默认的服务器远程端口是3389,这是被很多黑客利用的端口,如何修改掉了,下面我们来说方法很多朋友在使用WINDOWS操作系统的时候,都喜欢修改远程连接的默认端口.但是很多朋友由于修改端口的方法错误 ...

  3. Hadoop2.6的DataNode启动不了

    2016-05-04 18:14:51,990 INFO org.apache.hadoop.ipc.Server: IPC Server Responder: starting 2016-05-04 ...

  4. ROSETTA使用技巧随笔--PyMOL实时观测ROSETTA模拟过程中的结构变化

    没有梦想的人,就是一只咸鱼,像我,就有一个梦想,就是让蛋白模拟过程变成动画,动起来! 虽然MD中有很多方法可以方模拟过程像动画一样播放出来,但是我一直想在ROSETTA中也找一个这样的功能,这不,我发 ...

  5. LA 4992 Jungle Outpost(半平面交)

    Jungle Outpost [题目链接]Jungle Outpost [题目类型]半平面交 &题解: 蓝书282 我自己写的代码居然AC了!!! 刘汝佳的说要right要-3什么的,还要特判 ...

  6. LeetCode110.平衡二叉树

    一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1. 示例 1: 给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7 返回 true . 示例 ...

  7. 2.匿名类,匿名类对象,private/protected/public关键字、abstract抽象类,抽象方法、final关键字的使用,多线程Thread类start方法原理

    package com.bawei.multithread; //注意:模板方法我们通常使用抽象类或者抽象方法!这里我们为了方便在本类中使用就没有使用抽象类/抽象方法 public class Tem ...

  8. C#深入研究ArrayList动态数组自动扩容原理

    1 void Test1() { ArrayList arrayList = new ArrayList(); ; ; i < length; i++) { arrayList.Add(&quo ...

  9. UIView的背景颜色

    一个UIColor代表一种颜色,通过UIColor的类方法,可以获得很多常用的颜色 + (UIColor *)blackColor;      // 0.0 white 黑色 + (UIColor * ...

  10. STL容器之set

    [1]set容器 一个集合(set)是一个容器,它其中所包含的元素的值是唯一的. [2]set容器方法 (1)set构造函数.插入函数.遍历过程 应用示例代码如下: #include <set& ...