• 使用Dockerfile制作自己的Docker镜像


    一、背景

      一直以来的开发流程都是先从Docker Hub中获取到基础镜像,之后在这个镜像的基础上做开发,以满足一定的需求或者提供某种服务,并由此产生新的镜像,然后就可以push到Docker Hub中。

      那么究竟如何在制作自己的的镜像的?

      本次,我会介绍Dockerfile的基本知识语法,带大家构建一个自己的镜像。

    二、Dockerfile简介

    2.1 先看一个简单例子

    Dockerfile的注释都是以“#”开始的,每一行都是一个指令,一般情况下,Dockerfile由4个部分组成:基础镜像信息,维护者信息,镜像操作指令和容器启动指令。例如:

    # Version 0.1

    # 基础镜像

    FROM ubuntu:14.04

    # 维护者信息

    MAINTAINER zhangyongli

    # 镜像操作命令

    RUN apt-get -yqq update && apt-get install -yqq apache2 && apt-get clean

    # 容器启动命令

    CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

    注意:如果是使用Dockerfile来构建镜像,Dockerfile第一条有效指令(注释除外),必须是基础镜像指令,维护者信息紧随其后。下面具体介绍下其指令。

    2.2 Dockerfile指令

    2.2.1 FROM指令

    指定即将制作的镜像,继承哪位镜像。

    格式:FROM <image> 或 FROM <image>:<tag>

    2.2.2 MAINTAINER指令

    指定维护者信息

    格式:MAINTAINER <name>

    2.2.3 RUN指令

    执行shell命令的,当解析Dockerfile时,遇到RUN指令,将自动翻译为/bin/sh -c “xxxx”

    格式:RUN <command>

    2.3.4 CMD指令

    指启动容器时执行的命令,每个Dockerfile只能有一条CMD指令,如果指定了多条CMD,只有最后一条会被执行。

    格式:1. CMD command param1 param2

          2. CMD [“executable”,”param1”,”param2”]

          3. CMD [“param1”,”param2”]

    (特别说明,如果用户启动容器时制订了运行的命令,则会覆盖掉CMD指定的指令)

    2.3.5 ENV指令

    指定一个环境变量,会被后续的RUN指令使用,并在容器运行时保持。

    ENV <key> <value>

    2.3.6 ADD指令

    复制指定<src>到容器中的<dest>中,可以是Dockerfile所在目录的一个相对路径,也可以是一个URL,还可以是一个tar文件(自动解压为目录)

    ADD <src> <dest>

    2.3.7 COPY指令

    复制本地主机<src>到容器中的<dest>中,当使用本地目录为源目录时,推荐使用

    COPY <src> <dest>

    三、Docker镜像制作

    3.1 编写Dockerfile文件

    新建一个Dockerfile文件,里面填写上之前简单例子所包含内容

    vi Dockerfile

    文件内容如下:

    # Version 0.1

    # 基础镜像

    FROM ubuntu:latest

    # 维护者信息

    MAINTAINER zhangyongli

    # 镜像操作命令

    RUN apt-get -yqq update && apt-get install -yqq apache2 && apt-get clean

    # 容器启动命令

    CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

    3.2 制作镜像

    进入Dockerfile目录,执行

    docker build -t 镜像名称:tag标识 .

    当执行一步步执行完成后,出现Successfully built 时,则表示创建镜像成功。

    3.3 验证

    输入命令:

    docker run -d -p 80:80 --name webtest myiserver:v1

    然后浏览器访问80端口 即可看到apache2 默认页面。

    四、进阶

    4.1 准备工作

    将iServer 811安装包,放到/opt/docker_images下。

    4.2 使用国内源

    当前目录下,

    vi sources.list_aliyun

    添加以下内容:

    deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted

    deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted

    deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted

    deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted

    deb http://mirrors.aliyun.com/ubuntu/ trusty universe

    deb-src http://mirrors.aliyun.com/ubuntu/ trusty universe

    deb http://mirrors.aliyun.com/ubuntu/ trusty-updates universe

    deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates universe

    deb http://mirrors.aliyun.com/ubuntu/ trusty multiverse

    deb-src http://mirrors.aliyun.com/ubuntu/ trusty multiverse

    deb http://mirrors.aliyun.com/ubuntu/ trusty-updates multiverse

    deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates multiverse

    deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse

    deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse

    deb http://mirrors.aliyun.com/ubuntu trusty-security main restricted

    deb-src http://mirrors.aliyun.com/ubuntu trusty-security main restricted

    deb http://mirrors.aliyun.com/ubuntu trusty-security universe

    deb-src http://mirrors.aliyun.com/ubuntu trusty-security universe

    deb http://mirrors.aliyun.com/ubuntu trusty-security multiverse

    deb-src http://mirrors.aliyun.com/ubuntu trusty-security multiverse

    # deb cdrom:[Ubuntu-Server 14.04 LTS _Trusty Tahr_ - Release amd64 (20140416.2)]/ trusty main restricted

    #deb cdrom:[Ubuntu-Server 14.04 LTS _Trusty Tahr_ - Release amd64 (20140416.2)]/ trusty main restricted

    4.3 编写shell脚本(配置许可)

    建议提前先解压一个tar包,用于确认目录和名称,

    当前目录下执行

    vi run.sh

    添加以下内容:

    # 初始化许可驱动

    cd /opt/supermap_iserver_8.1.1a_linux64_deploy/support/SuperMap_License/Support/aksusbd-2.4.1-i386

    ./dunst

    ./dinst

    echo

    # 运行iServer

    cd /opt/supermap_iserver_8.1.1a_linux64_deploy/bin

    ./catalina.sh run

    4.4编写iServer Dockerfile

    当前目录下执行

    vi Dockerfile

    添加以下内容:

    FROM ubuntu:14.04

    MAINTAINER zhangyongli

    ENV ISERVER_VERSION 8.1.1

    ENV iServer true

    # 国内的Ubuntu镜像源

    ADD sources.list_aliyun /etc/apt/sources.list

    # 安装iServer产品包

    ADD supermap_iserver_8.1.1a_linux64_deploy.tar.gz /opt/

    # 安装依赖库

    RUN cd /opt/supermap_iserver_8.1.1a_linux64_deploy/support &&

             ./dependencies_check_and_install.sh install -yu &&

             echo

            

    RUN apt-get update

    RUN cd /opt/supermap_iserver_8.1.1a_linux64_deploy/support/SuperMap_License/Support &&

           tar xvf aksusbd-2.4.1-i386.tar &&

           echo

    ADD run.sh /opt/

    RUN chmod 777 /opt/run.sh

    # Container启动时立即运行iServer

    CMD /opt/run.sh

    4.5 最终目录内容

     

    4.6 制作镜像

    docker build -t supermap/iserver:c811a .

    4.7 创建容器

    docker run --name iserver1 -p 8090:8090 -d supermap/iserver:c811a

    然后使用 IP:8090访问即可。

     

     (转发请注明出处:http://www.cnblogs.com/zhangyongli2011/ 如发现有错,请留言,谢谢)

  • 相关阅读:
    将博客搬至CSDN
    第一章 spring起步
    动态规划-最长非降子序列
    硬币问题-动态规划详解
    哲学家就餐
    java并发编程(十九)障碍器CyclicBarrier
    java并发编程(十八)阻塞队列和阻塞栈
    java并发编程(十七)Executor框架和线程池
    java并发编程(十七)内存操作总结
    java并发编程(十六)happen-before规则
  • 原文地址:https://www.cnblogs.com/zhangyongli2011/p/6723435.html
Copyright © 2020-2023  润新知